この記事の練習問題で使用する知識:
基礎文法と制御構造(レッスン1~2)、メソッドの定義と使用、メソッドの戻り値、ArrayList、クラスの定義と使用、コンストラクタ、クラスメンバとインスタンスメンバ
JAVAのゲームコード一覧はこちら
<<前のページ | JAVA Topへ |
次のページ>> |
JAVA練習問題5-☆1:モンスター捕獲ゲームを作ろう
モンスター捕獲ゲームを作成しましょう。ゲームは次のように進行します:
- モンスター(スライム、ゴブリン、ドラゴン)が順番に登場します。
- モンスターがサイコロを振り、その結果が表示されます。
- プレイヤーがサイコロを振るかどうかを選択します。
- 振らない場合は次のモンスターに進みます。振る場合は出た目によって結果が決まります:
- プレイヤーの出目がモンスターの出目より大きければ捕獲成功。
- プレイヤーの出目がモンスターの出目と同じ場合は引き分けでもう一度そのモンスターと対決。
- プレイヤーの出目がモンスターの出目より小さければ捕獲失敗。
- 3匹のモンスターとの勝負が終了するか、いずれかのモンスターの捕獲に失敗した場合はゲーム終了。
- 最後に捕まえられたモンスターを一覧で表示し、プログラム終了。
この問題の要件
以下の要件に従ってコードを書いて下さい。
Monster
クラスを定義し、name
とdiceRoll
メソッドを持つ。- プレイヤーが対戦するモンスターは
ArrayList
に格納する。 Scanner
クラスを使ってプレイヤーの入力を処理する。while
ループを使ってゲームを進行させる。- モンスターの捕獲結果を表示する。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
スライムが現れた! スライムがサイコロを振った。出目は 3 サイコロを振りますか? (yes/no): yes プレイヤーがサイコロを振った。出目は 5 スライムを捕まえた! ゴブリンが現れた! ゴブリンがサイコロを振った。出目は 4 サイコロを振りますか? (yes/no): no ドラゴンが現れた! ドラゴンがサイコロを振った。出目は 6 サイコロを振りますか? (yes/no): yes プレイヤーがサイコロを振った。出目は 6 引き分けでもう一度! ドラゴンがサイコロを振った。出目は 2 サイコロを振りますか? (yes/no): yes プレイヤーがサイコロを振った。出目は 1 ドラゴンを捕まえられなかった。ゲームオーバー! 捕まえたモンスター: [スライム] ゲーム終了
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)
1:RandomクラスとScannerクラスをインポート
2:Monsterクラスの定義
□ Monsterクラスのプライベートメンバ変数nameを宣言
□ コンストラクタの定義
□ □ 引数nameでMonsterクラスのname変数を初期化
□ getNameメソッドの定義
□ □ name変数の値を返す
□ diceRollメソッドの定義
□ □ Randomオブジェクトrandを生成
□ □ 1から6までのランダムな整数を返す
3:MonsterCaptureGameクラスの定義
□ mainメソッドの定義
□ □ Scannerオブジェクトscannerを初期化
□ □ ArrayListオブジェクトmonstersを生成
□ □ □ スライム、ゴブリン、ドラゴンの3つのMonsterオブジェクトをmonstersリストに追加
□ □ ArrayListオブジェクトcapturedMonstersを生成
□ □ forループにて各Monsterオブジェクトとの対決処理を開始
□ □ □ 現在のモンスター名を表示
□ □ □ 変数capturedをfalseに初期化
□ □ □ whileループを開始し、捕獲成功かつゲームが継続するまで繰り返す
□ □ □ □ モンスターのサイコロを振り出目を表示
□ □ □ □ 「サイコロを振りますか?」のメッセージを表示し、ユーザー入力を受け取る
□ □ □ □ if文でユーザーの入力が”no”の場合、whileループを抜ける
□ □ □ □ プレイヤーがサイコロを振り出目を表示
□ □ □ □ if文でプレイヤーの出目がモンスターの出目より大きいかを判定
□ □ □ □ □ 真の場合、捕獲成功メッセージを表示し、capturedMonstersリストにモンスター名を追加し、capturedをtrueに設定
□ □ □ □ else if文でプレイヤーとモンスターの出目が等しいかを判定
□ □ □ □ □ 引き分けメッセージを表示して再度サイコロを振る
□ □ □ □ else文
□ □ □ □ □ 捕獲失敗メッセージを表示し、whileループを抜ける
□ □ □ if文でモンスターが捕まえられていない場合、forループを抜ける
□ □ 「捕まえたモンスター: 」のメッセージを表示し、capturedMonstersリストの内容を表示
□ □ 「ゲーム終了」と表示
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
import java.util.ArrayList; import java.util.Random; import java.util.Scanner; // モンスタークラス class Monster { private String name; // コンストラクタ public Monster(String name) { this.name = name; } // モンスター名を取得するメソッド public String getName() { return name; } // サイコロを振るメソッド public int diceRoll() { Random rand = new Random(); /*【穴埋め問題1】ここに1から6までのランダムな数字を生成し、返すコードを書いてください。*/ } } public class MonsterCaptureGame { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<Monster> monsters = new ArrayList<Monster>(); /*【穴埋め問題2】ここにモンスター「スライム」「ゴブリン」「ドラゴン」をリストに追加するコードを書いてください。*/ ArrayList<String> capturedMonsters = new ArrayList<String>(); // 各モンスターとの対決 for (Monster monster : monsters) { System.out.println(monster.getName() + "が現れた!"); boolean captured = false; while (!captured) { /*【穴埋め問題3】ここにモンスターがサイコロを振り、結果を表示するコードを書いてください。*/ System.out.print("サイコロを振りますか? (yes/no): "); String response = scanner.next(); if (response.equalsIgnoreCase("no")) { break; } /*【穴埋め問題4】ここにプレイヤーがサイコロを振り、結果を表示するコードを書いてください。*/ /*【穴埋め問題5】ここにプレイヤーがモンスターの出目に勝った場合の処理を記述してください。*/ if (playerRoll > monsterRoll) { } else if (playerRoll == monsterRoll) { System.out.println("引き分けでもう一度!"); } else { System.out.println(monster.getName() + "を捕まえられなかった。ゲームオーバー!"); break; } } if (!captured) { break; } } System.out.println("捕まえたモンスター: " + capturedMonsters); System.out.println("ゲーム終了"); } }
この問題の穴埋めコードは以上です。
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
import java.util.ArrayList; import java.util.Random; import java.util.Scanner; // モンスタークラス class Monster { private String name; // コンストラクタ public Monster(String name) { this.name = name; } // モンスター名を取得するメソッド public String getName() { return name; } // サイコロを振るメソッド public int diceRoll() { Random rand = new Random(); return rand.nextInt(6) + 1; // 1から6までのランダムな数字を返す } } public class MonsterCaptureGame { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<Monster> monsters = new ArrayList<Monster>(); monsters.add(new Monster("スライム")); monsters.add(new Monster("ゴブリン")); monsters.add(new Monster("ドラゴン")); ArrayList<String> capturedMonsters = new ArrayList<String>(); // 各モンスターとの対決 for (Monster monster : monsters) { System.out.println(monster.getName() + "が現れた!"); boolean captured = false; while (!captured) { int monsterRoll = monster.diceRoll(); System.out.println(monster.getName() + "がサイコロを振った。出目は " + monsterRoll); System.out.print("サイコロを振りますか? (yes/no): "); String response = scanner.next(); if (response.equalsIgnoreCase("no")) { break; } int playerRoll = monster.diceRoll(); System.out.println("プレイヤーがサイコロを振った。出目は " + playerRoll); if (playerRoll > monsterRoll) { System.out.println(monster.getName() + "を捕まえた!"); capturedMonsters.add(monster.getName()); captured = true; } else if (playerRoll == monsterRoll) { System.out.println("引き分けでもう一度!"); } else { System.out.println(monster.getName() + "を捕まえられなかった。ゲームオーバー!"); break; } } if (!captured) { break; } } System.out.println("捕まえたモンスター: " + capturedMonsters); System.out.println("ゲーム終了"); } }
********************
正解コードの解説
このJavaコードは、プレイヤーがモンスターとサイコロを使って対決し、モンスターを捕まえるゲームをシミュレーションしています。
以下では、各部分をブロックごとに解説していきます。
モンスタークラスの定義
class Monster { private String name; public Monster(String name) { this.name = name; } public String getName() { return name; } public int diceRoll() { Random rand = new Random(); return rand.nextInt(6) + 1; } }
Monster
クラスは、モンスターの名前を管理し、サイコロを振る機能を持っています。private String name
は、モンスターの名前を保存するための変数です。「private」は、この変数がクラス外部から直接アクセスできないことを意味します。public Monster(String name)
は、モンスターの名前を設定するためのコンストラクタです。public String getName()
は、モンスターの名前を取得するメソッドです。外部からモンスターの名前を知りたいときに使います。public int diceRoll()
は、サイコロを振るメソッドです。Random
クラスを使って1から6までのランダムな数字を生成します。
メインクラスの定義とモンスターリストの作成
public class MonsterCaptureGame { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<Monster> monsters = new ArrayList<Monster>(); monsters.add(new Monster("スライム")); monsters.add(new Monster("ゴブリン")); monsters.add(new Monster("ドラゴン"));
MonsterCaptureGame
はゲームの実行を管理するメインクラスです。Scanner scanner = new Scanner(System.in);
は、ユーザーからの入力を受け取るための準備です。ArrayList<Monster> monsters
はモンスターのリストを格納するためのデータ構造です。ArrayList
は、複数のデータを一度に管理できる「リスト」というタイプのデータ構造を使っています。monsters.add(new Monster("スライム"));
は、「スライム」という名前のモンスターをリストに追加しています。他にも「ゴブリン」と「ドラゴン」が追加されています。
ゲームの進行
ArrayList<String> capturedMonsters = new ArrayList<String>(); for (Monster monster : monsters) { System.out.println(monster.getName() + "が現れた!"); boolean captured = false; while (!captured) { int monsterRoll = monster.diceRoll(); System.out.println(monster.getName() + "がサイコロを振った。出目は " + monsterRoll);
capturedMonsters
は捕まえたモンスターを保存するリストです。for (Monster monster : monsters)
は、各モンスターと順番に対戦するためのループです。boolean captured = false;
で、最初はモンスターが捕まっていない状態を設定しています。monster.diceRoll()
で、モンスターがサイコロを振り、結果を出力しています。
プレイヤーのサイコロと勝敗判定
System.out.print("サイコロを振りますか? (yes/no): "); String response = scanner.next(); if (response.equalsIgnoreCase("no")) { break; } int playerRoll = monster.diceRoll(); System.out.println("プレイヤーがサイコロを振った。出目は " + playerRoll); if (playerRoll > monsterRoll) { System.out.println(monster.getName() + "を捕まえた!"); capturedMonsters.add(monster.getName()); captured = true; } else if (playerRoll == monsterRoll) { System.out.println("引き分けでもう一度!"); } else { System.out.println(monster.getName() + "を捕まえられなかった。ゲームオーバー!"); break; }
- プレイヤーにサイコロを振るかどうかを聞き、
"yes"
ならサイコロを振り、"no"
ならその対戦を終了します。 - プレイヤーのサイコロの出目とモンスターの出目を比較し、プレイヤーの出目が大きければモンスターを捕まえます。出目が同じなら引き分け、出目が小さければゲームオーバーになります。
ゲームの終了と結果表示
System.out.println("捕まえたモンスター: " + capturedMonsters); System.out.println("ゲーム終了");
- ゲーム終了時に、捕まえたモンスターの一覧を表示します。
- 最後に「ゲーム終了」と表示してプログラムが終了します。
JAVAのゲームコード一覧はこちら
<<前のページ |
JAVA Topへ |
次のページ>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。