JAVA練習問題3-☆1:ナインゲームを作ろう

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

JAVAの初心者向け問題3-☆1:ナインゲームを作ろう

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

【レベル3の知識】
コレクションの基礎、コレクション(List, ArrayList)、コレクション(HashSet, TreeSet)コレクション(HashMap, TreeMap)

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

JAVA練習問題3-☆1:ナインゲームを作ろう

ナインゲームはプレイヤーとコンピュータが対戦するゲームです。

このゲームでは、プレイヤーとコンピュータが1から9までの数字の牌を持ち、それぞれのターンで1つの牌を出して勝負します。

大きい数字の牌を出した方がその数字と同じ点数を獲得し、一度出した牌は再度使用できません。

全ての牌を出し終えた時点で、より多くの得点を持っている方が勝利です。

この問題の要件

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

  • ゲーム開始時に「ナインゲームを開始します!」と表示すること。
  • プレイヤーとコンピュータは最初に1から9までの数字の牌を持つこと。
  • 各ターンでプレイヤーが出す牌を入力し、コンピュータが出す牌はランダムに選択すること。
  • 牌を出す前に両者の現在の得点を表示すること。
  • プレイヤーが牌を選択する前に、両者の持っている牌を表示すること。持っていない牌は「-」と表示すること。
  • 牌を選択した後、両者が出した牌を比較し、大きい数字を出した方にその数字と同じ得点を加算すること。
  • 勝負の結果を表示すること。
  • 全ての牌を出し終えたら最終的な得点を比較し、勝者を表示すること。

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

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

ナインゲームを開始します!

【第1回戦】
プレイヤーの得点 : 0点
コンピュータの得点: 0点
プレイヤーの持ち牌 ⇒ 「1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9」
コンピュータの持ち牌⇒ 「1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9」
持ち牌の中から出す牌を選択してください > 9
プレイヤーの打牌:9 > 5:コンピュータの打牌
プレイヤーは9点獲得

【第2回戦】
プレイヤーの得点 : 9点
コンピュータの得点: 0点
プレイヤーの持ち牌 ⇒ 「1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,-」
コンピュータの持ち牌⇒ 「1 ,2 ,3 ,4 ,-,6 ,7 ,8 ,9」
持ち牌の中から出す牌を選択してください > ...

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

この問題を解くヒント

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

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

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

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

2.NineGameクラスの定義

3.mainメソッド
 3-1. ゲーム開始のメッセージを表示
 3-2. ScannerオブジェクトとRandomオブジェクトを作成
 3-3. プレイヤーとコンピュータの得点を初期化
 3-4. プレイヤーとコンピュータの牌を初期化
 3-5. 繰り返し処理(全9回戦)
  3-5-1. 現在の得点を表示
  3-5-2. 両者の持ち牌を表示
  3-5-3. プレイヤーの牌を選択
   3-5-3-1. プレイヤーが選択した牌が有効か確認し、無効な場合は再入力を求める
  3-5-4. コンピュータの牌をランダムに選択
  3-5-5. 出した牌をリストから削除
  3-5-6. 出した牌を比較して得点を加算
 3-6. 最終結果を表示

4.initializeTilesメソッド
 4-1. 1から9までの牌を初期化してリストとして返す

5.tilesToStringメソッド
 5-1. 牌のリストを文字列に変換し、持っていない牌は「-」として表示する。表示形式に [] を追加

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

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

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

public class NineGame {

