JAVAの初心者向け問題1-☆2:丁半賭博ゲーム
この問題を解くために必要な知識:
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while)
<<前の問題 | 問題集Top |
次の問題>> |
JAVA練習問題1-☆2_丁半賭博ゲーム
簡単な「丁半賭博」ゲームを作成しましょう。
丁半賭博ゲームはコンピュータがサイコロを2つ振り、出た目の合計が偶数か奇数かをユーザーが予想します。予想が当たると賭け金が2倍になり、外れると賭け金が失われます。
ゲームを繰り返すごとに所持金が変動し、ユーザーが続けたい限りゲームは繰り返されます。
この問題の要件
以下の要件に従ってプログラムを作成してください。
- ユーザーは最初に100円を持っている。
- ゲーム開始時に持っているお金の中から任意の金額を賭けることができる。
- ユーザーが「丁(偶数)」か「半(奇数)」を予想する。
- コンピューターがサイコロを2つ振ってその合計を計算する。
- サイコロの合計が偶数か奇数かを判定し、ユーザーの予想と比較して結果を表示する。
- 勝ったら賭けた金額が2倍になって返ってくる。負けたら賭けた金額がなくなる。
- 勝負の後にもう一度勝負するか質問し、する場合は繰り返す。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
あなたの所持金: 100円 賭け金を入力してください: 50 丁(偶数)か半(奇数)を予想してください(丁: 0, 半: 1): 1 サイコロの結果: 3 と 4 合計: 7 当たり!賭け金が2倍になりました。 もう一度プレイしますか?(はい: 0, いいえ: 1): 0 あなたの所持金: 150円 賭け金を入力してください: 100 丁(偶数)か半(奇数)を予想してください(丁: 0, 半: 1): 0 サイコロの結果: 2 と 5 合計: 7 ハズレ。賭け金を失いました。 もう一度プレイしますか?(はい: 0, いいえ: 1): 1 ゲームを終了します。
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.import文
1-1. Scannerクラスのインポート
1-2. Randomクラスのインポート
2.ChoHanGameクラスの定義
2-1. mainメソッドの定義
2-1-1. Scannerオブジェクトの作成と標準入力の読み取り
2-1-2. Randomオブジェクトの作成とランダムな数の生成
2-1-3. ユーザーの所持金の初期化(userMoney)
2-1-4. ゲームの繰り返しを制御するフラグの初期化(playAgain)
2-1-5. ゲームのメインループ(whileループ)
2-1-5-1. ユーザーの所持金の表示
2-1-5-2. 賭け金の入力ループ
2-1-5-2-1. 賭け金の入力
2-1-5-2-2. 賭け金の有効性チェック
2-1-5-3. ユーザーの予想入力
2-1-5-4. サイコロを2回振り、その合計を計算
2-1-5-5. サイコロの結果を表示
2-1-5-6. サイコロの合計が偶数か奇数かを判定
2-1-5-7. ユーザーの予想を判定し、結果を表示
2-1-5-7-1. 当たりの場合の処理(賭け金が2倍)
2-1-5-7-2. ハズレの場合の処理(賭け金を失う)
2-1-5-8. もう一度プレイするかどうかの確認
2-1-5-8-1. プレイ続行の判断
2-1-6. 所持金が無くなった場合のメッセージ表示
2-1-7. ゲーム終了のメッセージ表示
2-1-8. Scannerオブジェクトの閉じる処理
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
import java.util.Scanner; import java.util.Random; public class ChoHanGame { public static void main(String[] args) { // Scannerオブジェクトを作成し、標準入力を読み取る Scanner scanner = new Scanner(System.in); // Randomオブジェクトを作成し、ランダムな数を生成する Random random = new Random(); // ユーザーの所持金を初期化 int userMoney = 100; // ゲームの繰り返しを制御するフラグを初期化 boolean playAgain = true; // ユーザーがプレイを希望する限りゲームを繰り返す while (playAgain && userMoney > 0) { // ユーザーの所持金を表示 System.out.println("あなたの所持金: " + userMoney + "円"); // 賭け金を入力してもらう int bet = 0; while (true) { System.out.print("賭け金を入力してください: "); /* ***ここにscannerを使用して賭け金を入力するコードを書いてください*** */ if (bet > 0 && bet <= userMoney) { break; // 有効な賭け金が入力された場合ループを抜ける } else { System.out.println("無効な賭け金です。もう一度入力してください。"); } } // ユーザーに「丁」か「半」を予想してもらう System.out.print("丁(偶数)か半(奇数)を予想してください(丁: 0, 半: 1): "); int userGuess = /* ***ここにscannerを使用してユーザーの予想を入力するコードを書いてください*** */; // サイコロを2回振り、その合計を計算する int dice1 = random.nextInt(6) + 1; // 1から6のランダムな整数を生成 int dice2 = random.nextInt(6) + 1; // 1から6のランダムな整数を生成 int sum = dice1 + dice2; // サイコロの合計 // サイコロの結果を表示 System.out.println("サイコロの結果: " + dice1 + " と " + dice2); System.out.println("合計: " + sum); // サイコロの合計が偶数か奇数かを判定 boolean isEven = /* ***ここにサイコロの合計が偶数か奇数かを判定するコードを書いてください*** */; // ユーザーの予想を判定し、結果を表示 if ((isEven && userGuess == 0) || (!isEven && userGuess == 1)) { // 当たりの場合、賭け金が2倍になって返ってくる userMoney += bet; System.out.println("当たり!賭け金が2倍になりました。"); } else { // ハズレの場合、賭け金がなくなる userMoney -= bet; System.out.println("ハズレ。賭け金を失いました。"); } // もう一度プレイするかどうかをユーザーに尋ねる System.out.print("もう一度プレイしますか?(はい: 0, いいえ: 1): "); int answer = /* ***ここにscannerを使用してもう一度プレイするかどうかを入力するコードを書いてください*** */; if (answer == 1) { // ユーザーが「いいえ」を選んだ場合 playAgain = false; // 繰り返しを終了する } } // 所持金が無くなった場合のメッセージ if (userMoney <= 0) { System.out.println("所持金が無くなりました。ゲームオーバーです。"); } else { System.out.println("ゲームを終了します。"); } // スキャナーを閉じてリソースを解放 scanner.close(); } }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
import java.util.Scanner; import java.util.Random; public class ChoHanGame { public static void main(String[] args) { // Scannerオブジェクトを作成し、標準入力を読み取る Scanner scanner = new Scanner(System.in); // Randomオブジェクトを作成し、ランダムな数を生成する Random random = new Random(); // ユーザーの所持金を初期化 int userMoney = 100; // ゲームの繰り返しを制御するフラグを初期化 boolean playAgain = true; // ユーザーがプレイを希望する限りゲームを繰り返す while (playAgain && userMoney > 0) { // ユーザーの所持金を表示 System.out.println("あなたの所持金: " + userMoney + "円"); // 賭け金を入力してもらう int bet = 0; while (true) { System.out.print("賭け金を入力してください: "); bet = scanner.nextInt(); if (bet > 0 && bet <= userMoney) { break; // 有効な賭け金が入力された場合ループを抜ける } else { System.out.println("無効な賭け金です。もう一度入力してください。"); } } // ユーザーに「丁」か「半」を予想してもらう System.out.print("丁(偶数)か半(奇数)を予想してください(丁: 0, 半: 1): "); int userGuess = scanner.nextInt(); // サイコロを2回振り、その合計を計算する int dice1 = random.nextInt(6) + 1; // 1から6のランダムな整数を生成 int dice2 = random.nextInt(6) + 1; // 1から6のランダムな整数を生成 int sum = dice1 + dice2; // サイコロの合計 // サイコロの結果を表示 System.out.println("サイコロの結果: " + dice1 + " と " + dice2); System.out.println("合計: " + sum); // サイコロの合計が偶数か奇数かを判定 boolean isEven = (sum % 2 == 0); // 偶数ならtrue、奇数ならfalse // ユーザーの予想を判定し、結果を表示 if ((isEven && userGuess == 0) || (!isEven && userGuess == 1)) { // 当たりの場合、賭け金が2倍になって返ってくる userMoney += bet; System.out.println("当たり!賭け金が2倍になりました。"); } else { // ハズレの場合、賭け金がなくなる userMoney -= bet; System.out.println("ハズレ。賭け金を失いました。"); } // もう一度プレイするかどうかをユーザーに尋ねる System.out.print("もう一度プレイしますか?(はい: 0, いいえ: 1): "); int answer = scanner.nextInt(); if (answer == 1) { // ユーザーが「いいえ」を選んだ場合 playAgain = false; // 繰り返しを終了する } } // 所持金が無くなった場合のメッセージ if (userMoney <= 0) { System.out.println("所持金が無くなりました。ゲームオーバーです。"); } else { System.out.println("ゲームを終了します。"); } // スキャナーを閉じてリソースを解放 scanner.close(); } }
********************
コードの解説
- スキャナーオブジェクトの作成:
Scanner scanner = new Scanner(System.in);
- 標準入力(キーボード)からデータを読み取るために
Scanner
クラスのオブジェクトを作成します。
- ランダムオブジェクトの作成:
Random random = new Random();
- ランダムな数値を生成するために
Random
クラスのオブジェクトを作成します。
- ユーザーの所持金を初期化:
int userMoney = 100;
- ユーザーの初期所持金を
100円
に設定します。
- ゲームの繰り返し処理:
while (playAgain && userMoney > 0) { ... }
- ユーザーがもう一度プレイすることを希望し、所持金がある限りゲームを繰り返します。
- 賭け金の入力と検証:
System.out.print("賭け金を入力してください: ");
int bet = scanner.nextInt();
- 賭け金が所持金以下であることを確認します。所持金を超えている場合、再入力を求めます。
- ユーザーからの予想入力:
System.out.print("丁(偶数)か半(奇数)を予想してください(丁: 0, 半: 1): ");
int userGuess = scanner.nextInt();
- ユーザーに「丁」か「半」を
0
か1
で入力してもらい、その入力をuserGuess
変数に格納します。
- サイコロの結果の生成:
int dice1 = random.nextInt(6) + 1;
int dice2 = random.nextInt(6) + 1;
- 1から6のランダムな整数を生成し、それぞれ
dice1
とdice2
に格納します。
- サイコロの合計を計算:
int sum = dice1 + dice2;
- サイコロの目の合計を計算し、
sum
に格納します。
- サイコロの結果と合計の表示:
System.out.println("サイコロの結果: " + dice1 + " と " + dice2);
System.out.println("合計: " + sum);
- サイコロの結果と合計を表示します。
- サイコロの合計が偶数か奇数かを判定:
boolean isEven = (sum % 2 == 0);
- サイコロの合計が偶数なら
true
、奇数ならfalse
をisEven
に格納します。
- ユーザーの予想を判定し、結果を表示:
if ((isEven && userGuess == 0) || (!isEven && userGuess == 1)) { ... }
- ユーザーの予想が正しければ「当たり!賭け金が2倍になりました。」を、間違っていれば「ハズレ。賭け金を失いました。」を表示します。
- もう一度プレイするかの確認:
System.out.print("もう一度プレイしますか?(はい: 0, いいえ: 1): ");
int answer = scanner.nextInt();
- ユーザーにもう一度プレイするかどうかを尋ね、その回答に基づいて
playAgain
を更新します。
- スキャナーの閉鎖:
scanner.close();
- プログラムの最後で
Scanner
オブジェクトを閉じ、リソースを解放します。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。