みなさんこんにちは、一星零哉です。
今回作成、解説していくのはJavaで実装する「じゃんけんゲーム」アプリです。
さっそく作っていきましょう!
要件と設計
このアプリケーションの要件は「コンソール上でアプリケーションとじゃんけん勝負を実施し、結果を標準出力する」ことです。
ざっくりと処理の流れを見ていきましょう。
- アプリ起動
- じゃんけんをするかどうかのメッセージに対してyを入力する
- ユーザがじゃんけんの手を入力する
- 入力値チェックをする
- 1〜3以外の文字が入力された場合はアプリを終了する
- アプリケーションの手を設定する
- 乱数を生成し、10倍して小数点以下を四捨五入する
- 以下の条件でじゃんけんの手を設定する
- 1〜3→グー
- 4〜6→チョキ
- 7〜9→パー
- 0→再度乱数を生成する
- ユーザの手とアプリケーションの手で勝敗を判定し、その結果を標準出力する
- あいこの場合
- 再度ユーザの手とアプリケーションの手を設定してじゃんけんをし直す
- あいこでない場合
- ユーザの手とアプリケーションの手を比較して、結果を標準出力する
- あいこの場合
以上です!
フローはこんな感じ。じゃんけんの勝敗判定のロジックは割愛させてください。

実行
このアプリケーションを実行したときの挙動を確認しましょう。
アプリケーションを実行すると、以下のメッセージが標準出力されます。

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つではなくなったりして、身構えてしまう方もいらっしゃるかもしれませんね。
でも大丈夫!一つずつ見ていけば難しいことはやっていません。
次回の記事で詳細に解説していくので、しっかり理解していきましょうね!
次回
次回はコードの解説をしていきます。
ここまでお読みいただきありがとうございました!
この記事を閉じる前に、XとInstagramのフォローもよろしくお願いします!
また次の記事でお会いしましょう!
コメント