【JAVA】確認問題2-☆2:数字当てゲームを作ろう

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

この記事の練習問題で使用する知識:
丸暗記構文入力と出力の基本コメントの書き方変数と定数算術演算子文字列の操作import文比較演算子と論理演算子if文による分岐処理while文による繰り返し処理

JAVAのゲームコード一覧はこちら

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

確認問題2-☆2:数字当てゲームを作ろう

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

このゲームではコンピューターが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("ゲームを終了します。");
    }
}

コードの解説

以下は、avaで作成された「数当てゲーム」のコードを初心者向けに解説したものです。

各ブロックの役割と使用している文法についても丁寧に説明します。

インポート文

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

ここではJavaの標準ライブラリから ScannerRandom クラスをインポートしています。

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 ループは、ユーザーが正しい数を当てるまで繰り返し実行されます。

userGuesstargetNumber と一致するとループを抜けます。

ユーザーに数を入力してもらう

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の文法を学ぶための良い練習問題です。

ScannerRandom クラスの使い方、変数の初期化、while ループ、条件分岐などの基本的な構造を理解することができます。

ぜひコードを試して実行し、少しずつ理解を深めていきましょう!

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

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

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

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






    JAVAテキスト&問題集へ戻る
    トップページへ戻る