    public static void main(String[] args) {
        System.out.println("ナインゲームを開始します!");

        Scanner scanner = new Scanner(System.in);
        Random random = new Random();

        // プレイヤーとコンピュータの得点を初期化
        int playerScore = 0;
        int computerScore = 0;

        // プレイヤーとコンピュータの牌を初期化
        List<Integer> playerTiles = initializeTiles();
        List<Integer> computerTiles = initializeTiles();

        // 全9回戦
        for (int round = 1; round <= 9; round++) {
            // 現在の得点を表示
            System.out.println("\n【第" + round + "回戦】");
            System.out.println("プレイヤーの得点 : " + playerScore + "点");
            System.out.println("コンピュータの得点: " + computerScore + "点");

            // 両者の持ち牌を表示
            System.out.println("プレイヤーの持ち牌 ⇒ " + tilesToString(playerTiles));
            System.out.println("コンピュータの持ち牌⇒ " + tilesToString(computerTiles));

            // プレイヤーの牌を選択
            System.out.print("持ち牌の中から出す牌を選択してください > ");
            int playerTile = scanner.nextInt();

            // ***プレイヤーが選択した牌が有効かどうかを確認するコードを書いてください***

            // ***コンピュータの牌をランダムに選択するコードを書いてください***

            // 出した牌をリストから削除
            playerTiles.set(playerTiles.indexOf(playerTile), -1);
            computerTiles.set(computerTiles.indexOf(computerTile), -1);

            // 出した牌を比較して得点を加算
            System.out.println("プレイヤーの打牌:" + playerTile + " > " + computerTile + ":コンピュータの打牌");

            if (playerTile > computerTile) {
                playerScore += playerTile;
                System.out.println("プレイヤーは" + playerTile + "点獲得");
            } else if (playerTile < computerTile) {
                computerScore += computerTile;
                System.out.println("コンピュータは" + computerTile + "点獲得");
            } else {
                System.out.println("引き分けです");
            }
        }

        // 最終結果を表示
        System.out.println("\nゲーム終了!");
        System.out.println("プレイヤーの最終得点 : " + playerScore + "点");
        System.out.println("コンピュータの最終得点: " + computerScore + "点");

        if (playerScore > computerScore) {
            System.out.println("プレイヤーの勝利です!");
        } else if (playerScore < computerScore) {
            System.out.println("コンピュータの勝利です!");
        } else {
            System.out.println("引き分けです!");
        }
    }

    // 1から9までの牌を初期化するメソッド
    private static List<Integer> initializeTiles() {
        List<Integer> tiles = new ArrayList<>();
        for (int i = 1; i <= 9; i++) {
            tiles.add(i);
        }
        return tiles;
    }

    // 牌リストを文字列に変換するメソッド
    private static String tilesToString(List<Integer> tiles) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int tile : tiles) {
            if (tile == -1) {
                sb.append("- ,");
            } else {
                sb.append(tile).append(" ,");
            }
        }
        sb.delete(sb.length() - 2, sb.length()); // 最後のカンマとスペースを削除
        sb.append("]");
        return sb.toString();
    }
}

 

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

解答例

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

正解コードの例

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

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

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

public class NineGame {

    public static void main(String[] args) {
        System.out.println("ナインゲームを開始します!");

        Scanner scanner = new Scanner(System.in);
        Random random = new Random();

        // プレイヤーとコンピュータの得点を初期化
        int playerScore = 0;
        int computerScore = 0;

        // プレイヤーとコンピュータの牌を初期化
        List<Integer> playerTiles = initializeTiles();
        List<Integer> computerTiles = initializeTiles();

        // 全9回戦
        for (int round = 1; round <= 9; round++) {
            // 現在の得点を表示
            System.out.println("\n【第" + round + "回戦】");
            System.out.println("プレイヤーの得点 : " + playerScore + "点");
            System.out.println("コンピュータの得点: " + computerScore + "点");

            // 両者の持ち牌を表示
            System.out.println("プレイヤーの持ち牌 ⇒ " + tilesToString(playerTiles));
            System.out.println("コンピュータの持ち牌⇒ " + tilesToString(computerTiles));

            // プレイヤーの牌を選択
            System.out.print("持ち牌の中から出す牌を選択してください > ");
            int playerTile = scanner.nextInt();

            // プレイヤーが選択した牌が有効かどうかを確認
            while (!playerTiles.contains(playerTile)) {
                System.out.print("無効な選択です。もう一度選んでください > ");
                playerTile = scanner.nextInt();
            }

            // コンピュータの牌をランダムに選択
            int computerTile;
            do {
                computerTile = random.nextInt(9) + 1;
            } while (!computerTiles.contains(computerTile));

            // 出した牌をリストから削除
            playerTiles.set(playerTiles.indexOf(playerTile), -1);
            computerTiles.set(computerTiles.indexOf(computerTile), -1);

            // 出した牌を比較して得点を加算
            System.out.println("プレイヤーの打牌:" + playerTile + " > " + computerTile + ":コンピュータの打牌");

            if (playerTile > computerTile) {
                playerScore += playerTile;
                System.out.println("プレイヤーは" + playerTile + "点獲得");
            } else if (playerTile < computerTile) {
                computerScore += computerTile;
                System.out.println("コンピュータは" + computerTile + "点獲得");
            } else {
                System.out.println("引き分けです");
            }
        }

        // 最終結果を表示
        System.out.println("\nゲーム終了!");
        System.out.println("プレイヤーの最終得点 : " + playerScore + "点");
        System.out.println("コンピュータの最終得点: " + computerScore + "点");

        if (playerScore > computerScore) {
            System.out.println("プレイヤーの勝利です!");
        } else if (playerScore < computerScore) {
            System.out.println("コンピュータの勝利です!");
        } else {
            System.out.println("引き分けです!");
        }
    }

