JAVAの初心者向け問題2-☆1:数字当てゲームを作ろう Part2
この問題を解くために必要な知識:
【レベル1の知識】
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力(Scannerクラス)、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while)
【レベル2の知識】
メソッドの定義と呼び出し、メソッドの戻り値、メソッドのオーバーロード、例外処理(try-catch文、throws、throw)、クラスの定義と使用、インスタンス、コンストラクタ
<<前の問題 | 問題集Top |
次の問題>> |
JAVA練習問題2-☆1:数字当てゲームを作ろう Part2
簡単な「数字当てゲーム Part2」を作成しましょう。
このゲームでは、コンピューターが1から100までのランダムな整数を生成し、ユーザーがその数字を当てるまで繰り返し入力します。
ユーザーが正しい数字を入力した場合、ゲームは終了し、試行回数を表示します。
この問題の要件
以下の要件に従ってプログラムを作成してください。
- ゲームのルール:
- プログラムは1から100までのランダムな整数を生成します。
- ユーザーはその数字を当てるために何度でも予想を入力することができます。
- 各予想の後、プログラムはその予想が正解よりも「高い」か「低い」かをユーザーに教えます。
- ユーザーが正解を当てたら、試行回数を表示してゲームを終了します。
- プログラムの仕様:
- ランダムな数字を生成するには、
Math.random()
メソッドを使用します。 - ユーザーの入力には
Scanner
クラスを使用します。 - 繰り返し処理には
while
ループを使用します。 - 必要な箇所で
if
文を使って条件をチェックします。 - 例外処理を使って、ユーザーの入力が数字でない場合にエラーメッセージを表示し、再入力を促します。
- ランダムな数字を生成するには、
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
数字当てゲームへようこそ! 1から100までの数字を当ててください。 数字を入力してください: 50 もっと大きい数字です。 数字を入力してください: 75 もっと小さい数字です。 数字を入力してください: 63 おめでとうございます!3回で正解しました。
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.import文
1-1. Scannerクラスのインポート
2.NumberGuessingGameクラスの定義
3.mainメソッドの定義
3-1. 1から100までのランダムな整数を生成
3-1-1. Math.random()メソッドを使用してランダムな数値を生成し、それを整数に変換して1を加える
3-2. Scannerオブジェクトの作成
3-3. ユーザーの予想を格納する変数の初期化(guess = 0)
3-4. 予想の回数をカウントする変数の初期化(attempts = 0)
3-5. ゲーム開始のメッセージを表示
4.whileループでゲームを実行
4-1. ユーザーの入力を促すメッセージを表示
4-2. tryブロックを使用してユーザーの入力を取得
4-2-1. guess変数にユーザーの入力を格納
4-2-2. 予想の回数をインクリメント
4-2-3. if文を使用して予想が正解かどうかを判定
4-2-3-1. 予想が目標の数値より小さい場合、「もっと大きい数字です。」と表示
4-2-3-2. 予想が目標の数値より大きい場合、「もっと小さい数字です。」と表示
4-2-3-3. 予想が正解の場合、おめでとうのメッセージと試行回数を表示
4-3. catchブロックを使用して無効な入力を処理
4-3-1. 無効な入力があった場合にエラーメッセージを表示
4-3-2. 無効な入力をクリアするためにscanner.next()を使用
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
import java.util.Scanner; public class NumberGuessingGame { public static void main(String[] args) { // 1から100までのランダムな整数を生成する int targetNumber = (int)(Math.random() * 100) + 1; Scanner scanner = new Scanner(System.in); int guess = 0; // ユーザーの予想を格納する変数 int attempts = 0; // 予想の回数を数える変数 System.out.println("数字当てゲームへようこそ!"); System.out.println("1から100までの数字を当ててください。"); // ユーザーが正解を当てるまで繰り返す while (guess != targetNumber) { System.out.print("数字を入力してください: "); try { // ***このコメントを消して、ユーザーの入力を読み取るコードを書いてください。*** // ***このコメントを消して、予想の回数をカウントするコードを書いてください。*** // ユーザーの予想が正解かどうかをチェックする if (guess < targetNumber) { System.out.println("もっと大きい数字です。"); } else if (guess > targetNumber) { System.out.println("もっと小さい数字です。"); } else { // ***このコメントを消して、正解時のメッセージを表示するコードを書いてください。*** } } catch (Exception e) { // 入力が数字でない場合のエラーメッセージを表示 System.out.println("無効な入力です。数字を入力してください。"); scanner.next(); // 無効な入力をクリア } } } }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
import java.util.Scanner; public class NumberGuessingGame { public static void main(String[] args) { // 1から100までのランダムな整数を生成する int targetNumber = (int)(Math.random() * 100) + 1; Scanner scanner = new Scanner(System.in); int guess = 0; // ユーザーの予想を格納する変数 int attempts = 0; // 予想の回数を数える変数 System.out.println("数字当てゲームへようこそ!"); System.out.println("1から100までの数字を当ててください。"); // ユーザーが正解を当てるまで繰り返す while (guess != targetNumber) { System.out.print("数字を入力してください: "); try { guess = scanner.nextInt(); // ユーザーの入力を読み取る attempts++; // 予想の回数をカウントする // ユーザーの予想が正解かどうかをチェックする if (guess < targetNumber) { System.out.println("もっと大きい数字です。"); } else if (guess > targetNumber) { System.out.println("もっと小さい数字です。"); } else { System.out.println("おめでとうございます!" + attempts + "回で正解しました。"); } } catch (Exception e) { // 入力が数字でない場合のエラーメッセージを表示 System.out.println("無効な入力です。数字を入力してください。"); scanner.next(); // 無効な入力をクリア } } } }
********************
コードの解説
このJavaプログラムは「数字当てゲーム」を実行するもので、プレイヤーは1から100の間でランダムに生成された数字を予想し、正解するまで繰り返します。
各部分を解説していきます。
import java.util.Scanner;
この部分は、ユーザーからの入力を受け取るためのScanner
クラスをインポートしています。
Scanner
クラスを使うと、コンソールからユーザーの入力を読み取ることができます。
public class NumberGuessingGame {
Javaのプログラムはすべてクラスで囲まれます。ここではNumberGuessingGame
というクラス名が指定されています。
このクラスの中にゲームのロジックが記述されます。
public static void main(String[] args) {
main
メソッドはJavaプログラムのエントリーポイントです。
このメソッドの中に、プログラムの実行時に最初に行う処理が書かれます。
int targetNumber = (int)(Math.random() * 100) + 1;
Math.random()
は0以上1未満のランダムな小数を生成します。
それに100を掛けて1から100までの範囲のランダムな整数を作成します。
最終的にこのtargetNumber
がユーザーに当ててもらう数字になります。
Scanner scanner = new Scanner(System.in);
Scanner
クラスを使って、コンソールからユーザーの入力を受け取る準備をしています。
System.in
はコンソール入力を指します。
int guess = 0;
ユーザーが予想した数字を格納するための変数guess
を初期化します。
最初は0に設定していますが、ユーザーが入力すると値が更新されます。
int attempts = 0;
この変数attempts
は、ユーザーが何回予想したかを数えるためのカウンターです。
ゲームの最後に、この変数を使って何回で正解したかを表示します。
while (guess != targetNumber) {
while
ループは、ユーザーの予想が正解するまで繰り返されます。
guess
がtargetNumber
と一致するまで続きます。
System.out.print("数字を入力してください: ");
ユーザーに数字を入力してもらうようにメッセージを表示しています。
try { guess = scanner.nextInt(); }
ここでは、ユーザーが入力した数字を読み取って、guess
変数に格納します。
nextInt()
メソッドは整数を入力として受け取ります。
if (guess < targetNumber) {
if
文を使って、ユーザーの予想が正解より小さいか、大きいかを確認します。
もし予想が小さければ、「もっと大きい数字です」とメッセージを表示します。
else if (guess > targetNumber) {
逆に、ユーザーの予想が正解より大きい場合は「もっと小さい数字です」とメッセージが表示されます。
else { ... }
ユーザーの予想が正解だった場合、このelse
ブロックが実行されます。予想回数とともに「おめでとうございます!」とメッセージが表示され、ゲームが終了します。
catch (Exception e) {
もしユーザーが数字以外の無効な入力を行った場合、catch
ブロックでエラーが処理されます。
この場合「無効な入力です」とメッセージが表示され、再度入力が求められます。
scanner.next();
無効な入力をクリアし、次の入力に備えるために使用されます。
まとめ
このプログラムは、ユーザーがランダムな数字を当てるまで繰り返し予想するというシンプルなゲームです。
エラーハンドリングを含む構造が含まれており、入力が無効であってもプログラムがクラッシュせずに続行できる仕組みが実装されています。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。