Javaプログラミング入門
数当てゲーム
最終更新:
javatutorial
-
view
1. 何を作るか
今回は、コンソール上で動く「数当てゲーム(High & Low)」を作ってみましょう!
ルールはとてもシンプルです。
コンピュータが裏で「1から100までの数字」を1つだけ決めます。
プレイヤー(あなた)は、その数字が何であるかを予想してキーボードから入力します。
もし外れたら、コンピュータは「もっと大きいよ」「もっと小さいよ」というヒントを出してくれます。
これを繰り返し、見事数字を当てることができたらゲームクリアです。
コンピュータが裏で「1から100までの数字」を1つだけ決めます。
プレイヤー(あなた)は、その数字が何であるかを予想してキーボードから入力します。
もし外れたら、コンピュータは「もっと大きいよ」「もっと小さいよ」というヒントを出してくれます。
これを繰り返し、見事数字を当てることができたらゲームクリアです。
このゲームを作る上で、プログラミングにおける3つの超重要テーマを学びます。
プレイヤーの入力が正しいか確認する「入力検証」、ヒントを出し分ける 条件分岐、そして正解するまで入力を待つ 繰り返し(ループ) です。
プレイヤーの入力が正しいか確認する「入力検証」、ヒントを出し分ける 条件分岐、そして正解するまで入力を待つ 繰り返し(ループ) です。

