この記事の練習問題で使用する知識:
丸暗記構文、入力と出力の基本、コメントの書き方、変数と定数、算術演算子、文字列の操作、import文、比較演算子と論理演算子、if文による分岐処理、while文による繰り返し処理、配列
JAVAのゲームコード一覧はこちら
<<前の問題 | 問題集Top |
次の問題>> |
JAVA練習問題2-☆3:じゃんけんゲームを作ろう
簡単な「じゃんけん」ゲームを作成しましょう。
ユーザーが「グー」「チョキ」「パー」のいずれかを入力し、コンピューターがランダムに出した手と比較して勝敗を決定します。
その後プログラムはユーザーに対して結果を表示してもう一度プレイするかどうかを尋ね、ユーザーが「いいえ」と答えるまでゲームを繰り返しましょう。
この問題の要件
以下の要件に従ってプログラムを作成してください。
- ユーザーからの入力を受け取る(
0
は「グー」、1
は「チョキ」、2
は「パー」)。 - コンピューターの手をランダムに生成する。
- 勝敗を決定し、結果を表示する。
- ユーザーにもう一度プレイするかどうかを尋ねる(
0
は「はい」、1
は「いいえ」)。 - ユーザーが
1
(いいえ)と答えるまでゲームを繰り返す。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): 0 コンピューターの手: チョキ あなたの勝ちです! もう一度プレイしますか?(はい: 0, いいえ: 1): 0 じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): 2 コンピューターの手: パー 引き分けです! もう一度プレイしますか?(はい: 0, いいえ: 1): 1 ゲームを終了します。
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1:Scannerクラスをインポート
2:Randomクラスをインポート
3:RockPaperScissorsクラスの定義
□ mainメソッドの定義
□ □ Scannerオブジェクトscannerの初期化
□ □ Randomオブジェクトrandomの初期化
□ □ String配列choicesにじゃんけんの手「グー」「チョキ」「パー」を代入
□ □ boolean変数playAgainにtrueを代入して、ゲームの繰り返しを制御
□ □ while文によるループ開始
□ □ □ 「じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2)」と出力
□ □ □ ユーザーの入力を整数として読み取り、変数userChoiceに代入
□ □ □ 変数computerChoiceに0から2のランダムな整数を代入
□ □ □ コンピューターの手を表示
□ □ □ if文でuserChoiceとcomputerChoiceの比較を行い、引き分けかどうかを判定
□ □ □ □ 引き分けの場合、「引き分けです!」と出力
□ □ □ else文でuserWins変数を用いて勝敗の条件を設定
□ □ □ □ if文でuserWinsが真の場合、「あなたの勝ちです!」と出力
□ □ □ □ else文で偽の場合、「あなたの負けです!」と出力
□ □ □ 「もう一度プレイしますか?(はい: 0, いいえ: 1)」と出力
□ □ □ ユーザーの入力を整数として読み取り、変数answerに代入
□ □ □ if文でanswerが1の場合、playAgainをfalseにしてループを終了
□ □ 「ゲームを終了します。」と出力
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
import java.util.Scanner; import java.util.Random; public class RockPaperScissors { public static void main(String[] args) { // Scannerオブジェクトを作成し、標準入力を読み取る /* 【穴埋め問題1】 ここにScannerオブジェクトscannerを初期化するコードを書いてください。 */ // Randomオブジェクトを作成し、ランダムな手を生成する /* 【穴埋め問題2】 ここにRandomオブジェクトrandomを初期化するコードを書いてください。 */ // じゃんけんの手を表す文字列の配列を作成 String[] choices = {"グー", "チョキ", "パー"}; // ゲームの繰り返しを制御するフラグを初期化 boolean playAgain = true; // ユーザーがプレイを希望する限りゲームを繰り返す while (playAgain) { // ユーザーに手を入力してもらう System.out.print("じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): "); /* 【穴埋め問題3】 ここにユーザーの手を入力してuserChoiceに代入するコードを書いてください。 */ // コンピューターの手をランダムに選ぶ /* 【穴埋め問題4】 ここにランダムな手を生成し、computerChoiceに代入するコードを書いてください。 */ // コンピューターの手を表示 System.out.println("コンピューターの手: " + choices[computerChoice]); // 勝敗の判定を行う if (userChoice == computerChoice) { System.out.println("引き分けです!"); } else { // ユーザーの勝ちの場合の条件を設定 /* 【穴埋め問題5】 ここにユーザーが勝利する条件を判定し、userWinsに代入するコードを書いてください。 */ // 勝ち負けの結果を表示 if (userWins) { System.out.println("あなたの勝ちです!"); } else { System.out.println("あなたの負けです!"); } } // もう一度プレイするかどうかをユーザーに尋ねる System.out.print("もう一度プレイしますか?(はい: 0, いいえ: 1): "); /* 【穴埋め問題6】 ここにユーザーの入力を読み取り、answerに代入するコードを書いてください。 */ if (answer == 1) { // ユーザーが「いいえ」を選んだ場合 playAgain = false; // 繰り返しを終了する } } 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; // 繰り返しを終了する } } System.out.println("ゲームを終了します。"); } }
正解コードの解説
このコードは「じゃんけんゲーム」を実装したもので、ユーザーとコンピューターがじゃんけんをして勝敗を決めます。
コードの各部分について、順に説明していきます。
インポート文
import java.util.Scanner; import java.util.Random;
ここでは java.util.Scanner
と java.util.Random
をインポートしています。
Scanner
はユーザーからの入力を受け取るために使われ、Random
はコンピューターのじゃんけんの手をランダムに決定するために使用します。
クラスとメインメソッドの定義
public class RockPaperScissors { public static void main(String[] args) {
RockPaperScissors
というクラスが定義されており、プログラムのエントリーポイントである main
メソッドが含まれています。
このメソッドからプログラムが実行されます。
ScannerとRandomオブジェクトの生成
Scanner scanner = new Scanner(System.in); Random random = new Random();
Scanner
オブジェクト scanner
を作成して、標準入力からのユーザー入力を読み取れるようにします。
Random
オブジェクト random
を生成して、コンピューターの手をランダムに選択するために使用します。
じゃんけんの手の配列
String[] choices = {"グー", "チョキ", "パー"};
choices
配列を作成し、"グー"
, "チョキ"
, "パー"
の文字列をそれぞれ要素として格納しています。
この配列は、コンピューターが選んだ手を表示する際に使用されます。
繰り返しフラグの初期化
boolean playAgain = true;
ゲームの繰り返しを制御するフラグ playAgain
を初期化しています。
ユーザーが「もう一度プレイするかどうか」に応じてこのフラグの値を変更し、ループを制御します。
ゲームのメインループ
while (playAgain) {
while
ループを使用して、ユーザーが「プレイを続けたい」と望む限りゲームを繰り返します。
このループ内にゲームのロジックが含まれています。
ユーザーの手の入力
System.out.print("じゃんけんの手を入力してください(グー: 0, チョキ: 1, パー: 2): "); int userChoice = scanner.nextInt();
ユーザーに手を入力してもらいます。
0
, 1
, 2
のいずれかを入力することで「グー」「チョキ」「パー」を選択し、その値が userChoice
変数に格納されます。
コンピューターの手のランダムな選択
int computerChoice = random.nextInt(3); // 0から2のランダムな整数を生成
random.nextInt(3)
を使って、0
から 2
の整数をランダムに生成し、コンピューターの手を決定します。
この値が computerChoice
変数に格納され、choices
配列を用いて対応する手を表示します。
勝敗の判定
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("あなたの負けです!"); } }
ここでユーザーの手とコンピューターの手を比較して勝敗を決めます。
もし同じ手なら「引き分け」、それ以外の場合にはユーザーが勝ったか負けたかを判定します。
userWins
はユーザーが勝利する条件を満たしているかどうかを判定するために使用され、条件を満たす場合に「あなたの勝ちです!」と表示します。
ゲームの再プレイ確認
System.out.print("もう一度プレイしますか?(はい: 0, いいえ: 1): "); int answer = scanner.nextInt(); if (answer == 1) { playAgain = false; }
ここでユーザーに再度プレイするかを尋ねます。
0
を入力すれば再びゲームが開始され、1
を入力すれば playAgain
が false
となり、ループが終了します。
終了メッセージ
System.out.println("ゲームを終了します。");
ゲームが終了した際に表示されるメッセージです。
while
ループが終了するとこの行が実行され、プログラムが終了します。
まとめ
このコードを通じてScanner
クラスでの入力処理や、Random
クラスによる乱数生成、条件文とループの使い方を学ぶことができます。
またユーザー入力とコンピューターのランダムな選択を組み合わせたシンプルなゲームの作り方を体験できました。
ぜひ理解を深めるためにコードを書き換えたり、新しいルールを追加して独自のゲームを作ってみましょう!
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。