JAVA練習問題1-☆1:じゃんけんゲームを作ろう

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

JAVAの初心者向け問題1-☆1:じゃんけんゲームを作ろう

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

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

JAVA練習問題1-☆1_じゃんけんゲームを作ろう





簡単な「じゃんけん」ゲームを作成しましょう。

ユーザーが「グー」「チョキ」「パー」のいずれかを入力し、コンピューターがランダムに出した手と比較して勝敗を決定します。

その後プログラムはユーザーに対して結果を表示してもう一度プレイするかどうかを尋ね、ユーザーが「いいえ」と答えるまでゲームを繰り返しましょう。

この問題の要件

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

  • ユーザーからの入力を受け取る(0 は「グー」、1 は「チョキ」、2 は「パー」)。
  • コンピューターの手をランダムに生成する。
  • 勝敗を決定し、結果を表示する。
  • ユーザーにもう一度プレイするかどうかを尋ねる(0 は「はい」、1 は「いいえ」)。
  • ユーザーが 1 (いいえ)と答えるまでゲームを繰り返す。

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

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

じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): 0
コンピューターの手: チョキ
あなたの勝ちです!
もう一度プレイしますか?(はい: 0, いいえ: 1): 0

じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): 2
コンピューターの手: パー
引き分けです!
もう一度プレイしますか?(はい: 0, いいえ: 1): 1
ゲームを終了します。

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

この問題を解くヒント

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

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

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

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

2.RockPaperScissorsクラスの定義

3.mainメソッドの定義
 3-1. Scannerオブジェクトの作成
 3-2. Randomオブジェクトの作成
 3-3. じゃんけんの手を表す文字列の配列を作成
 3-4. ゲームの繰り返しを制御するフラグを初期化
 3-5. ユーザーがプレイを希望する限りゲームを繰り返すためのwhileループ
  3-5-1. ユーザーに手を入力してもらう
  3-5-2. コンピューターの手をランダムに選ぶ
  3-5-3. コンピューターの手を表示
  3-5-4. ユーザーの手とコンピューターの手を比較し、勝敗を判定
  3-5-5. 勝ち負けの結果を表示
  3-5-6. もう一度プレイするかどうかをユーザーに尋ねる
 3-6. スキャナーを閉じてリソースを解放

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

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

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

public class RockPaperScissors {
    public static void main(String[] args) {
        // Scannerオブジェクトを作成し、標準入力を読み取る
        Scanner scanner = new Scanner(System.in);
        
        // Randomオブジェクトを作成し、ランダムな手を生成する
        Random random = new Random();
        
        // じゃんけんの手を表す文字列の配列を作成
        String[] choices = {"グー", "チョキ", "パー"};
        
        // ゲームの繰り返しを制御するフラグを初期化
        boolean playAgain = true;
        
        // ユーザーがプレイを希望する限りゲームを繰り返す
        while (playAgain) {
            // ユーザーに手を入力してもらう
            System.out.print("じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): ");
            /* ***ここにユーザーの手を読み取るコードを記述してください*** */
            
            // コンピューターの手をランダムに選ぶ
            /* ***ここにコンピューターの手をランダムに選ぶコードを記述してください*** */ // 0から2のランダムな整数を生成
            
            // コンピューターの手を表示
            System.out.println("コンピューターの手: " + choices[/* ***ここにコンピューターの選択を記述してください*** */]);
            
            // 勝敗の判定を行う
            if (/* ***ここにユーザーとコンピューターの手が同じかどうかを判定するコードを記述してください*** */) {
                System.out.println("引き分けです!");
            } else {
                // ユーザーの勝ちの場合の条件を設定
                boolean userWins = (/* ***ここにユーザーが勝つ条件を記述してください*** */);
                
                // 勝ち負けの結果を表示
                if (userWins) {
                    System.out.println("あなたの勝ちです!");
                } else {
                    System.out.println("あなたの負けです!");
                }
            }
            
            // もう一度プレイするかどうかをユーザーに尋ねる
            System.out.print("もう一度プレイしますか?(はい: 0, いいえ: 1): ");
            /* ***ここにユーザーの回答を読み取るコードを記述してください*** */
            if (/* ***ここにユーザーがゲームを続けるかどうかの判定を記述してください*** */) { // ユーザーが「いいえ」を選んだ場合
                playAgain = false; // 繰り返しを終了する
            }
        }
        
        // スキャナーを閉じてリソースを解放
        scanner.close();
        System.out.println("ゲームを終了します。");
    }
}

 

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

解答例

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

正解コードの例

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

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

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

