Javaプログラミング基礎

演習問題 (中級〜上級)

解答は

に提出しなさい。ソースファイル (〜.java) のみを提出。 提出は gFTP 等の ftp ソフトを用いて行う。

問題1

現実世界の犬をプログラムとして書くことを考える。 犬には次のような属性と振る舞いがあるとする。

犬の鳴き声は年齢によって変化するものとし、 5歳未満であれば「キャンキャン」、 5歳以上であれば「ワンワン」、 10歳以上であれば「クンクン」と鳴くとする。

このような犬 (Dog) クラスを定義しなさい。 main メソッドのあるクラス名は DogPen とする。 よって、このプログラムのファイル名は DogPen.java となる。 プログラムの大枠は次のようになる。

class DogPen {
    public static void main(String[] args) {
        Dog pochi = new Dog();
        pochi.setName("ぽち");

        pochi.setYears(1);
        System.out.print(pochi.getYears() + "歳の" + pochi.getName() +
                           "が鳴いた: ");
        pochi.bark();

        pochi.setYears(6);
        System.out.print(pochi.getYears() + "歳の" + pochi.getName() +
                           "が鳴いた: ");
        pochi.bark();

        pochi.setYears(15);
        System.out.print(pochi.getYears() + "歳の" + pochi.getName() +
                           "が鳴いた: ");
        pochi.bark();
    }
}

class Dog {
     // ここにクラス Dog の定義を書く
}

問題2

前回のペットボトルの演習問題 で定義したクラス PETBottle を使い、 2 人がジュースの早飲み競争を行うプログラムを作成しなさい。 main メソッドのあるクラス名は DrinkCompetition とする。

このプログラムでは、 main メソッドで PETBottle のインスタンスを 2 つ作る。 それぞれについて、毎秒飲む速度を決め、 1,2,3,...,t 秒経過したときの残量を表示するようにする。 どちらかの残量が 0 になったら競争は終了である。 最後にどちらが勝ったかあるいは引き分けだったか表示すること。 なお、PETBottle クラスの内容は前回の演習の解答と同じにすること (変更してはいけない)。

ちなみに、1人 (虻川) がペットボトルを飲む様子は次のように プログラムで表すことができる。

PETBottle abukawasBottle = new PETBottle();
abukawasBottle.setVolume(500);
int abukawasDrinkRate = 10;

int second = 0;
while (abukawasBottle.getVolume() > 0) {
    System.out.println(second +"秒後の虻川のボトル残量: " + abukawasBottle.getVolume());
    abukawasBottle.drunk(abukawasDrinkRate);
    second++;
}
System.out.println("虻川は" + second + "秒で飲み干した");

これを参考に虻川と伊藤の2人が競争する場合のプログラムを考えること。

問題3

あなたはゲームプログラマを目指し、 自分で RPG のプログラムを作ることにした。

問題3-1

登場人物のクラスを設計するにあたり、登場人物の属性、 動作などを箇条書きにして書き出しなさい。 ファイル名は Charactor.txt とする。

属性の例

動作の例

上記の例を含め、2つ以上の属性、3つ以上の動作を取りあげること。

問題3-2

問題3-1 での分析を踏まえ、登場人物のクラスを記述し、 用意したメソッドを一通り実行するプログラムを作成しなさい。 ファイル名は RPG.java とする。 また、実行結果の例をファイルで提出しなさい。 ファイル名は RPG.txt とする。

登場人物のクラス名は Charactor とする。 オブジェクトの状態を表示する showStatus() というメソッドを用意し、 これを動作の前後で実行することにより状態の変化を表示するようにすること。

以下のテンプレートに追加する形で作成してもよい。

class RPG {
    public static void main(String[] args) {
        Charactor john = new Charactor();

        john.setHitPoint(1000);
        john.showStatus();
        john.walk(3);
        john.showStatus();
        john.sleep();
        john.showStatus();
    }
}

/** 登場人物のクラス */
class Charactor {
    /** 体力 */
    int hitPoint;
    /** 体力をセット */
    void setHitPoint(int hp) {
        hitPoint = hp;
    }
    /** 距離 distance を移動 */
    void walk(int distance) {
        System.out.println("Walking...(" + distance + ")");
        // 距離に比例して体力を消耗
    }
    /** 寝る */
    void sleep() {
        System.out.println("Sleeping...");
        // 睡眠をとると体力がある程度回復する
    }
    /** 状態表示 */
    void showStatus() {
        System.out.println("HitPoint: " + hitPoint);
    }
}

もし必要であれば、Math.random() により double の乱数(0.0以上1.0未満)を得ることができる。