JAVA練習問題4-☆1:モンスター捕獲ゲームを作ろう

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

JAVAの初心者向け問題4-☆1:モンスター捕獲ゲームを作ろう

この問題を解くために必要な知識:
【レベル1~3の知識】
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力(Scannerクラス)、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while)、メソッドの定義と呼び出し、メソッドの戻り値、メソッドのオーバーロード、例外処理(try-catch文、throws、throw)、クラスの定義と使用、インスタンス、コンストラクタ、コレクションの基礎、コレクション(List, ArrayList)、コレクション(HashSet, TreeSet)、コレクション(HashMap, TreeMap)、

【レベル4の知識】
ゲッターとセッター、カプセル化、クラスメンバ、インスタンスメソッド、クラスの継承抽象クラスインターフェース

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

JAVA練習問題4-☆1:モンスター捕獲ゲームを作ろう





モンスター捕獲ゲームを作成しましょう。ゲームは次のように進行します:

  1. モンスター(スライム、ゴブリン、ドラゴン)が順番に登場します。
  2. モンスターがサイコロを振り、その結果が表示されます。
  3. プレイヤーがサイコロを振るかどうかを選択します。
  4. 振らない場合は次のモンスターに進みます。振る場合は出た目によって結果が決まります:
    • プレイヤーの出目がモンスターの出目より大きければ捕獲成功。
    • プレイヤーの出目がモンスターの出目と同じ場合は引き分けでもう一度そのモンスターと対決。
    • プレイヤーの出目がモンスターの出目より小さければ捕獲失敗。
  5. 3匹のモンスターとの勝負が終了するか、いずれかのモンスターの捕獲に失敗した場合はゲーム終了。
  6. 最後に捕まえられたモンスターを一覧で表示し、プログラム終了。

この問題の要件

以下の要件に従ってコードを書いて下さい。

  • Monster クラスを定義し、namediceRoll メソッドを持つ。
  • プレイヤーが対戦するモンスターは ArrayList に格納する。
  • Scanner クラスを使ってプレイヤーの入力を処理する。
  • while ループを使ってゲームを進行させる。
  • モンスターの捕獲結果を表示する。

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

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

スライムが現れた!
スライムがサイコロを振った。出目は 3
サイコロを振りますか? (yes/no): yes
プレイヤーがサイコロを振った。出目は 5
スライムを捕まえた!
ゴブリンが現れた!
ゴブリンがサイコロを振った。出目は 4
サイコロを振りますか? (yes/no): no
ドラゴンが現れた!
ドラゴンがサイコロを振った。出目は 6
サイコロを振りますか? (yes/no): yes
プレイヤーがサイコロを振った。出目は 6
引き分けでもう一度!
ドラゴンがサイコロを振った。出目は 2
サイコロを振りますか? (yes/no): yes
プレイヤーがサイコロを振った。出目は 1
ドラゴンを捕まえられなかった。ゲームオーバー!
捕まえたモンスター: [スライム]
ゲーム終了

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

この問題を解くヒント

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

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

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

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

2.モンスタークラスの定義
 2-1. プライベートフィールド name の定義
  2-1-1. モンスタークラスのコンストラクタ
   2-1-1-1. コンストラクタでフィールド name を初期化
  2-1-2. getName メソッド
   2-1-2-1. name フィールドを返す
  2-1-3. diceRoll メソッド
   2-1-3-1. Random オブジェクトを使って1から6までのランダムな数字を生成して返す

3.MonsterCaptureGameクラスの定義
 3-1. mainメソッド
  3-1-1. Scannerオブジェクトの作成
  3-1-2. モンスターリストの作成
   3-1-2-1. スライム、ゴブリン、ドラゴンのモンスターをリストに追加
  3-1-3. 捕まえたモンスターのリストを作成
  3-1-4. 各モンスターとの対決
   3-1-4-1. forループを使って各モンスターを順番に処理
   3-1-4-2. モンスターが現れたことを表示
   3-1-4-3. captured フラグを初期化
   3-1-4-4. whileループを使ってモンスターと対決
    3-1-4-4-1. モンスターがサイコロを振る
    3-1-4-4-2. モンスターの出目を表示
    3-1-4-4-3. プレイヤーにサイコロを振るかどうかを尋ねる
    3-1-4-4-4. プレイヤーがサイコロを振らない場合はbreak
    3-1-4-4-5. プレイヤーがサイコロを振る
    3-1-4-4-6. プレイヤーの出目を表示
    3-1-4-4-7. 出目を比較してモンスターを捕まえたかどうかを判断
     3-1-4-4-7-1. プレイヤーの出目がモンスターの出目より高い場合
      3-1-4-4-7-1-1. モンスターを捕まえたことを表示し、リストに追加
      3-1-4-4-7-1-2. captured フラグをtrueに設定
     3-1-4-4-7-2. プレイヤーの出目とモンスターの出目が同じ場合
      3-1-4-4-7-2-1. 引き分けを表示し、再度サイコロを振る
     3-1-4-4-7-3. プレイヤーの出目がモンスターの出目より低い場合
      3-1-4-4-7-3-1. モンスターを捕まえられなかったことを表示し、ゲームオーバー
      3-1-4-4-7-3-2. whileループをbreak
   3-1-4-5. モンスターが捕まえられなかった場合は forループをbreak
  3-1-5. 捕まえたモンスターのリストを表示
  3-1-6. ゲーム終了のメッセージを表示

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

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

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

// モンスタークラス
class Monster {
    private String name;
    
    // コンストラクタ
    public Monster(String name) {
        ***ここにコンストラクタのコードを書いてください***
    }

    // モンスター名を取得するメソッド
    public String getName() {
        ***ここにモンスター名を取得するメソッドのコードを書いてください***
    }

    // サイコロを振るメソッド
    public int diceRoll() {
        ***ここにサイコロを振るメソッドのコードを書いてください***
    }
}

public class MonsterCaptureGame {
    public static void main(String[] args) {
        Scanner scanner = ***ここにスキャナーを作成するコードを書いてください***;
        ArrayList<Monster> monsters = new ArrayList<Monster>();
        ***ここにモンスターをリストに追加するコードを書いてください***

        ArrayList<String> capturedMonsters = new ArrayList<String>();
        
        // 各モンスターとの対決
        for (Monster monster : monsters) {
            System.out.println(monster.getName() + "が現れた!");
            boolean captured = false;

            while (!captured) {
                int monsterRoll = ***ここにモンスターがサイコロを振るコードを書いてください***;
                System.out.println(monster.getName() + "がサイコロを振った。出目は " + monsterRoll);

                System.out.print("サイコロを振りますか? (yes/no): ");
                String response = scanner.next();

                if (response.equalsIgnoreCase("no")) {
                    break;
                }

                int playerRoll = ***ここにプレイヤーがサイコロを振るコードを書いてください***;
                System.out.println("プレイヤーがサイコロを振った。出目は " + playerRoll);

                // ***ここでプレイヤーの出目とモンスターの出目を比較して、モンスターを捕まえるかどうかを判断するコードを書いてください***
            }
            if (!captured) {
                break;
            }
        }

        // ***ここで捕まえたモンスターのリストを表示し、ゲーム終了のメッセージを表示するコードを書いてください***
    }
}

 

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



解答例

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

正解コードの例

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

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

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("ゲーム終了");
  • ゲーム終了時に、捕まえたモンスターの一覧を表示します。
  • 最後に「ゲーム終了」と表示してプログラムが終了します。
<<前の問題 問題集Top 次の問題>>




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

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

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






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