public class RockPaperScissors {
    public static void main(String[] args) {
        // Scannerオブジェクトを作成し、標準入力を読み取る
        Scanner scanner = new Scanner(System.in);
        
        // Randomオブジェクトを作成し、ランダムな手を生成する
        Random random = new Random();
        
        // じゃんけんの手を表す文字列の配列を作成
        String[] choices = {"グー", "チョキ", "パー"};
        
        // ゲームの繰り返しを制御するフラグを初期化
        boolean playAgain = true;
        
        // ユーザーがプレイを希望する限りゲームを繰り返す
        while (playAgain) {
            // ユーザーに手を入力してもらう
            System.out.print("じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): ");
            int userChoice = scanner.nextInt();
            
            // コンピューターの手をランダムに選ぶ
            int computerChoice = random.nextInt(3); // 0から2のランダムな整数を生成
            
            // コンピューターの手を表示
            System.out.println("コンピューターの手: " + choices[computerChoice]);
            
            // 勝敗の判定を行う
            if (userChoice == computerChoice) {
                System.out.println("引き分けです!");
            } else {
                // ユーザーの勝ちの場合の条件を設定
                boolean userWins = (userChoice == 0 && computerChoice == 1) ||
                                   (userChoice == 1 && computerChoice == 2) ||
                                   (userChoice == 2 && computerChoice == 0);
                
                // 勝ち負けの結果を表示
                if (userWins) {
                    System.out.println("あなたの勝ちです!");
                } else {
                    System.out.println("あなたの負けです!");
                }
            }
            
            // もう一度プレイするかどうかをユーザーに尋ねる
            System.out.print("もう一度プレイしますか?(はい: 0, いいえ: 1): ");
            int answer = scanner.nextInt();
            if (answer == 1) { // ユーザーが「いいえ」を選んだ場合
                playAgain = false; // 繰り返しを終了する
            }
        }
        
        // スキャナーを閉じてリソースを解放
        scanner.close();
        System.out.println("ゲームを終了します。");
    }
}

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

コードの解説

Scannerオブジェクトの作成

Scanner scanner = new Scanner(System.in);

Scannerクラスを使用して、ユーザーからの入力(キーボード入力)を読み取ります。

ここでは、System.inを使って標準入力を読み取り、ユーザーにじゃんけんの手やゲームを続けるかどうかの選択を入力してもらいます。

Randomオブジェクトの作成

Random random = new Random();

Randomクラスは、ランダムな数値を生成するために使用します。

このプログラムでは、コンピューターのじゃんけんの手(グー、チョキ、パー)をランダムに選ぶためにrandomオブジェクトを使用しています。

じゃんけんの手を表す配列の作成

String[] choices = {"グー", "チョキ", "パー"};

String型の配列choicesを使って、じゃんけんの3つの手「グー」、「チョキ」、「パー」を格納しています。

後でユーザーやコンピューターの選んだ手を表示する際に、この配列の要素を使います。

ゲームを繰り返すためのフラグを初期化

boolean playAgain = true;

playAgainは、ゲームを繰り返すかどうかを制御するフラグです。最初はtrueに設定され、ユーザーが「もう一度プレイしたい」と思う限りゲームを続けます。

ゲームのメインループ

while (playAgain) {

whileループ内のコードは、playAgaintrueの間繰り返されます。

このループは、ユーザーがゲームを続けたいと言う限り、ゲームのロジックを繰り返し実行します。

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

System.out.print("じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): ");
int userChoice = scanner.nextInt();

ユーザーにじゃんけんの手を選んでもらいます。scanner.nextInt()を使って、ユーザーが入力した整数を読み取ります。

0が「グー」、1が「チョキ」、2が「パー」として対応します。

コンピューターの手をランダムに選ぶ

int computerChoice = random.nextInt(3);

random.nextInt(3)は、0から2までのランダムな整数を生成します。これをコンピューターのじゃんけんの手として使います。

0が「グー」、1が「チョキ」、2が「パー」に対応します。

コンピューターの手を表示する

System.out.println("コンピューターの手: " + choices[computerChoice]);

コンピューターの選んだ手を配列choicesから取り出して表示します。computerChoiceは0、1、2のいずれかの値で、対応する「グー」、「チョキ」、「パー」が表示されます。

勝敗の判定

if (userChoice == computerChoice) {
    System.out.println("引き分けです!");
} else {
    boolean userWins = (userChoice == 0 && computerChoice == 1) ||
                       (userChoice == 1 && computerChoice == 2) ||
                       (userChoice == 2 && computerChoice == 0);
    if (userWins) {
        System.out.println("あなたの勝ちです!");
    } else {
        System.out.println("あなたの負けです!");
    }
}

この部分では、ユーザーとコンピューターの手を比較し、勝敗を決定します。

  • userChoice == computerChoiceの場合は、両者が同じ手を出したため、引き分けとなります。
  • それ以外の場合は、ユーザーが勝つパターン(グー vs チョキ、チョキ vs パー、パー vs グー)かどうかを判定し、結果を表示します。

ゲームをもう一度プレイするかの確認

System.out.print("もう一度プレイしますか?(はい: 0, いいえ: 1): ");
int answer = scanner.nextInt();
if (answer == 1) {
    playAgain = false;
}

ユーザーに、もう一度ゲームをプレイしたいかどうかを尋ねます。ユーザーが1を入力すると、playAgainfalseに設定され、ゲームが終了します。

0を入力した場合は、ゲームがもう一度繰り返されます。

スキャナーを閉じる

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

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

これにより、メモリの無駄を防ぎます。最後に「ゲームを終了します」と表示してプログラムを終了します。

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

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

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

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






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