10/19 課題問題

以下の簡単な数当てゲームで遊ぶためのプログラムを書きなさい.
  1. プログラムはまず1から10000までの隠した数(整数)を作成する
  2. 人はその数を推測してキーボードから入力する.
  3. プログラムは人が入力した数が,隠していた数と一致した時は, 何回目で成功したか答える.そうでない時は,隠した数よりも 大きい(HIGH)か小さい(LOW)を答える.
  4. 2から繰り返す.

作成プログラムの概要

プログラムを作成する前に,決めなくてはいけないことがいくつかある.ま ずは,どのようなユーザインタフェースを用意するかである.しかし,いまの ところGUI(Graphical User Interface)プログラムは想定していないので, CUI(Character User Interface)でキーボードからの入力で操作することにする.

また,繰り返しゲームをプレイするプログラムを作るか,1回だけゲームをプ レイするプログラムにするかが問題になる.プログラムの作成しやすさを考え て,1回だけゲームをプレイするプログラムにしてみよう.

ktanaka@ux102> java Kadai1019
Guess a number  入力を促す1行(メッセージは任意を表示) 
512  数字 
HIGH   メッセージは「HIGH」か「LOW」 
256
LOW
384
HIGH
320
HIGH
288
LOW
304
HIGH
296
LOW
300
8  回答に要した回数を表示 

プログラム全体の流れは以下のようになるはずである.

  1. 隠した数を乱数で生成する
  2. ユーザの入力を受け取る
  3. 正解と一致したら解答回数を表示して,プログラムを終了
  4. HIGHかLOWを表示
  5. 2に戻る.

プログラムは,まず1から10000までの数を乱数(計算機で扱う乱数のほとんどが 擬似乱数であり次の数が何になるかは式で決まっている)で作成する.Java言語では,
// Randomクラスを使うために必要
import java.util.*;
とした上で,
    // 1-10000までの乱数を作成
    int secret=(new Random()).nextInt(10000)+1;
のようにRandom クラスを使う.なお,一つのプログラムで何度も乱数を使う時は,
    // 乱数の元となるオブジェクトを作成
    Random r=new Random();
    // 1-1000までの乱数を作成
    int secret1=r.nextInt(1000)+1;
    // 1-100までの乱数を作成
    int secret2=r.nextInt(100)+1;
のようにすると良い. サンプルを示す.
// Randomクラスを使うために必要
import java.util.*;

class ShowRandom10000{
    public static void main(String[] args){
    // 乱数の元となるオブジェクトを作成
	Random r=new Random();
	for(int i=0;i<10;i++){
    // 1-10000までの乱数を作成
	    int secret=r.nextInt(10000)+1;
	    System.out.println("Secret Number is "+secret);
	}
    }
}

提出

プログラムが正しく動くことが分かったら, ことを確認の上で,センターのiMac端末かUnixサーバ上で
/home08/ktanaka/bin/report1019 1
を実行する.プログラムのコンパイル実行をチェックした上で,プログラムを コピーし,実行結果を記録する.なお,このプログラムを通っても正しくない プログラムはありうる.その場合は減点されることもある.


提出締切りは 11/2(火)の21時まで

ヒント

条件を満たす入力があるまで繰り返すというタイプの繰り返し文の例が少なかっ たので,下のプログラムをサンプルとして加える.
import java.io.*; // 入力に関するクラスを使う時は必要
class SumAll{
   // throws IOException で内部で入出力エラーが起きる可能性があることを示す
  public static void main(String[] args) throws IOException{
  // 入力をするためには,System.inからBufferedReaderを作らなくてはいけない
    BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
    int sum=0;
    // for文の初期化,終了条件,繰り返し部分を省略して書くこともできる
    // この場合は, break によって明示的に抜けないと無限の繰り返し
    // になる
    for(;;){
      // 1行読み込んで整数に変換する
      int num=Integer.parseInt(d.readLine());
      // 入力した数が負または0の時は抜ける。
      if(num<=0) break;
      sum=sum+num;
    }
    System.out.println(sum);
  }
}
これは,キーボード(標準入力)から数を読み込んでいって,負の数が出たら 抜けて,それまでの和を表示するプログラムである.

なお,入力をおこなうプログラムでは,BufferedReader型のオブジェクトは プログラムの最初で1度だけ作成して,それを使い続けるようにするように 書くのが良い.

import java.io.*; // 入力に関するクラスを使う時は必要
class SumAll{
   // throws IOException で内部で入出力エラーが起きる可能性があることを示す
  public static void main(String[] args) throws IOException{
  // 入力をするためには,System.inからBufferedReaderを作らなくてはいけない
    int sum=0;
    // for文の初期化,終了条件,繰り返し部分を省略して書くこともできる
    // この場合は, break によって明示的に抜けないと無限の繰り返し
    // になる
    for(;;){
      BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
      // 1行読み込んで整数に変換する
      int num=Integer.parseInt(d.readLine());
      // 入力した数が負または0の時は抜ける。
      if(num<=0) break;
      sum=sum+num;
    }
    System.out.println(sum);
  }
}
のように何度も作ると,キーボード以外からの入力の場合に正しく読み込めない可能性がある.

オプション課題

この課題ではもの足りない人は,このゲームの解答側のプログラムを作ってみると よいだろう.自信のある解答が書けたら,
ktanaka-cp1@lecture.ecc.u-tokyo.ac.jp
に送ると良い.良い ものは講義で紹介して,加点する.

なお,

class Option1019{
    public static void main(String[] args){
        for(int i=1;i<=10000;i++)
            System.out.println(i);
    }
}
というのは,冗談としては面白いが,解答としては認めない.