アットウィキロゴ
Javaプログラミング入門
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

Javaプログラミング入門

数当てゲーム

最終更新:

javatutorial

- view
管理者のみ編集可

1. 何を作るか

今回は、コンソール上で動く「数当てゲーム(High & Low)」を作ってみましょう!

ルールはとてもシンプルです。
コンピュータが裏で「1から100までの数字」を1つだけ決めます。
プレイヤー(あなた)は、その数字が何であるかを予想してキーボードから入力します。
もし外れたら、コンピュータは「もっと大きいよ」「もっと小さいよ」というヒントを出してくれます。
これを繰り返し、見事数字を当てることができたらゲームクリアです。

このゲームを作る上で、プログラミングにおける3つの超重要テーマを学びます。
プレイヤーの入力が正しいか確認する「入力検証」、ヒントを出し分ける 条件分岐、そして正解するまで入力を待つ 繰り返し(ループ) です。


パズルを組み立てるように、少しずつプログラムを成長させていきましょう!

2. スモールステップでの実装


いきなり完成品を書こうとすると、どこで間違えたのか分からなくなってしまいます。
プログラムを作るときは、「小さく作って、動かして確認する」のが鉄則です。

ステップ1:正解の数字を用意する

まずは、コンピュータに「1から100までのランダムな数字」を決めさせましょう。
乱数を作るには、以前学んだ Random を使います。

  1. import java.util.Random;
  2.  
  3. public class Main {
  4. public static void main(String[] args) {
  5. Random random = new Random();
  6. // 1から100までの乱数を生成して変数answerに入れる
  7. int answer = random.nextInt(100) + 1;
  8.  
  9. System.out.println("1から100までの数字を決めました!");
  10. // テスト用:正解をこっそり表示してみる(後で消します)
  11. System.out.println("(こっそり正解:" + answer + ")");
  12. }
  13. }
【解説】
5行目:乱数を作るための準備(Randomのインスタンス化)をしています。
7行目:random.nextInt(100) は「0から99まで」の乱数を作ります。
そこに + 1 をすることで、「1から100まで」の範囲に調整しています。
この数字を変数 answer(正解)に保存しておきます。

ステップ2:入力を受け付け、当たるまで繰り返す

次に、プレイヤーが数字を入力できるように Scanner を準備し、ゲームの骨組みとなる 繰り返し(ループ) を作ります。
当たるまで何度も入力を受け付けるため、while文を使います。
  1. import java.util.Random;
  2. import java.util.Scanner;
  3.  
  4. public class Main {
  5. public static void main(String[] args) {
  6. Random random = new Random();
  7. int answer = random.nextInt(100) + 1;
  8.  
  9. Scanner scanner = new Scanner(System.in);
  10. System.out.println("1から100までの数字を当ててください!");
  11.  
  12. // 当たるまでずっと繰り返す無限ループ
  13. while (true) {
  14. System.out.print("予想した数字を入力してください: ");
  15. int guess = scanner.nextInt();
  16. System.out.println("あなたの入力: " + guess);
  17.  
  18. // まだ判定処理がないので、とりあえず1回でループを抜ける
  19. break;
  20. }
  21. }
  22. }
【解説】
9行目:キーボードからの入力を受け取るために Scanner を準備しています。
13行目:while (true) と書くことで、意図的に無限ループを作っています。「正解するまで終わらない」という仕組みを作るためです。
15行目:プレイヤーが入力した数字を変数 guess(予想)に保存します。
19行目:今はまだ永遠に入力を待ってしまう状態なので、動作確認のために break; を置いて1回で終わるようにしています。

ステップ3:ヒントを出す・入力を検証する