パズルを組み立てるように、少しずつプログラムを成長させていきましょう!
2. スモールステップでの実装
いきなり完成品を書こうとすると、どこで間違えたのか分からなくなってしまいます。
プログラムを作るときは、「小さく作って、動かして確認する」のが鉄則です。
プログラムを作るときは、「小さく作って、動かして確認する」のが鉄則です。
ステップ1:正解の数字を用意する
まずは、コンピュータに「1から100までのランダムな数字」を決めさせましょう。
乱数を作るには、以前学んだ Random を使います。
乱数を作るには、以前学んだ Random を使います。
- import java.util.Random;
-
- public class Main {
- // 1から100までの乱数を生成して変数answerに入れる
- int answer = random.nextInt(100) + 1;
-
- // テスト用:正解をこっそり表示してみる(後で消します)
- }
- }
【解説】
5行目:乱数を作るための準備(Randomのインスタンス化)をしています。
7行目:random.nextInt(100) は「0から99まで」の乱数を作ります。
そこに + 1 をすることで、「1から100まで」の範囲に調整しています。
この数字を変数 answer(正解)に保存しておきます。
5行目:乱数を作るための準備(Randomのインスタンス化)をしています。
7行目:random.nextInt(100) は「0から99まで」の乱数を作ります。
そこに + 1 をすることで、「1から100まで」の範囲に調整しています。
この数字を変数 answer(正解)に保存しておきます。
ステップ2:入力を受け付け、当たるまで繰り返す
次に、プレイヤーが数字を入力できるように Scanner を準備し、ゲームの骨組みとなる 繰り返し(ループ) を作ります。
当たるまで何度も入力を受け付けるため、while文を使います。
当たるまで何度も入力を受け付けるため、while文を使います。
- import java.util.Random;
- import java.util.Scanner;
-
- public class Main {
- int answer = random.nextInt(100) + 1;
-
-
- // 当たるまでずっと繰り返す無限ループ
- while (true) {
- int guess = scanner.nextInt();
-
- // まだ判定処理がないので、とりあえず1回でループを抜ける
- break;
- }
- }
- }
【解説】
9行目:キーボードからの入力を受け取るために Scanner を準備しています。
13行目:while (true) と書くことで、意図的に無限ループを作っています。「正解するまで終わらない」という仕組みを作るためです。
15行目:プレイヤーが入力した数字を変数 guess(予想)に保存します。
19行目:今はまだ永遠に入力を待ってしまう状態なので、動作確認のために break; を置いて1回で終わるようにしています。
9行目:キーボードからの入力を受け取るために Scanner を準備しています。
13行目:while (true) と書くことで、意図的に無限ループを作っています。「正解するまで終わらない」という仕組みを作るためです。
15行目:プレイヤーが入力した数字を変数 guess(予想)に保存します。
19行目:今はまだ永遠に入力を待ってしまう状態なので、動作確認のために break; を置いて1回で終わるようにしています。
ステップ3:ヒントを出す・入力を検証する
いよいよゲームの心臓部です。
プレイヤーが入力した guess(予想)と answer(正解)を比べて、条件分岐 でヒントを出します。
正解したときだけ break でループから抜け出すようにしましょう。
プレイヤーが入力した guess(予想)と answer(正解)を比べて、条件分岐 でヒントを出します。
正解したときだけ break でループから抜け出すようにしましょう。
- import java.util.Random;
- import java.util.Scanner;
-
- public class Main {
- int answer = random.nextInt(100) + 1;
-
-
- while (true) {
- int guess = scanner.nextInt();
-
- // 入力された数字と正解を比べる条件分岐
- if (guess == answer) {
- break; // 正解したのでループから抜け出す
- } else if (guess > answer) {
- } else {
- }
- }
-
- }
- }
【解説】
17行目〜19行目:if (guess == answer) で正解かどうかを判定します。
見事一致したら祝福のメッセージを出し、break で無限ループを抜け出してゲームクリアとなります。
20行目〜24行目:不正解だった場合、入力値が正解より大きければ「もっと小さい」、そうでなければ「もっと大きい」とヒントを出します。
条件分岐によってゲームらしくなりましたね!
17行目〜19行目:if (guess == answer) で正解かどうかを判定します。
見事一致したら祝福のメッセージを出し、break で無限ループを抜け出してゲームクリアとなります。
20行目〜24行目:不正解だった場合、入力値が正解より大きければ「もっと小さい」、そうでなければ「もっと大きい」とヒントを出します。
条件分岐によってゲームらしくなりましたね!
実行結果
1から100までの数字を当ててください!
予想した数字を入力: 50
ヒント: もっと大きい数字です。
予想した数字を入力: 75
ヒント: もっと小さい数字です。
予想した数字を入力: 62
大正解!おめでとうございます!
ゲームを終了します。 3. よくあるまちがいと注意点
💡注意! 無限ループの罠
while (true) を使った無限ループは強力ですが、ループから抜け出すための break; を書き忘れたり、条件を間違えたりすると、プログラムが永遠に終了しなくなります。
これを「無限ループ」と呼びます。
もし実行中にプログラムが止まらなくなったら、Eclipseなどの開発環境のコンソールにある赤い四角いボタン(停止ボタン)を押して強制終了させましょう。
while (true) を使った無限ループは強力ですが、ループから抜け出すための break; を書き忘れたり、条件を間違えたりすると、プログラムが永遠に終了しなくなります。
これを「無限ループ」と呼びます。
もし実行中にプログラムが止まらなくなったら、Eclipseなどの開発環境のコンソールにある赤い四角いボタン(停止ボタン)を押して強制終了させましょう。
💡注意! 入力検証の甘さ
今回のコードでは、「プレイヤーは必ず1〜100の数字を入力してくれる」という前提で書いています。
しかし、もしプレイヤーが「999」や「-50」を入力したらどうなるでしょうか?そのまま「もっと小さいです」と処理されてしまいますが、ゲームとしては「1〜100の範囲で入力してください」と警告を出したほうが親切ですよね。
また、数字ではなく「あいうえお」のような文字を入力されると、scanner.nextInt() が処理できず InputMismatchException というエラーが出てプログラムがクラッシュしてしまいます。
実際の現場では、こうした想定外の入力からプログラムを守る処理(例外処理や入力検証)がとても重要になります。
今回のコードでは、「プレイヤーは必ず1〜100の数字を入力してくれる」という前提で書いています。
しかし、もしプレイヤーが「999」や「-50」を入力したらどうなるでしょうか?そのまま「もっと小さいです」と処理されてしまいますが、ゲームとしては「1〜100の範囲で入力してください」と警告を出したほうが親切ですよね。
また、数字ではなく「あいうえお」のような文字を入力されると、scanner.nextInt() が処理できず InputMismatchException というエラーが出てプログラムがクラッシュしてしまいます。
実際の現場では、こうした想定外の入力からプログラムを守る処理(例外処理や入力検証)がとても重要になります。
コラム:効率のいい当て方と「二分探索」
数当てゲームをプレイするとき、あなたはどうやって数字を絞り込みますか?
適当に数字を言うのではなく、最初は「50」、次は「25」か「75」……というように 常に範囲の真ん中(半分)を狙っていく戦略 が一番効率が良いことに気づいたでしょうか。
この「半分ずつ範囲を絞り込んでいく方法」は、プログラミングの世界では 「二分探索(にぶんたんさく)」 と呼ばれる超有名なアルゴリズム(問題解決の手順)です。
適当に数字を言うのではなく、最初は「50」、次は「25」か「75」……というように 常に範囲の真ん中(半分)を狙っていく戦略 が一番効率が良いことに気づいたでしょうか。
この「半分ずつ範囲を絞り込んでいく方法」は、プログラミングの世界では 「二分探索(にぶんたんさく)」 と呼ばれる超有名なアルゴリズム(問題解決の手順)です。
| 二分探索のパワー | |
|---|---|
| 探索範囲 | 当てるまでの最大回数 |
| 1 〜 100 | わずか 7回 |
| 1 〜 1,000 | わずか 10回 |
| 1 〜 1,000,000 (100万) | わずか 20回 |
なんと、100万個の数字から正解を見つけるのも、たった20回の質問で絶対に当てることができるのです。
直感だと難しそうに見える問題も、数学と論理的思考を組み合わせることで劇的に効率化できます。
プログラミングの面白さは、こんなところにも隠されているんですね!
直感だと難しそうに見える問題も、数学と論理的思考を組み合わせることで劇的に効率化できます。
プログラミングの面白さは、こんなところにも隠されているんですね!









