Javaアプリケーション① – じゃんけんゲーム

プログラミング

みなさんこんにちは、一星零哉です。

今回作成、解説していくのはJavaで実装する「じゃんけんゲーム」アプリです。

さっそく作っていきましょう!

要件と設計

このアプリケーションの要件は「コンソール上でアプリケーションとじゃんけん勝負を実施し、結果を標準出力する」ことです。

ざっくりと処理の流れを見ていきましょう。

  1. アプリ起動
  2. じゃんけんをするかどうかのメッセージに対してyを入力する
  3. ユーザがじゃんけんの手を入力する
  4. 入力値チェックをする
    • 1〜3以外の文字が入力された場合はアプリを終了する
  5. アプリケーションの手を設定する
    • 乱数を生成し、10倍して小数点以下を四捨五入する
    • 以下の条件でじゃんけんの手を設定する
      • 1〜3→グー
      • 4〜6→チョキ
      • 7〜9→パー
      • 0→再度乱数を生成する
  6. ユーザの手とアプリケーションの手で勝敗を判定し、その結果を標準出力する
    • あいこの場合
      • 再度ユーザの手とアプリケーションの手を設定してじゃんけんをし直す
    • あいこでない場合
      • ユーザの手とアプリケーションの手を比較して、結果を標準出力する

以上です!

フローはこんな感じ。じゃんけんの勝敗判定のロジックは割愛させてください。

実行

このアプリケーションを実行したときの挙動を確認しましょう。

アプリケーションを実行すると、以下のメッセージが標準出力されます。

yを入力すると、じゃんけんを促すメッセージが表示されます。

1〜3を入力するとじゃんけん勝負の処理が実行され、勝負の結果が標準出力されます。

ここからはエラーハンドリングです。

じゃんけんの起動や手を選ぶ際に、想定外の値を入力するとエラーメッセージを標準出力してアプリケーションが終了します。

実装

以下のように実装してみました。

今回はリファクタリングも済ませている状態です。

JavaのバージョンはJavaSE-21です。

package janken;

import java.util.Scanner;

public class ExeJanken {
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		Scanner scanner = new Scanner(System.in);
		String userIn;
		String tmpUserInRSPnum = null;
		int userRSP = 0;
		int appRSP = 0;
		boolean rst;
		String msg = null;

		System.out.println(Const.MSG_JANKEN_START);
		userIn = scanner.nextLine();

		if(!userIn.equals("y")) {
			System.out.println(Const.MSG_ERR_NOT_Y);
			System.exit(1);
		}

		System.out.println(Const.MSG_BATTLE_CALL1);
		System.out.println(Const.MSG_BATTLE_CALL2);
		System.out.println(Const.MSG_SELECT_RSP);

		// ユーザとアプリケーションが出す手を設定する
		userRSP = SetUserRSP(scanner, tmpUserInRSPnum);
		appRSP = SetAppRSP(appRSP);

		// じゃんけんの勝敗を判定する
		rst = LgcJanken(userRSP, appRSP, scanner, tmpUserInRSPnum);

		// 出力するメッセージを設定する
		if(rst) {
			msg = Const.MSG_WIN;
		} else {
			msg = Const.MSG_LOSE;
		}