いよいよゲームの心臓部です。
プレイヤーが入力した guess(予想)と answer(正解)を比べて、条件分岐 でヒントを出します。
正解したときだけ break でループから抜け出すようにしましょう。
  1. import java.util.Random;
  2. import java.util.Scanner;
  3.  
  4. public class Main {
  5. public static void main(String[] args) {
  6. Random random = new Random();
  7. int answer = random.nextInt(100) + 1;
  8.  
  9. Scanner scanner = new Scanner(System.in);
  10. System.out.println("1から100までの数字を当ててください!");
  11.  
  12. while (true) {
  13. System.out.print("予想した数字を入力: ");
  14. int guess = scanner.nextInt();
  15.  
  16. // 入力された数字と正解を比べる条件分岐
  17. if (guess == answer) {
  18. System.out.println("大正解!おめでとうございます!");
  19. break; // 正解したのでループから抜け出す
  20. } else if (guess > answer) {
  21. System.out.println("ヒント: もっと小さい数字です。");
  22. } else {
  23. System.out.println("ヒント: もっと大きい数字です。");
  24. }
  25. }
  26.  
  27. System.out.println("ゲームを終了します。");
  28. }
  29. }
【解説】
17行目〜19行目:if (guess == answer) で正解かどうかを判定します。
見事一致したら祝福のメッセージを出し、break で無限ループを抜け出してゲームクリアとなります。
20行目〜24行目:不正解だった場合、入力値が正解より大きければ「もっと小さい」、そうでなければ「もっと大きい」とヒントを出します。
条件分岐によってゲームらしくなりましたね!

実行結果
1から100までの数字を当ててください!
予想した数字を入力: 50
ヒント: もっと大きい数字です。
予想した数字を入力: 75
ヒント: もっと小さい数字です。
予想した数字を入力: 62
大正解!おめでとうございます!
ゲームを終了します。 

3. よくあるまちがいと注意点

💡注意! 無限ループの罠
while (true) を使った無限ループは強力ですが、ループから抜け出すための break; を書き忘れたり、条件を間違えたりすると、プログラムが永遠に終了しなくなります。
これを「無限ループ」と呼びます。
もし実行中にプログラムが止まらなくなったら、Eclipseなどの開発環境のコンソールにある赤い四角いボタン(停止ボタン)を押して強制終了させましょう。

💡注意! 入力検証の甘さ
今回のコードでは、「プレイヤーは必ず1〜100の数字を入力してくれる」という前提で書いています。
しかし、もしプレイヤーが「999」や「-50」を入力したらどうなるでしょうか?そのまま「もっと小さいです」と処理されてしまいますが、ゲームとしては「1〜100の範囲で入力してください」と警告を出したほうが親切ですよね。
また、数字ではなく「あいうえお」のような文字を入力されると、scanner.nextInt() が処理できず InputMismatchException というエラーが出てプログラムがクラッシュしてしまいます。
実際の現場では、こうした想定外の入力からプログラムを守る処理(例外処理や入力検証)がとても重要になります。

コラム:効率のいい当て方と「二分探索」

数当てゲームをプレイするとき、あなたはどうやって数字を絞り込みますか?
適当に数字を言うのではなく、最初は「50」、次は「25」か「75」……というように 常に範囲の真ん中(半分)を狙っていく戦略 が一番効率が良いことに気づいたでしょうか。
この「半分ずつ範囲を絞り込んでいく方法」は、プログラミングの世界では 「二分探索(にぶんたんさく)」 と呼ばれる超有名なアルゴリズム(問題解決の手順)です。
二分探索のパワー
探索範囲 当てるまでの最大回数
1 〜 100 わずか 7回
1 〜 1,000 わずか 10回
1 〜 1,000,000 (100万) わずか 20回
なんと、100万個の数字から正解を見つけるのも、たった20回の質問で絶対に当てることができるのです。
直感だと難しそうに見える問題も、数学と論理的思考を組み合わせることで劇的に効率化できます。
プログラミングの面白さは、こんなところにも隠されているんですね!

最近更新されたスレッド
人気記事ランキング
ウィキ募集バナー