コンピュータ基礎および演習II

演習問題(中級・上級)

解答は earth.mlab.im.dendai.ac.jp/home/submit/1I-Computer2/[初級の出題日]/[学籍番号] のディレクトリに提出しなさい。 ソースファイル (〜.java) のみを提出すること。

ファイルの送信には ftp ソフトを用いる。 Linux の gFTP を使った提出方法 (実験室のマニュアル) を参照すること。

なお、中級・上級問題は楽しめる範囲で取り組めばよい。

問題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 yamanesBottle = new PETBottle();
yamanesBottle.setVolume(500);
int yamanesDrinkRate = 10;

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

これを参考に山根と田中の2人が競争する場合のプログラムを考えること。

問題3

あなたは某RPG作成ソフトにハマり、もっと自由に機能を追加したいと思い、 自分で 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未満)を得ることができる。