【JAVA】確認問題3-☆2:丁半賭博ゲームを作ろう

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

この記事の練習問題で使用する知識:
基礎文法(レッスン1)比較演算子と論理演算子if文による条件分岐while文による繰り返し処理繰り返しの制御メソッドの定義と呼出しメソッドの戻り値真偽値を返すメソッド

JAVAのゲームコード一覧はこちら

<<前のページ 問題集Top 次のページ>>

JAVA練習問題3-☆2_丁半賭博ゲーム





簡単な「丁半賭博」ゲームを作成しましょう。

丁半賭博ゲームはコンピュータがサイコロを2つ振り、出た目の合計が偶数か奇数かをユーザーが予想します。予想が当たると賭け金が2倍になり、外れると賭け金が失われます。

ゲームを繰り返すごとに所持金が変動し、ユーザーが続けたい限りゲームは繰り返されます。

この問題の要件

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

  • サイコロの出目はランダムで1から6までの整数を使用すること。
  • プレイヤーの初期所持金を1000円と設定すること。
  • 賭け金はプレイヤーの所持金以下の金額である必要があり、不正な入力には再度入力を求めること。
  • ユーザーが「丁(0)」または「半(1)」を選択する際、不正な入力には再度入力を求めること。
  • サイコロの目の合計が偶数なら「丁」、奇数なら「半」とすること。
  • 勝敗に応じて、プレイヤーの所持金を更新すること。
  • ゲームの継続をユーザーに確認し、「はい(0)」または「いいえ(1)」を選択させること。不正な入力には再度入力を求めること。
  • ゲーム終了時、最終的な所持金を表示して終了すること。

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

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

丁半賭博ゲームを始めます!
プレイヤーの所持金: 1000円
いくらかけますか? ⇒ 300
丁か半か?(丁:0,半:1) ⇒ 0
サイコロの目: 4, 2 ⇒ 丁
あなたの勝ち!賞金は300円
続けますか?(はい:0,いいえ:1)0
プレイヤーの所持金: 1300円
いくらかけますか? ⇒ 500
丁か半か?(丁:0,半:1) ⇒ 1
サイコロの目: 1, 6 ⇒ 半
あなたの負け!500円没収!
続けますか?(はい:0,いいえ:1)1
最終所持金は800円でした。
丁半賭博ゲームを終わります。

この問題を解くヒント

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

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

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

1:RandomクラスとScannerクラスをインポート
2:ChoHanGameクラスの定義
  □ getBetメソッドの定義
  □ □ ユーザーに掛け金を入力させ、変数betに代入
  □ □ betが所持金以内で正の数かどうか判定
  □ □ 真の場合、betを返す
  □ □ 偽の場合、エラーメッセージを表示し、再入力を促す
  □ getChoiceメソッドの定義
  □ □ ユーザーに丁か半かの選択をさせ、変数choiceに代入
  □ □ choiceが0または1であるかどうか判定
  □ □ 真の場合、choiceを返す
  □ □ 偽の場合、エラーメッセージを表示し、再入力を促す
  □ rollDiceメソッドの定義
  □ □ サイコロ2つの目をランダムに生成し、dice1とdice2に代入
  □ □ dice1とdice2を配列として返す
  □ askContinueメソッドの定義
  □ □ ユーザーに続けるかどうかの選択をさせ、変数continueGameに代入
  □ □ continueGameが0の場合、trueを返す
  □ □ continueGameが1の場合、falseを返す
  □ □ 偽の場合、エラーメッセージを表示し、再入力を促す
  □ mainメソッドの定義
  □ □ 「丁半賭博ゲームを始めます!」と表示
  □ □ 変数moneyに1000を代入して初期所持金を設定
  □ □ whileループをmoneyが0より大きい限り繰り返す
  □ □ □ 所持金を表示
  □ □ □ getBetメソッドを呼び出し、賭け金を取得して変数betに代入
  □ □ □ getChoiceメソッドを呼び出し、丁か半かの選択を取得して変数choiceに代入
  □ □ □ rollDiceメソッドを呼び出し、サイコロの目の合計diceSumを計算
  □ □ □ サイコロの目と結果を表示
  □ □ □ if文にて予想が当たったか判定
  □ □ □ □ 真の場合、賞金を所持金に加算し、「あなたの勝ち!」と表示
  □ □ □ □ 偽の場合、掛け金を所持金から減算し、「あなたの負け!」と表示
  □ □ □ 所持金が残っている場合、askContinueメソッドを呼び出し、続行の確認
  □ □ □ □ 続行しない場合、最終所持金を表示し、breakでループ終了
  □ □ □ 所持金が0になった場合、「所持金がなくなりました。ゲームを終了します。」と表示してループ終了
  □ □ 「丁半賭博ゲームを終わります。」と表示
  □ □ scannerを閉じる

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

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

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

public class ChoHanGame {

    /*【穴埋め問題1】
    getBetメソッドを定義し、ユーザーに賭け金を入力させて所持金以内であるかを確認するコードを書いてください。
    */

