Javaアプリケーション – じゃんけんゲーム③ アプリケーション側の手を設定し勝敗を判定する

プログラミング

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

今回はじゃんけんゲームアプリのコード解説の続きをしていきます。

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

このブログについて

「Javaの基礎構文は勉強したけど、次のステップはどうしたらいいんだろう?」

「実践的にJavaを学習するにはどうしたらいいんだろう?」

そんな疑問をお持ちの方、いらっしゃいますよね。

このブログでは、簡単なアプリケーションの開発を通じ、Javaプログラムの設計、メソッドの概要、使い方について実践的に学ぶことができるコンテンツを提供しています!

要件だけを見て自分なりにコードを書いてみるもよし、知識を深めるための読み物として使うもよしです!

Javaのレベルアップを目指す方は、ぜひ今後とも本ブログのチェックをお願いします!

ChkUserInputメソッド – ユーザの入力値をチェックする

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);
	}

}

SetUserRSPメソッドから呼び出される、入力値のチェックメソッドです。

判定する基準は3つで、①1文字以上入力されていないか、②数字以外の文字が入力されていないか、③1未満または3より大きな数値が入力されていないか、を判定しています。

この判定基準としているのは、想定している入力値が1〜3の数値のみだからです。

これ以外が入力された場合は「1〜3以外の入力は無効です。再度アプリケーションを実行してください。」のメッセージを標準出力してアプリケーションの実行を終了します。

exitメソッド – プログラムの実行を強制終了させる

exitメソッドは実行中のJava仮想マシンを終了させるメソッドです。

引数にはステータスコードを渡します。

通常、正常終了は0、警告終了や以上終了の場合はそれ以外の数値で設計されることが多いです。

今回は1を渡すことにしました。

とはいえ、このアプリケーションはステータスコードを使用する設計にはなっていないので、渡す値はなんでも良いのですが。

isDigitメソッド – 文字が数字かどうかを判定する

isDigitメソッドは、その「文字」が数字かどうかを判定するメソッドです。

「文字列」を判定するわけではない点に注意してください。

今回はチェック対象が1文字なので意識されませんが、2文字以上の文字列を数字チェックする場合は繰り返し処理を回して先頭の1文字目から順番に判定する必要があります。

判定は大きな括りからひとつずつ

入力値などのチェックは、大きな括り、言い換えれば「引っかかる可能性が高い」項目から判定していくと効率よく不正値を弾くことができます。

例えばですが、繰り返し処理でチェックデジットしたものの、そもそも文字数が1文字ではありませんでした、なんてことがあったら、チェックデジットするだけ無駄ですよね。

無駄な処理は実行されることのないよう、チェックの順番はよく検討するようにしましょう。

SetAppRSPメソッド – アプリ側の手を設定する

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;

}

このメソッドはアプリケーション側のじゃんけんの手を設定するメソッドです。

appRSPnumに0以外の数値が設定されるまで乱数生成と四捨五入を繰り返し、その値に応じてappRSPにじゃんけんの手を設定します。

Math.randomメソッド – 乱数を生成する

「ランダムな手」を実現するための最初のステップが Math.random() メソッドです。

このメソッドは0.0以上1.0未満の double 型(小数点を含む数)の値をランダムに返します。

この予測不可能な数値が、じゃんけんの手に多様性をもたらす源泉となるのです。「0.345…」や「0.987…」など、毎回異なる値が出てきます。

Math.floorメソッド – 四捨五入する

次に使われているのが Math.floor() メソッド。

引数として与えられた数値以下の最大の整数値に最も近いdouble型の値を返すと定義されています。

小数点以下をバッサリと切り捨ててくれる便利なメソッドです。

while文

while文は、条件判定がtrueである限り処理を繰り返す構文です。

今回の場合、appRSPnumが0であり続ける限り、乱数生成と四捨五入を繰り返します。

この処理はじゃんけんの手の割り当てを3等分にするために必要になります。

LgcJankenメソッド – じゃんけんの勝敗を判定する

private static boolean LgcJanken(int userRSP, int appRSP, Scanner scanner) {
	boolean rst = false;
	boolean isAiko = false;

	do {
		// あいこの判定
		if(userRSP == appRSP) {
			System.out.println(Const.MSG_RST_AIK);

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

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

			isAiko = true;
		}

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

	return rst;
}

じゃんけんの勝敗判定とあいこの処理を実施するのがLgcJankenメソッドです。

ここまでに設定したユーザとアプリケーションのじゃんけんの手とあいこになった場合に再入力を受け付けるためのScannerオブジェクトを引数として受け取り、勝敗が決まるまでじゃんけんの処理を繰り返します。

このメソッドの核となるのは、do-whileループです。このループにより、勝敗が決まるまで、またはあいこであれば手が再設定され、じゃんけんが繰り返されます。

ループの開始時に、まずユーザーの手とアプリケーションの手が同じかどうかで「あいこ」を判定します。あいこの場合は、その旨をユーザーに伝え、再度両者の手を取得し直し、isAikoをtrueにしてループを継続させます。

あいこではなかった場合、次にユーザーの勝ちパターン(グーがチョキに勝つ、など)に合致するかを判定します。

ユーザーが勝っていれば、isAiko フラグを false(勝敗決定のため)にし、結果を示す rst 変数を true にします。

ユーザーの勝ちパターンに合致せず、かつあいこでもない場合は、ユーザーの負けとなります。この場合も isAiko フラグは false となり、rst は初期値の false のままです。

do-while文

do-while文は、いかなる場合でも必ず1回はdoブロック内の処理を実行し、その後にwhileの部分で繰り返しの条件を判定する構文です。

処理をした後で条件を判定することから、「後置判定」と呼ばれます。

じゃんけんの勝敗判定のように、どんな条件でも必ず1回は処理を実行したい場合に使うと良いです。

コメント