【Java】レッスン2-☆2:数字当てゲームの作り方|ScannerとRandomで遊びながら学ぼう

一つ前のページではハイアンドロー ゲームについて学習しました。
今回は 数字当てゲーム について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
・Lesson2-1:比較演算子と論理演算子を理解しよう
・Lesson2-2:if文による分岐処理を理解しよう
・Lesson2-3:switch文による分岐処理を理解しよう
・Lesson2-4:for文による繰り返し処理を理解しよう
・Lesson2-5:while文による繰り返し処理を理解しよう
・Lesson2-6:繰り返しを制御しよう
・Lesson2-7:配列を理解しよう
・Lesson2-8:エラーメッセージを読めるようになろう
・Lesson2-9:例外処理を理解しよう
・確認問題2-☆1:ハイアンドロー ゲームを作ろう
・確認問題2-☆2:数字当てゲームを作ろう ◁今回はココ
・確認問題2-☆3:じゃんけんゲームを作ろう
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:クラス編
練習問題|数字当てゲームで繰り返し処理と条件分岐を実装しよう

簡単な「数字当てゲーム」を作成しましょう。
このゲームではコンピューターが1から100までのランダムな整数を生成し、ユーザーがその数字を当てるまで繰り返し入力します。
ユーザーが正しい数字を入力した場合はゲームは終了し、試行回数を表示します。
この問題の要件
以下の要件に従ってコードを完成させてください。
Scanner
クラスを使ってユーザーの入力を取得すること。Random
クラスを使って1から100までのランダムな整数を生成すること。- ユーザーが正しい数字を当てるまで繰り返し処理を行うこと。
- 入力された数字が正解よりも小さい場合は「もっと大きい数字です」と表示し、正解よりも大きい場合は「もっと小さい数字です」と表示すること。
- ユーザーが正解した場合、試行回数と共に「正解です!」と表示すること。
ただし、以下のような実行結果となること。
1から100までの数字を入力してください: 50 もっと大きい数字です。 1から100までの数字を入力してください: 75 もっと小さい数字です。 1から100までの数字を入力してください: 60 もっと小さい数字です。 1から100までの数字を入力してください: 55 正解です!試行回数: 4 ゲームを終了します。
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1:ScannerクラスとRandomクラスをインポート
2:NumberGuessingGameクラスの定義
□ mainメソッドの定義
□ □ Scannerオブジェクトscannerの初期化
□ □ Randomオブジェクトrandomの初期化
□ □ 変数targetNumberに1から100までのランダムな整数を代入
□ □ 変数userGuessを0で初期化
□ □ 変数attemptCountを0で初期化
□ □ whileループでuserGuessがtargetNumberと一致するまで繰り返す
□ □ □ 「1から100までの数字を入力してください: 」と出力
□ □ □ ユーザーの入力を整数として読み取り、変数userGuessに代入
□ □ □ attemptCountに1を加算
□ □ □ if文でuserGuessがtargetNumberより小さいか判定
□ □ □ □ 真の場合、「もっと大きい数字です。」と出力
□ □ □ else if文でuserGuessがtargetNumberより大きいか判定
□ □ □ □ 真の場合、「もっと小さい数字です。」と出力
□ □ □ else
□ □ □ □ 正解の場合、「正解です!試行回数: 」とattemptCountを出力
□ □ 「ゲームを終了します。」と出力
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
import java.util.Scanner; import java.util.Random; public class NumberGuessingGame { public static void main(String[] args) { // Scannerオブジェクトを作成し、標準入力を読み取る /*【穴埋め問題1】 ここでScannerオブジェクトを作成し、標準入力を読み取るコードを書いてください。 */ // Randomオブジェクトを作成し、ランダムな数を生成する /*【穴埋め問題2】 ここでRandomオブジェクトを作成し、ランダムな数を生成するコードを書いてください。 */ // 1から100までのランダムな整数を生成 /*【穴埋め問題3】 ここで1から100までのランダムな整数を生成し、変数targetNumberに代入するコードを書いてください。 */ // ユーザーの入力を格納する変数を初期化 /*【穴埋め問題4】 ここでユーザーの入力を格納する変数userGuessを0で初期化してください。 */ // 試行回数を記録する変数を初期化 /*【穴埋め問題5】 ここで試行回数を記録する変数attemptCountを0で初期化してください。 */ // ユーザーが正しい数字を当てるまで繰り返す while (userGuess != targetNumber) { // ユーザーに数字を入力してもらう /*【穴埋め問題6】 ここでユーザーに1から100までの数字を入力してもらうメッセージを表示し、userGuessに読み取るコードを書いてください。 */ // 試行回数をカウント /*【穴埋め問題7】 ここでattemptCountを1増やすコードを書いてください。 */ // 入力された数字が正解かどうかを判定 if (userGuess < targetNumber) { /*【穴埋め問題8】 ここで「もっと大きい数字です。」と出力するコードを書いてください。 */ } else if (userGuess > targetNumber) { /*【穴埋め問題9】 ここで「もっと小さい数字です。」と出力するコードを書いてください。 */ } else { /*【穴埋め問題10】 ここで「正解です!試行回数: 」とattemptCountを出力するコードを書いてください。 */ } } /*【穴埋め問題11】 ここで「ゲームを終了します。」と出力するコードを書いてください。 */ } }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
練習問題の解答と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
import java.util.Scanner; import java.util.Random; public class NumberGuessingGame { public static void main(String[] args) { // Scannerオブジェクトを作成し、標準入力を読み取る Scanner scanner = new Scanner(System.in); // Randomオブジェクトを作成し、ランダムな数を生成する Random random = new Random(); // 1から100までのランダムな整数を生成 int targetNumber = random.nextInt(100) + 1; // ユーザーの入力を格納する変数を初期化 int userGuess = 0; // 試行回数を記録する変数を初期化 int attemptCount = 0; // ユーザーが正しい数字を当てるまで繰り返す while (userGuess != targetNumber) { // ユーザーに数字を入力してもらう System.out.print("1から100までの数字を入力してください: "); userGuess = scanner.nextInt(); // 試行回数をカウント attemptCount++; // 入力された数字が正解かどうかを判定 if (userGuess < targetNumber) { System.out.println("もっと大きい数字です。"); } else if (userGuess > targetNumber) { System.out.println("もっと小さい数字です。"); } else { System.out.println("正解です!試行回数: " + attemptCount); } } System.out.println("ゲームを終了します。"); } }
- 正解コードの解説
-
コードをブロックごとに分割して解説します。
インポート文
import java.util.Scanner; import java.util.Random;
ここではJavaの標準ライブラリから
Scanner
とRandom
クラスをインポートしています。Scanner
クラスはユーザーからの入力を読み取るために、Random
クラスは乱数を生成するために使用します。クラス定義とメインメソッドの宣言
public class NumberGuessingGame { public static void main(String[] args) {
ここで
NumberGuessingGame
クラスを定義しています。main
メソッドはプログラムのエントリーポイントであり、Javaアプリケーションはmain
メソッドから実行が始まります。ユーザー入力の準備
Scanner scanner = new Scanner(System.in);
このコードで
Scanner
オブジェクトを作成し、標準入力(キーボード入力)を受け取る準備をしています。ユーザーが入力した内容を取得する際にこのオブジェクトを使用します。
ランダムな数の生成
Random random = new Random(); int targetNumber = random.nextInt(100) + 1;
Random
オブジェクトを用いて1から100までのランダムな整数を生成し、それをtargetNumber
変数に代入します。この数はユーザーが当てるべき数として使用されます。
変数の初期化
int userGuess = 0; int attemptCount = 0;
userGuess
はユーザーの入力値を格納する変数で、attemptCount
はユーザーが数を当てるまでにかかる試行回数を記録する変数です。どちらも
int
型(整数)で初期化しています。数を当てるまでのループ処理
while (userGuess != targetNumber) {
この
while
ループは、ユーザーが正しい数を当てるまで繰り返し実行されます。userGuess
がtargetNumber
と一致するとループを抜けます。ユーザーに数を入力してもらう
System.out.print("1から100までの数字を入力してください: "); userGuess = scanner.nextInt();
System.out.print
によりユーザーに1から100までの数を入力するよう促します。次に
scanner.nextInt()
を用いて入力された整数をuserGuess
に格納します。試行回数のカウント
attemptCount++;
ここで
attemptCount
の値を1増やしています。これによりユーザーが何回目の試行で正解したかを記録できます。入力された数の判定とメッセージ表示
if (userGuess < targetNumber) { System.out.println("もっと大きい数字です。"); } else if (userGuess > targetNumber) { System.out.println("もっと小さい数字です。"); } else { System.out.println("正解です!試行回数: " + attemptCount); }
if
文でユーザーが入力した数と正解の数を比較しています。userGuess < targetNumber
の場合は「もっと大きい数字です。」と表示。userGuess > targetNumber
の場合は「もっと小さい数字です。」と表示。- 両方の条件に当てはまらない場合(
userGuess == targetNumber
)には、「正解です!」とメッセージが表示され、試行回数も一緒に表示されます。
ゲーム終了のメッセージ
System.out.println("ゲームを終了します。");
ループを抜けるとゲームが終了するメッセージが表示されます。
これによりゲームが完了したことがユーザーに伝わります。
まとめ
今回の「数当てゲーム」のプログラムは基本的なJavaの文法を学ぶための良い練習問題です。
Scanner
や Random
クラスの使い方、変数の初期化、while
ループ、条件分岐などの基本的な構造を理解することができます。
ぜひコードを試して実行し、少しずつ理解を深めていきましょう!