    /*【穴埋め問題2】
    getChoiceメソッドを定義し、ユーザーに「丁」か「半」かを選択させるコードを書いてください。
    */

    /*【穴埋め問題3】
    rollDiceメソッドを定義し、サイコロ2つの目をランダムに生成し、合計を計算するコードを書いてください。
    */

    /*【穴埋め問題4】
    askContinueメソッドを定義し、ゲームを続けるかどうかユーザーに確認するコードを書いてください。
    */

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("丁半賭博ゲームを始めます!");

        int money = 1000; // プレイヤーの初期所持金

        while (money > 0) {
            System.out.println("プレイヤーの所持金: " + money + "円");

            /*【穴埋め問題5】
            getBetメソッドを呼び出し、賭け金を取得して変数betに代入してください。
            */

            /*【穴埋め問題6】
            getChoiceメソッドを呼び出し、丁か半かの選択を取得して変数choiceに代入してください。
            */

            /*【穴埋め問題7】
            rollDiceメソッドを呼び出し、サイコロの目の合計diceSumを計算し、その結果を表示するコードを書いてください。
            */

            /*【穴埋め問題8】
            if文を使ってプレイヤーの選択とサイコロの合計を比較し、当たり外れに応じて所持金を更新するコードを書いてください。
            */

            if (money > 0) {
                /*【穴埋め問題9】
                askContinueメソッドを呼び出してゲームを続けるかどうか確認し、falseが返ってきたらループを終了するコードを書いてください。
                */
            } else {
                System.out.println("所持金がなくなりました。ゲームを終了します。");
                break;
            }
        }

        System.out.println("丁半賭博ゲームを終わります。");
    }
}

この問題の穴埋めコードは以上です。

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

解答例

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

正解コードの例

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

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

public class ChoHanGame {

    // 掛け金を入力するメソッド
    public static int getBet(int money, Scanner scanner) {
        while (true) {
            System.out.print("いくらかけますか? ⇒ ");
            int bet = scanner.nextInt();
            if (bet > 0 && bet <= money) {
                return bet;
            } else {
                System.out.println("無効な入力です!所持金以内の正しい金額を入力してください。");
            }
        }
    }

    // 丁か半かを選択するメソッド
    public static int getChoice(Scanner scanner) {
        while (true) {
            System.out.print("丁か半か?(丁:0,半:1) ⇒ ");
            int choice = scanner.nextInt();
            if (choice == 0 || choice == 1) {
                return choice;
            } else {
                System.out.println("無効な入力です!0か1を入力してください。");
            }
        }
    }

    // サイコロを振るメソッド
    public static int[] rollDice() {
        Random random = new Random();
        int dice1 = random.nextInt(6) + 1;
        int dice2 = random.nextInt(6) + 1;
        return new int[]{dice1, dice2};
    }

    // 続けるかどうかを確認するメソッド
    public static boolean askContinue(Scanner scanner) {
        while (true) {
            System.out.print("続けますか?(はい:0,いいえ:1) ⇒ ");
            int continueGame = scanner.nextInt();
            if (continueGame == 0) {
                return true;
            } else if (continueGame == 1) {
                return false;
            } else {
                System.out.println("無効な入力です!0か1を入力してください。");
            }
        }
    }

    // メインのゲームメソッド
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("丁半賭博ゲームを始めます!");
        
        int money = 1000; // プレイヤーの初期所持金
        
        while (money > 0) {
            System.out.println("プレイヤーの所持金: " + money + "円");
            
            // 掛け金を取得
            int bet = getBet(money, scanner);
            
            // 丁か半かの選択
            int choice = getChoice(scanner);
            
            // サイコロを振る
            int[] dice = rollDice();
            int diceSum = dice[ 0] + dice[ 1];
            System.out.println("サイコロの目: " + dice[ 0] + ", " + dice[ 1] + " ⇒ " + (diceSum % 2 == 0 ? "丁" : "半"));
            
            // 勝敗判定
            if ((diceSum % 2 == 0 && choice == 0) || (diceSum % 2 != 0 && choice == 1)) {
                System.out.println("あなたの勝ち!賞金は" + bet + "円");
                money += bet;
            } else {
                System.out.println("あなたの負け!" + bet + "円没収!");
                money -= bet;
            }
            
            // 続けるかどうかを確認
            if (money > 0) {
                if (!askContinue(scanner)) {
                    System.out.println("最終所持金は" + money + "円でした。");
                    break;
                }
            } else {
                System.out.println("所持金がなくなりました。ゲームを終了します。");
                break;
            }
        }
        
        System.out.println("丁半賭博ゲームを終わります。");
    }
}

正解コードの解説

この解説ではJavaの丁半賭博ゲームコードをブロックごとに分けて、その内容を説明していきます。

このコードではランダムに生成されるサイコロの目の合計が「丁(偶数)」か「半(奇数)」かを予想するゲームを構築しています。

ランダムと入力のためのクラスをインポート

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

まずRandomクラスとScannerクラスをインポートしています。

