これはハングマンと呼ばれる、古くからあるゲームですね。(それこそパソコン黎明期どころか、原型はヴィクトリア朝の頃からともいわれます)
ある桁数の数(ただしこのプログラムでは使う数字は1~6)がランダムに決められます(ただし、同じ数字は2度以上出てこないようになっています)。プレーヤーが数を入力すると、
- 位置も数字も合っていれば「ヒット」
- 位置は合っていないが数字は合っている(使われている)なら「ブロー」
と表示します。
最終的に数が合えば(桁数分ヒットしてブローがないなら)終了です。
というのがゲームの流れです。それを踏まえたうえでコードを読みます。
Java
1for (int i = 0; i < answer.length; i++) {
2 boolean flag = false;
3 answer[i] = (int) (Math.random() * 6 + 1);
4 do {
5 flag = false;
6 for (int j = i - 1; j >= 0; j--) {
7 if (answer[i] == answer[j]) {
8 flag = true;
9 answer[i] = (int) (Math.random() * 6 + 1);
10 }
11 }
12 } while (flag == true);
13}
この部分は正解を作成しています。まずランダムな数列を作ったうえで、その数列上に重複する数が出てきていないか調べています(重複していたらそこを書き換えてチェックし直し)。
Java
1while (true) {
2 count++;
3 System.out.println("* "+count + "回目 *");
4 for (int i = 0; i < answer.length; i++) {
5 System.out.print( (i + 1) + "個目 : ");
6 try {
7 input[i] = Integer.parseInt(br.readLine());
8 } catch (NumberFormatException e) {
9 System.err.println("数値を入力してください");
10 i--;
11 } catch (IOException e) {
12 System.err.println("もう一度入力してください");
13 i--;
14 }
15 }
16 hit = 0;
17 blow = 0;
18 for (int i = 0; i < answer.length; i++) {
19 for (int j = 0; j < answer.length; j++) {
20 if (i == j && input[i] == answer[j]) {
21 hit++;
22 } else if (input[i] == answer[j]) {
23 blow++;
24 }
25 }
26 }
27 System.out.println("ヒット" + hit + " ブロー" + blow);
28 if (hit == 3) {
29 System.out.println("おめでとー");
30 break;
31 } else {
32 System.out.println();
33 }
34}
ここはプレーヤーからの答えの入力と、その判定です。桁数分だけ数値を入れていき(最初のfor文)、そのあとでヒット/ブローを数え上げて、結果を表示して、正解してなければ答えの入力を続けさせます。
さて、このコードは上の仕様を満たしていません。
まず、桁数が answer.length で決められているのですが、同時に「使用する数字は1~6で、重複できない」ので、最大桁数は6以下でないといけません(でないと永遠に答えを決定できない)
そして合否判定で「ヒット数が3」と、なぜか限定してしまっています。これだとanswer.lengthが3であればいいのですが、4以上なら完全正解でなくても正解になってしまいます(逆に完全正解だと正解とみなされない)し、2以下なら永遠に正解になりません。