JAVA練習問題1-5:数字当てゲームを作ろう

記事内に商品プロモーションを含む場合があります

JAVAの初心者向け問題1-5:数字当てゲームを作ろう

この問題を解くために必要な知識:
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while

<<前の問題 問題集Top 次の問題>>

JAVA練習問題1-5_数字当てゲームを作ろう





簡単な「数字当てゲーム」を作成しましょう。

このゲームでは、コンピューターが1から100までのランダムな整数を生成し、ユーザーがその数字を当てるまで繰り返し入力します。

ユーザーが正しい数字を入力した場合、ゲームは終了し、試行回数を表示します。

この問題の要件

以下の要件に従ってプログラムを完成させてください。

  • Scannerクラスを使ってユーザーの入力を取得すること。
  • Randomクラスを使って1から100までのランダムな整数を生成すること。
  • ユーザーが正しい数字を当てるまで繰り返し処理を行うこと。
  • 入力された数字が正解よりも小さい場合は「もっと大きい数字です」と表示し、正解よりも大きい場合は「もっと小さい数字です」と表示すること。
  • ユーザーが正解した場合、試行回数と共に「正解です!」と表示すること。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

1から100までの数字を入力してください: 50
もっと大きい数字です。
1から100までの数字を入力してください: 75
もっと小さい数字です。
1から100までの数字を入力してください: 60
もっと小さい数字です。
1から100までの数字を入力してください: 55
正解です!試行回数: 4
ゲームを終了します。

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.import文
 1-1. Scannerクラスのインポート
 1-2. Randomクラスのインポート

2.NumberGuessingGameクラスの定義
 2-1. mainメソッドの定義
  2-1-1. Scannerオブジェクトの作成
  2-1-2. Randomオブジェクトの作成
  2-1-3. 1から100までのランダムな整数を生成するコード
  2-1-4. ユーザーの入力を格納する変数の初期化
  2-1-5. 試行回数を記録する変数の初期化
  2-1-6. whileループを使用してユーザーが正解を当てるまで繰り返すコード
   2-1-6-1. ユーザーに数字を入力させる
   2-1-6-2. 試行回数をカウント
   2-1-6-3. 入力された数字が正解かどうかを判定するコード
    2-1-6-3-1. 入力された数字が正解より小さい場合に「もっと大きい数字です」と表示する
    2-1-6-3-2. 入力された数字が正解より大きい場合に「もっと小さい数字です」と表示する
    2-1-6-3-3. 入力された数字が正解の場合に「正解です!」と試行回数と共に表示する
  2-1-7. スキャナーを閉じてリソースを解放するコード
  2-1-8. ゲームの終了メッセージを表示するコード

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

import java.util.Scanner;
import java.util.Random;

public class NumberGuessingGame {
    public static void main(String[] args) {
        // ***Scannerオブジェクトを作成し、標準入力を読み取るコードを書いてください。***
        
        // ***Randomオブジェクトを作成し、ランダムな数を生成するコードを書いてください。***
        
        // ***1から100までのランダムな整数を生成するコードを書いてください。***
        
        // ***ユーザーの入力を格納する変数を初期化するコードを書いてください。***
        
        // ***試行回数を記録する変数を初期化するコードを書いてください。***
        
        // ユーザーが正しい数字を当てるまで繰り返す
        while (userGuess != targetNumber) {
            // ***ユーザーに数字を入力してもらうコードを書いてください。***
            
            // ***試行回数をカウントするコードを書いてください。***
            
            // ***入力された数字が正解かどうかを判定するコードを書いてください。***
            if (userGuess < targetNumber) {
                // ***「もっと大きい数字です」と表示するコードを書いてください。***
            } else if (userGuess > targetNumber) {
                // ***「もっと小さい数字です」と表示するコードを書いてください。***
            } else {
                // ***「正解です!試行回数:」と表示するコードを書いてください。***
            }
        }
        
        // ***スキャナーを閉じてリソースを解放するコードを書いてください。***
        System.out.println("ゲームを終了します。");
    }
}

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

********************

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);
            }
        }
        
        // スキャナーを閉じてリソースを解放
        scanner.close();
        System.out.println("ゲームを終了します。");
    }
}

********************

コードの解説

Scannerオブジェクトの作成

Scanner scanner = new Scanner(System.in);

Scannerクラスは、ユーザーからの入力を読み取るために使用します。

このコードでは、System.inを使って標準入力(キーボードからの入力)を読み取るためにscannerオブジェクトを作成しています。

Randomオブジェクトの作成

Random random = new Random();

Randomクラスは、ランダムな数値を生成するために使用します。このプログラムでは、1から100までのランダムな整数を生成するためにrandomオブジェクトを使います。

1から100までのランダムな整数を生成

int targetNumber = random.nextInt(100) + 1;

nextInt(100)は0から99までのランダムな整数を生成しますが、+1をすることで1から100までの範囲に変えています。

このランダムな整数が、ユーザーが当てるべき「正解の数字」となります。

ユーザー入力と試行回数の初期化

int userGuess = 0;
int attemptCount = 0;

userGuess変数は、ユーザーが入力した予想の数字を格納するためのものです。

また、attemptCount変数は、ユーザーが何回試行したか(予想を入力した回数)を記録します。最初はどちらも0に初期化されています。

メインのゲームループ

while (userGuess != targetNumber) {

このwhileループは、ユーザーが正しい数字を入力するまで繰り返されます。

条件式userGuess != targetNumberは、ユーザーの入力した数字とtargetNumber(正解の数字)が異なる限りループを続けます。

ユーザーからの入力を受け取る

userGuess = scanner.nextInt();

scanner.nextInt()は、ユーザーが入力した整数を読み取り、userGuessに代入します。この入力された数字を元に、次の処理で正解かどうかを判断します。

試行回数のカウント

attemptCount++;

ユーザーが数字を入力するたびに、attemptCountを1増やして、何回試行したかを記録しています。

ユーザーの入力に応じたフィードバック

if (userGuess < targetNumber) {
    System.out.println("もっと大きい数字です。");
} else if (userGuess > targetNumber) {
    System.out.println("もっと小さい数字です。");
} else {
    System.out.println("正解です!試行回数: " + attemptCount);
}

この部分では、ユーザーが入力した数字が正解かどうかを判定します。

  • もしuserGuessが正解の数字より小さい場合、「もっと大きい数字です。」とフィードバックします。
  • 逆に、userGuessが正解の数字より大きい場合は、「もっと小さい数字です。」と表示します。
  • userGuessが正解の数字と一致した場合、「正解です!」と試行回数と共に表示され、ゲームが終了します。

ゲームの終了

scanner.close();
System.out.println("ゲームを終了します。");

scanner.close()で、Scannerオブジェクトを閉じてリソースを解放します。

その後、「ゲームを終了します。」と表示して、プログラムが終了します。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    JAVA練習問題集へ戻る
    トップページへ戻る