		System.out.println(msg);

	}

	// ユーザの入力値からユーザのじゃんけんの手を設定する
	private static int SetUserRSP(Scanner scanner, String tmpUserInRSPnum) {
		tmpUserInRSPnum = scanner.nextLine();

		ChkUserInput(tmpUserInRSPnum);

		return Integer.parseInt(tmpUserInRSPnum);
	}

	// ユーザの入力値が不正でないかを判定する
	private static void ChkUserInput(String tmpUserInRSPnum) {
		if(!(tmpUserInRSPnum.length() == 1)) {
			System.out.println(Const.MSG_ERR_ILLEGAL_INPUT);
			System.exit(1);
		}

		if(!Character.isDigit(tmpUserInRSPnum.charAt(0))){
			System.out.println(Const.MSG_ERR_NOT_FROM_1_TO_3);
			System.exit(1);
		}

		if(Integer.parseInt(String.valueOf(tmpUserInRSPnum.charAt(0))) < 1
				|| Integer.parseInt(String.valueOf(tmpUserInRSPnum.charAt(0))) > 3) {
			System.out.println(Const.MSG_ERR_NOT_FROM_1_TO_3);
			System.exit(1);
		}

	}

	// アプリケーションのじゃんけんの手を設定する
	private static int SetAppRSP(int appRSP) {
		double appRSPnum = 0;

		while(appRSPnum == 0) {
			appRSPnum = Math.floor(Math.random() * 10);
		}

		appRSP = 0;
		if(appRSPnum >= 1 && appRSPnum <= 3) {
			appRSP = 1;
		} else if(appRSPnum >= 4 && appRSPnum <= 6) {
			appRSP = 2;
		} else if(appRSPnum >= 7 && appRSPnum <= 9) {
			appRSP = 3;
		}

		return appRSP;

	}

	// じゃんけんの勝敗を判定する
	private static boolean LgcJanken(int userRSP, int appRSP, Scanner scanner, String tmpUserInRSPnum) {
		boolean aikFlg = false;
		int battleCnt = 0;
		boolean rst = false;

		while((!aikFlg && battleCnt == 0) || (aikFlg && battleCnt > 0)) {
			// あいこの判定
			if(userRSP == appRSP) {
				aikFlg = true;
				System.out.println(Const.MSG_RST_AIK);

				System.out.println(Const.MSG_AIK_CALL1);
				System.out.println(Const.MSG_SELECT_RSP);

				userRSP = SetUserRSP(scanner, tmpUserInRSPnum);
				appRSP = SetAppRSP(appRSP);

				continue;
			}

			if((userRSP == 1 && appRSP == 2)
					|| (userRSP == 2 && appRSP == 3)
					|| (userRSP == 3 && appRSP == 1)) {
				// 勝ちの場合
				aikFlg = false;
				rst = true;
			} else {
				// 負けの場合
				aikFlg = false;
			}

			battleCnt++;

		}

		return rst;
	}

}

package janken;

public class Const {
	public static String MSG_JANKEN_START = "じゃんけんをしますか?(\"y\"を入力でスタート)";
	public static String MSG_ERR_NOT_Y = "y以外の入力は無効です。再度アプリケーションを実行してください。";
	public static String MSG_BATTLE_CALL1 = "最初はグー";
	public static String MSG_BATTLE_CALL2 = "じゃんけん";
	public static String MSG_SELECT_RSP = "出す手を選択(「グー(1)」「チョキ(2)」「パー(3)」から番号で選択)";
	public static String MSG_ERR_ILLEGAL_INPUT = "入力した文字数は無効です。再度アプリケーションを実行してください。";
	public static String MSG_ERR_NOT_FROM_1_TO_3 = "1〜3以外の入力は無効です。再度アプリケーションを実行してください。";
	public static String MSG_RST_AIK = "あいこ!もう一回!";
	public static String MSG_AIK_CALL1 = "あいこで。。。";
	public static String MSG_WIN = "あなたの勝ち!";
	public static String MSG_LOSE = "あなたの負け。。。";

}

これまで作ってきたアプリケーションとは違って、ステップ数が100を超えていたりクラスが1つではなくなったりして、身構えてしまう方もいらっしゃるかもしれませんね。

でも大丈夫!一つずつ見ていけば難しいことはやっていません。

次回の記事で詳細に解説していくので、しっかり理解していきましょうね!

次回

次回はコードの解説をしていきます。

ここまでお読みいただきありがとうございました!

この記事を閉じる前に、XInstagramのフォローもよろしくお願いします!

また次の記事でお会いしましょう!

コメント