Randomクラスはサイコロの目をランダムに生成するために使用し、Scannerクラスはユーザーからの入力を受け取るために使用します。

賭け金を設定するメソッド

public static int getBet(int money, Scanner scanner) {
    while (true) {
        System.out.print("いくらかけますか? ⇒ ");
        int bet = scanner.nextInt();
        if (bet > 0 && bet <= money) {
            return bet;
        } else {
            System.out.println("無効な入力です!所持金以内の正しい金額を入力してください。");
        }
    }
}

このメソッドはプレイヤーに賭け金を入力させます。

whileループを使用して賭け金が所持金以内で正しいかどうかを確認し、不正な入力の場合は再度入力を求めます。

  • if文で賭け金が正しい範囲かを確認します。
  • 正しい場合はbetを返し、不正な場合はエラーメッセージを表示して再入力を促します。

丁か半かを選択するメソッド

public static int getChoice(Scanner scanner) {
    while (true) {
        System.out.print("丁か半か?(丁:0,半:1) ⇒ ");
        int choice = scanner.nextInt();
        if (choice == 0 || choice == 1) {
            return choice;
        } else {
            System.out.println("無効な入力です!0か1を入力してください。");
        }
    }
}

このメソッドではプレイヤーに「丁」か「半」を選ばせます。0が丁、1が半を意味しています。

間違った値を入力するとエラーメッセージが表示され、再度入力を促されます。

サイコロを振るメソッド

public static int[] rollDice() {
    Random random = new Random();
    int dice1 = random.nextInt(6) + 1;
    int dice2 = random.nextInt(6) + 1;
    return new int[]{dice1, dice2};
}

このメソッドでは2つのサイコロを振って、ランダムな目を取得します。

  • random.nextInt(6) + 1で、1から6までの目がランダムに出るようにしています。
  • int[]配列に2つのサイコロの目を格納して返します。

ゲームの続行を確認するメソッド

public static boolean askContinue(Scanner scanner) {
    while (true) {
        System.out.print("続けますか?(はい:0,いいえ:1) ⇒ ");
        int continueGame = scanner.nextInt();
        if (continueGame == 0) {
            return true;
        } else if (continueGame == 1) {
            return false;
        } else {
            System.out.println("無効な入力です!0か1を入力してください。");
        }
    }
}

このメソッドではプレイヤーがゲームを続けるかどうかを尋ねます。

0を入力すると続行、1を入力すると終了します。再入力を求める仕組みも含まれています。

メインのゲーム処理

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("丁半賭博ゲームを始めます!");

    int money = 1000; // プレイヤーの初期所持金

    while (money > 0) {
        System.out.println("プレイヤーの所持金: " + money + "円");

        int bet = getBet(money, scanner);

        int choice = getChoice(scanner);

        int[] dice = rollDice();
        int diceSum = dice[ 0] + dice[ 1];
        System.out.println("サイコロの目: " + dice[ 0] + ", " + dice[ 1] + " ⇒ " + (diceSum % 2 == 0 ? "丁" : "半"));

mainメソッドはJavaプログラムの開始地点です。

  • プレイヤーの初期所持金をmoneyとして設定し、ゲームが続行される限りwhileループを使います。
  • getBetで賭け金を決定し、getChoiceで「丁」か「半」を選びます。
  • rollDiceでサイコロを振り、結果を表示します。diceSum % 2 == 0で「丁」か「半」を判定します。

勝敗の判定

        if ((diceSum % 2 == 0 && choice == 0) || (diceSum % 2 != 0 && choice == 1)) {
            System.out.println("あなたの勝ち!賞金は" + bet + "円");
            money += bet;
        } else {
            System.out.println("あなたの負け!" + bet + "円没収!");
            money -= bet;
        }

サイコロの目の合計(偶数なら丁、奇数なら半)がプレイヤーの選択と一致するか判定しています。

  • 一致する場合は、賭け金を所持金に加算して「あなたの勝ち!」と表示します。
  • 一致しない場合は賭け金を所持金から引き、「あなたの負け!」と表示します。

ゲームの続行判定と終了処理

        if (money > 0) {
            if (!askContinue(scanner)) {
                System.out.println("最終所持金は" + money + "円でした。");
                break;
            }
        } else {
            System.out.println("所持金がなくなりました。ゲームを終了します。");
            break;
        }
    }

    System.out.println("丁半賭博ゲームを終わります。");
}
  • プレイヤーが所持金を失うか、askContinueで終了を選ぶまでゲームは続きます。
  • 所持金がなくなるとゲームを自動的に終了し、「丁半賭博ゲームを終わります」と表示します。

まとめ

この丁半賭博ゲームはランダム性や入力処理、条件分岐を活用した基本的なプログラムです。

Javaの標準ライブラリのRandomScannerを活用して、ゲームらしいインタラクティブな動作を実現しています。

次のステップではこのコードを自分で実行したり、変更を加えてさらに学習を進めてみましょう。

<<前のページ 問題集Top 次のページ>>

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

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

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






    JAVAテキスト&問題集へ戻る
    トップページへ戻る