JAVAの初心者向け問題2-☆2:じゃんけんゲームを作ろう Part2
この問題を解くために必要な知識:
【レベル1の知識】
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力(Scannerクラス)、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while)
【レベル2の知識】
メソッドの定義と呼び出し、メソッドの戻り値、メソッドのオーバーロード、例外処理(try-catch文、throws、throw)、クラスの定義と使用、インスタンス、コンストラクタ
<<前の問題 | 問題集Top |
次の問題>> |
JAVA練習問題2-☆2_じゃんけんゲームを作ろう Part2
簡単なじゃんけんゲームを作成しましょう。
ユーザーが入力した手(グー、チョキ、パー)とコンピュータの手を比較し、勝敗を判定して表示するプログラムを作成します。
この問題の要件
以下の要件に従ってプログラムを作成して下さい。
- ユーザーがじゃんけんの手(グー、チョキ、パー)を入力できるようにすること。
- コンピュータの手はランダムに決定すること。
- ユーザーの手とコンピュータの手を比較して、勝敗を判定すること。
- 勝敗の結果を表示すること。
- プログラムはユーザーが終了するまで繰り返すこと。
- 終了の際には、勝ち、負け、引き分けの回数を表示すること。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
じゃんけんの手を入力してください(グー、チョキ、パー)。終了するには「終了」と入力してください。 グー あなたの手: グー コンピュータの手: チョキ 結果: あなたの勝ち じゃんけんの手を入力してください(グー、チョキ、パー)。終了するには「終了」と入力してください。 パー あなたの手: パー コンピュータの手: グー 結果: あなたの勝ち じゃんけんの手を入力してください(グー、チョキ、パー)。終了するには「終了」と入力してください。 終了 ゲーム終了 勝ち: 2 回 負け: 0 回 引き分け: 0 回
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.import文
1-1. Scannerクラスのインポート
1-2. Randomクラスのインポート
2.JankenGameクラスの定義
3.mainメソッド
3-1. Scannerオブジェクトの作成
3-2. Randomオブジェクトの作成
3-3. じゃんけんの手を表すString配列の定義
3-4. 勝ち、負け、引き分けのカウンタ変数の定義
3-5. 無限ループでゲームを繰り返す(whileループ)
3-5-1. ユーザーの手を入力
3-5-2. 終了条件のチェック
3-5-3. 入力の検証
3-5-4. コンピュータの手をランダムに決定
3-5-5. ユーザーとコンピュータの手を表示
3-5-6. 勝敗を判定し、結果を表示
3-5-6-1. 引き分けの場合
3-5-6-2. ユーザーの勝ちの場合
3-5-6-3. ユーザーの負けの場合
3-6. 最終結果を表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
import java.util.Scanner; import java.util.Random; public class JankenGame { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Random random = new Random(); String[] hands = {"グー", "チョキ", "パー"}; int winCount = 0; int loseCount = 0; int drawCount = 0; while (true) { // ユーザーの手を入力 System.out.println("じゃんけんの手を入力してください(グー、チョキ、パー)。終了するには「終了」と入力してください。"); String userHand = scanner.nextLine(); // 終了条件 if (userHand.equals("終了")) { break; } // 入力の検証 // ***ここにif文を使って、ユーザーの入力が「グー」「チョキ」「パー」以外の場合に無効な入力として再入力を促すコードを書いてください*** // コンピュータの手をランダムに決定 // ***ここにRandomオブジェクトを使って、コンピュータの手をランダムに選択するコードを書いてください*** // 勝敗を判定 // ***ここにユーザーとコンピュータの手を表示するコードを書いてください*** // ***ここにif文を使って、勝敗を判定し結果を表示するコードを書いてください*** } // 最終結果を表示 System.out.println("ゲーム終了"); System.out.println("勝ち: " + winCount + " 回"); System.out.println("負け: " + loseCount + " 回"); System.out.println("引き分け: " + drawCount + " 回"); } }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
import java.util.Scanner; import java.util.Random; public class JankenGame { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Random random = new Random(); String[] hands = {"グー", "チョキ", "パー"}; int winCount = 0; int loseCount = 0; int drawCount = 0; while (true) { // ユーザーの手を入力 System.out.println("じゃんけんの手を入力してください(グー、チョキ、パー)。終了するには「終了」と入力してください。"); String userHand = scanner.nextLine(); // 終了条件 if (userHand.equals("終了")) { break; } // 入力の検証 if (!userHand.equals("グー") && !userHand.equals("チョキ") && !userHand.equals("パー")) { System.out.println("無効な入力です。もう一度入力してください。"); continue; } // コンピュータの手をランダムに決定 int computerIndex = random.nextInt(3); String computerHand = hands[computerIndex]; // 勝敗を判定 System.out.println("あなたの手: " + userHand); System.out.println("コンピュータの手: " + computerHand); if (userHand.equals(computerHand)) { System.out.println("結果: 引き分け"); drawCount++; } else if ((userHand.equals("グー") && computerHand.equals("チョキ")) || (userHand.equals("チョキ") && computerHand.equals("パー")) || (userHand.equals("パー") && computerHand.equals("グー"))) { System.out.println("結果: あなたの勝ち"); winCount++; } else { System.out.println("結果: あなたの負け"); loseCount++; } } // 最終結果を表示 System.out.println("ゲーム終了"); System.out.println("勝ち: " + winCount + " 回"); System.out.println("負け: " + loseCount + " 回"); System.out.println("引き分け: " + drawCount + " 回"); } }
********************
コードの解説
このJavaプログラムは、ユーザーとコンピュータがじゃんけんを行い、勝敗を記録するゲームです。
コードの各部分を初心者向けに解説します。
Scanner
とRandom
のインポート
import java.util.Scanner; import java.util.Random;
- Scanner: ユーザーの入力を受け取るために使用します。
- Random: コンピュータの手をランダムに決定するために使用します。
main
メソッドの開始
public class JankenGame { public static void main(String[] args) {
mainメソッド: Javaプログラムの実行が開始される場所です。ここからプログラムが動き出します。
変数の定義
String[] hands = {"グー", "チョキ", "パー"}; int winCount = 0; int loseCount = 0; int drawCount = 0;
- hands配列: じゃんけんの手(グー、チョキ、パー)を文字列の配列で定義しています。
- winCount, loseCount, drawCount: 勝ち、負け、引き分けの回数を記録するための変数です。
ゲームのループ
while (true) { // ユーザーの手を入力 System.out.println("じゃんけんの手を入力してください(グー、チョキ、パー)。終了するには「終了」と入力してください。"); String userHand = scanner.nextLine();
- whileループ: ユーザーが「終了」と入力するまでゲームが繰り返されます。
- scanner.nextLine(): ユーザーが入力したテキストを取得します。
ゲーム終了条件
if (userHand.equals("終了")) { break; }
ユーザーが「終了」と入力した場合、break文によりループを抜けてゲームが終了します。
入力の検証
if (!userHand.equals("グー") && !userHand.equals("チョキ") && !userHand.equals("パー")) { System.out.println("無効な入力です。もう一度入力してください。"); continue; }
ユーザーの入力が「グー」「チョキ」「パー」以外の場合、エラーメッセージを表示し、次のループに進みます。
コンピュータの手をランダムに決定
int computerIndex = random.nextInt(3); String computerHand = hands[computerIndex];
random.nextInt(3): 0から2までのランダムな整数を生成し、これを使ってコンピュータの手(グー、チョキ、パー)を決定します。
勝敗の判定
if (userHand.equals(computerHand)) { System.out.println("結果: 引き分け"); drawCount++; } else if ((userHand.equals("グー") && computerHand.equals("チョキ")) || (userHand.equals("チョキ") && computerHand.equals("パー")) || (userHand.equals("パー") && computerHand.equals("グー"))) { System.out.println("結果: あなたの勝ち"); winCount++; } else { System.out.println("結果: あなたの負け"); loseCount++; }
勝敗の条件分岐:
- 引き分け: ユーザーとコンピュータが同じ手を出した場合。
- ユーザーの勝ち: グーでチョキ、チョキでパー、パーでグーに勝つ組み合わせ。
- それ以外: ユーザーの負け。
ゲーム終了後の結果表示
System.out.println("ゲーム終了"); System.out.println("勝ち: " + winCount + " 回"); System.out.println("負け: " + loseCount + " 回"); System.out.println("引き分け: " + drawCount + " 回");
最終的な勝敗回数(勝ち、負け、引き分け)が表示され、ゲームが終了します。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。