😎

✌️Javaであっちむいてホイゲームを作ってみよう 練習課題

2024/04/10に公開

■ あっちむいてホイゲームをJavaで実装する
●はじめに
-遊んでみた感想
お互いに出す手は3通りで、方向が4通りなので、あいこ&引き分けになることが多いです。ただ、何回か遊んでみたらちょっとワクワクする感じに接戦が多かったので楽しかったです。

●対象:繰り返し処理とメソッドの使い方を覚えた人向け

●目的:CPUを対戦相手に、じゃんけんとあっちむいてホイをします。ゲーム終了時にあなたが何回遊んで何回勝ったかを出力するプログラムを作成します。

●本記事のキーワード
#Java #じゃんけん #練習 #練習問題 #Map #アルゴリズム #Random #ゲーム

●プログラムの説明
軸としては下記ポイントをおさえてください。
・あっちむいてホイであなたが勝ったら1ポイント、負けたら1ポイント。
・勝ちポイントと負けポイントを比較して、ゲームを終了した後に勝敗結果を出力する。

まず、CPUと遊ぶ回数を指定します。遊ぶ回数分ゲームを繰り返します。
じゃんけんをして、判定を行います。
じゃんけんの判定結果で処理は以下の通りに分かれます。
A-1 あいこの場合→「あいこです」と出力して、あなたかCPUが勝つまでじゃんけんを続けます。
A-2 あなたが勝った場合→ あなたのターンになるので、「あなたが 1:上 2:右 3:下 4:左 のどれか一つを出します」を出力します。
A-3 CPUが勝った場合→ CPUのターンになるので、「CPUが 1:上 2:右 3:下 4:左 のどれか一つを出します」を出力します。

あなたは上右下左のどれか一つを選択したら、あなたとCPUの方向を画面に出力します。
指す方向の判定を行います。
方向の判定結果で処理は以下の通りに分かれます。
B-1 じゃんけんであなたが勝ちで、あなたとCPUの方向が同じ場合 → 「あなたが一点を取りました」と出力します。勝ちポイントとゲーム回数に1を加算します。
B-2 じゃんけんでCPUが勝ちで、あなたとCPUの方向が同じ場合 → 「CPUが一点を取りました」と出力します。負けポイントとゲーム回数に1を加算します。
B-3 方向が同じではなかった場合 → 「引き分けです 仕切り直し!」と出力します。じゃんけんに戻ります。

以上の処理を、遊ぶ回数分行います。
ただし、i回戦目で勝ちポイントもしくは負けポイントが上限÷2より多い場合はその時点でゲームを終了して、「X回戦目で勝敗が着きました」と出力して、ループを中止してください。
最後にあなたの勝ちポイントと負けポイントと勝敗結果を出力してプログラムを終了します。

●ソースコードを書く際の条件

  1. クラスは一つだけ宣言してください。
  2. Scannerを使わないでソースコードを書いてください。
  3. HashMap・Mapクラスを使用してください。
  4. inputReader()メソッド内で入力値が1以上であるかを判定してください。

■ テスト

  1. じゃんけんの結果あいこの場合ループ処理が終了しないこと。
  2. 入力した文字が不正の場合、再び入力処理に戻ること。
  3. 現在何回戦目かが正常に表示されること。
  4. じゃんけんであいこの場合「あいこです」と出力されること。
  5. CPUが出した手がUndefinedと表示されないこと。
  6. CPUが出した方向がUndefinedと表示されないこと。
  7. あなたがじゃんけんで勝ってあっちむいてホイでCPUと同じ方向になった場合「あなたが一点を取りました」と出力されること。
  8. あなたがじゃんけんで負けてあっちむいてホイでCPUと同じ方向になった場合「CPUが一点を取りました」と出力されること。
  9. あっちむいてホイでCPUと違う方向になった時「引き分けです 仕切り直し!」と出力されること。
  10. 勝ちポイントまたは負けポイントが遊ぶ回数の半分より多い場合、強制的にゲームを終了すること。
  11. ゲーム終了後、勝敗結果が出力されること。

--以下ソースコードを書く時に参考にしてください。--
●処理の簡単な説明
□ main()
startGame()を呼び出して遊ぶ回数をplayGame()に渡す。

□ startGame()
inputReader()を呼び出して、遊ぶ回数を指定する。

□ inputReader()
文字を入力し、その値を返す。

□ playGame()
以下要素を初期化設定する。
[プレイヤー、手、方向、ゲームカウント、判断結果、勝ちポイント、負けポイント]
遊ぶ回数分ゲームをループする。
(省略)

□ handsJudge()
じゃんけんの結果を返す。

□ directionJudge()
方向の判定結果を返す。

□ cpuHand()
CPUがランダムで数字を返す。[1-4]


●ヒント 省略のところを自力で書いてみましょう!
// 前略 必要なパッケージを書いてください
public class Main {
private static int inputReader() {
int input = -1;
try {
while (input >= 1) {
// 省略 ソースを書いてください
return input;
}

// 省略 ソースを書いてください
private static void result(int w, int l) {
    // 省略 ソースを書いてください
}

private static void playGame(int gameTimes) {
    // 必要なフィールドを書いてください
    // ループ処理を書く
       // 省略 ソースを書いてください
        if ((// 条件を書いてください)) {
            System.out.println(loopCount + "回戦目で勝敗が着きましたので、ゲームを終了します。");
            break;
        }
        gameFlag = 0; // ターンを終了し、じゃんけんに戻る
        System.out.println();
    }
    result(winCount, loseCount);
}

public static void main(String[] args) {     
    int gameTimes = startGame();
    playGame(gameTimes);
}

}


●あとがき
今回の課題では入力値を整数だけにしました。文字列を入力するバージョンのソースを書いて、同じようにプログラムが作成できるか試してみたいと思います。

Discussion