Javaアプリケーション – じゃんけんゲーム② ユーザの入力した値を読み取って設定する

未分類

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

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

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

このブログについて

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

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

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

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

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

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

main – アプリケーションの処理そのもの

public static void main(String[] args) {
	// TODO 自動生成されたメソッド・スタブ
	Scanner scanner = new Scanner(System.in);
	String userIn;
	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);
	appRSP = SetAppRSP(appRSP);

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

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

	System.out.println(msg);

}

アプリケーションの実行によって呼び出されるメソッドです。

mainメソッドには、処理を流していく上で必要なメッセージの出力と、各メソッドの呼び出しの実装にとどめています。

Const.java – メッセージはこのクラスで一括管理

package janken;

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

}

このアプリケーションでは、コンソールに複数回メッセージを出力します。

場合によっては、同一メッセージを複数回表示することも。

そこでメッセージをプログラムにベタがきするのではなく、メッセージ管理用の定数クラスを作成し、そこにメッセージを記述した上で、必要なところでこの定数クラスを参照するようにしました。

定数クラスの設計

一口に定数クラス、といっても、その設計はさまざまです。

ざっくり分けると以下の通りです。

  1. publicでstaticなメンバ(クラスメンバ)を直接参照する方式
  2. privateなメンバ(インスタンスメンバ)をgetterメソッドの呼び出しで参照する方式

今回は1.のクラスメンバを直接参照する方式を採用しています。

このプログラムはもともとコード量が少なく、また処理自体も簡単であることから、その特徴を活かして極力クラスのインスタンス化をせずに済む方法を取りたいと考えました。

2.の場合、定数クラスのインスタンス化が必要となります。インスタンス化はメモリの消費量をグッと増加させることは以前の記事でも触れたと思います。

メンバ – インスタンスメンバとクラスメンバ

ここで聞き慣れない言葉が出て来ました。

「インスタンスメンバ」「クラスメンバ」とは何でしょう?

それぞれを整理すると以下の通りです。

  • インスタンスメンバ
    • インスタンスに紐づくメンバ
    • クラスをインスタンス化しなければアクセスすることができない
  • クラスメンバ
    • クラスに紐づくメンバ
    • クラスをインスタンス化することなくアクセスすることができる

final修飾子 – 再代入を禁止する

public static以外にももう一つ見慣れない修飾子がありますね。final修飾子です。

final修飾子が果たす役割はなんでしょうか。

それは変数への再代入を禁止することです。

通常、変数は何度でも値を上書きできますよね。これを再代入と言います。

では、このConst.javaでは再代入ができるのはよい状態と言えるでしょうか?

もちろん答えはノーです。

Const.javaはアプリケーション実行の中で出力するメッセージを管理するクラスなので、これが再代入できる状態だと意図しないメッセージが表示される、という状況になりかねません。

そこで定数クラスではfinal修飾子をつけることで再代入を禁止するのです。

まずは、「定数クラスではfinal修飾子を付与するのがお作法だ」と覚えましょう。

SetUserRSPメソッド – ユーザ側の手を読み取る

private static int SetUserRSP(Scanner scanner, String tmpUserInRSPnum) {
	tmpUserInRSPnum = scanner.nextLine();

	ChkUserInput(tmpUserInRSPnum);

	return Integer.parseInt(tmpUserInRSPnum);
}

これはユーザがターミナルに入力したじゃんけんの手を読み取り、呼び出し元に返却するメソッドです。

返却する値と引数は以下のとおりです。

  • 返却 ユーザがターミナルに入力したじゃんけんの手
  • 引数
    • scanner スキャナーオブジェクト

「引数はscannerではなく、nextLineメソッドで取り出した値を設定すれば良いのでは」という考えがあると思います。

後述しますが、このメソッドはじゃんけんの勝敗判定であいこになった場合に再度呼び出されます。

そうすると、複数箇所で①scannerオブジェクトからコンソールの値取得、②SetUserRSPメソッドの呼び出し、の処理の流れが発生し、やや煩雑に見えます。

それくらいなら、scannerオブジェクトを渡してその処理の中でコンソールに入力された値を読み取る方が処理がスッキリするかなと考え、このような実装にしています。

まとめ

今回はユーザの入力値を読み取るところまで解説をしました!

次回はアプリケーション側の手の設定と、勝敗判定のロジック部分の解説をしていきます。

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

各種SNSのフォローもよろしくお願いします!

X

Instagram

コメント