    // 1から9までの牌を初期化するメソッド
    private static List<Integer> initializeTiles() {
        List<Integer> tiles = new ArrayList<>();
        for (int i = 1; i <= 9; i++) {
            tiles.add(i);
        }
        return tiles;
    }

    // 牌リストを文字列に変換するメソッド
    private static String tilesToString(List<Integer> tiles) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int tile : tiles) {
            if (tile == -1) {
                sb.append("- ,");
            } else {
                sb.append(tile).append(" ,");
            }
        }
        sb.delete(sb.length() - 2, sb.length()); // 最後のカンマとスペースを削除
        sb.append("]");
        return sb.toString();
    }
}

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

コードの解説

このJAVAコードは、プレイヤーとコンピュータが9回戦のゲームを行う「ナインゲーム」をシミュレーションするものです。

それぞれのラウンドで、プレイヤーとコンピュータは1から9までの数字を牌として出し合い、数字が大きい方が勝者となります。

各ラウンドで得点が加算され、最終的に得点が多い方が勝者です。

ゲーム開始のメッセージ表示

System.out.println("ナインゲームを開始します!");

System.out.printlnは、コンソールにメッセージを表示するためのメソッドです。

ゲームが開始する際に「ナインゲームを開始します!」というメッセージを表示します。

プレイヤーとコンピュータのスコアの初期化

int playerScore = 0;
int computerScore = 0;

プレイヤーとコンピュータの得点を初期化しています。初めての得点はどちらも0点です。

プレイヤーとコンピュータの牌の初期化

List<Integer> playerTiles = initializeTiles();
List<Integer> computerTiles = initializeTiles();

牌(1から9の数字)をリストとして用意しています。

initializeTilesメソッドを使用して、1から9の数字が含まれたリストを初期化します。

プレイヤーとコンピュータでそれぞれ同じ牌を持っています。

ゲームのラウンド処理

for (int round = 1; round <= 9; round++) {
    // 現在のラウンドや得点の表示
    ...
}

ゲームは9回戦で行われるため、forループを使って9回繰り返します。

各ラウンドごとにプレイヤーとコンピュータが1つの牌を出し合い、勝敗を決めます。

プレイヤーの牌の選択

System.out.print("持ち牌の中から出す牌を選択してください > ");
int playerTile = scanner.nextInt();

プレイヤーは持っている牌から1つ選びます。

scanner.nextInt()を使って、プレイヤーが入力した数値を取得しています。

コンピュータの牌の選択

int computerTile;
do {
    computerTile = random.nextInt(9) + 1;
} while (!computerTiles.contains(computerTile));

コンピュータはランダムに牌を選びます。

random.nextInt(9) + 1で1から9までの数値を生成し、まだ使用していない牌を選びます。

出した牌の比較と得点加算

if (playerTile > computerTile) {
    playerScore += playerTile;
    System.out.println("プレイヤーは" + playerTile + "点獲得");
} else if (playerTile < computerTile) {
    computerScore += computerTile;
    System.out.println("コンピュータは" + computerTile + "点獲得");
} else {
    System.out.println("引き分けです");
}

プレイヤーとコンピュータが出した牌を比較し、数字が大きい方がその牌の点数を得ます。

同じ数字の場合は引き分けとなり、どちらも得点は入りません。

ゲーム終了時の結果表示

System.out.println("プレイヤーの最終得点 : " + playerScore + "点");
System.out.println("コンピュータの最終得点: " + computerScore + "点");

全9回戦が終わると、最終的な得点が表示され、プレイヤーとコンピュータのどちらが勝ったかを判定します。

勝者には「勝利」と表示され、同点の場合は「引き分け」となります。

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

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

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

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






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