■小テスト類似問題 - 1

 シューティングゲームを作成するために,ゲームに登場する「飛行機」を表す Ship というクラスを考えたい。
このShip型のオブジェクトには,画面上でのXY座標とライフを表す変数が必要なはずである。
また,生成したShip型オブジェクトの総数を把握したいとする。
このShipクラスを次の手順で定義せよ。

 ●名前が Ship のクラス定義を書く。
 ● Shipクラスの定義の中に,次の様なメンバ(フィールド・メソッド・コンストラクタ)を定義せよ。
  ・生成された Ship型オブジェクトの総数を表す static な int 型フィールド numOfShip
  ・各Ship型オブジェクトの2次元座標を表す int 型フィールド x, y
  ・各Ship型オブジェクトのライフを表す int 型フィールド life (初期値0を指定して宣言すること)
  ・コンストラクタその1
    (1) X座標・Y座標を int 型の仮引数 x, y で受け取り,それらの値でフィールド x, y を初期化する。また,numOfShip の値を1増やす。
  ・コンストラクタその2
    (1) X座標・Y座標・ライフを int 型の仮引数 x, y, life で受け取る。
    (2) 「コンストラクタその1」を呼び出して仮引数 x, y の値を渡して,フィールド x, y を初期化する。
    (3) 仮引数 life の値をフィールド life に代入して初期化する。
  ・Ship型オブジェクトの座標を変更するメソッド move() 。
    (1) 返値型 void で,int型の仮引数 dx, dy を持つ。
    (2) フィールド x の値を dx だけ変化させる( x = x + dx; )。
    (3) フィールド y の値を dy だけ変化させる( y = y + dy; )。
  ・フィールド x, y, life の値を表示する以下の定義のメソッド print()。

    void print( ) {
        System.out.println( "x 座標は " + x + ", y座標は " + y + ", ライフは " + life );
    }
  ・次の様な処理を行う main メソッド。
     まず,自機に関する処理として次の(1)〜(4)を行う。
    (1) 自機を表す Ship 型オブジェクト myShip を生成する。その際,「コンストラクタその2」を呼び出して X座標・Y座標・ライフをそれぞれ 10, 10, 20 に初期化すること。
    (2) Ship 型オブジェクト myShip の move( ) メソッドを呼び出し,myShip オブジェクトの座標をX方向に -5, Y座標をY方向に 5 だけ進める。
    (3) Ship 型オブジェクト myShip の print( ) メソッドを呼び出し,myShip オブジェクトの座標とライフを表示する。
    (4) Shipクラスの numOfShip の値を表示して,現時点で生成されている Ship 型オブジェクトの総数を表示する。
     同様に, 敵機に関する処理として次の(5)〜(8)を行う。
    (5) 敵機を表す Ship 型オブジェクト enemyShip を生成する。その際,「コンストラクタその2」を呼び出して X座標・Y座標・ライフをそれぞれ 20, 30, 50 に初期化すること。
    (6) Ship 型オブジェクト enemyShip の move( ) メソッドを呼び出し,enemyShip オブジェクトの座標をX方向に 2, Y座標をY方向に 3 だけ進める。
    (7) Ship 型オブジェクト enemyShip の print( ) メソッドを呼び出し,enemyShip オブジェクトの座標とライフを表示する。
    (8) Shipクラスの numOfShip の値を表示して,現時点で生成されている Ship 型オブジェクトの総数を表示する。


解答例:

class Ship {
 
    static int numOfShip = 0; // 生成された Ship 型オブジェクトの総数を表す static フィールド
 
    int x, y;                 // 座標
    int life = 0;             // ライフ
 
    Ship( int x, int y ) {    // コンストラクタその1。座標を初期化し,numOfShip の値を1増やす。
        this.x = x; this.y = y;
        numOfShip++;
    }
 
    Ship( int x, int y, int life ) {  // コンストラクタその2。コンストラクタ1を呼び出して座標を初期化し,ライフも初期化する。
        this( x, y );  // 他のコンストラクタを this() として呼び出せる。ここでは,「コンストラクタその1」を呼び出している。
        this.life = life;
    }
 
    void move( int dx, int dy ) {    // 移動するメソッド move( )
        x = x + dx; y = y + dy;
    }
 
    void print( ) {  // この Ship型オブジェクトの座標とライフを表示するメソッド print( )
        System.out.println( "x 座標は " + x + ", y座標は " + y + ", ライフは " + life );
    }
 
    public static void main( String args[] ) {
 
        Ship myShip = new Ship( 10, 10, 20 );    // (1)
        myShip.move( -5, 5 );                    // (2)
        myShip.print();                          // (3)
        System.out.println( "今まで生成された Ship 型オブジェクトの総数は " + Ship.numOfShip ); // (4)
 
        Ship enemyShip = new Ship( 20, 30, 50 ); // (5)
        enemyShip.move( 2, 3 );                  // (6)
        enemyShip.print();                       // (7)
        System.out.println( "今まで生成された Ship 型オブジェクトの総数は " + Ship.numOfShip ); // (8)
 
    }
}
実行結果の表示:
x 座標は 5, y座標は 15, ライフは 20
今まで生成された Ship 型オブジェクトの総数は 1
x 座標は 22, y座標は 33, ライフは 50
今まで生成された Ship 型オブジェクトの総数は 2