エンジニアの将来って?

現在6年目の元COBOL現Javaエンジニアが、将来への考えや勉強のアウトプット、たまに腎臓について書くブログです

【Java】標準入力から判定して、じゃんけんゲームをするプログラム

こんにちは。たいら(@tairaengineer2)です。
今回の記事はJavaのアウトプット記事です。
作ったのは、標準入力から判定してじゃんけんゲームをするプログラムです。

目次

どんなプログラムか

作ったのは標準入力から人間が入力した値を判定して、乱数で手を生成し、じゃんけんをするプログラムです。
while文で好きなだけ回すなどせず、実行してじゃんけんするのは1回のみです。
2つ作成し、1つはメインプログラム、もう1つはじゃんけんの勝敗を判定するプログラムです。

メインプログラム

package scissorsPaperRock;

/**
 * じゃんけんメインプログラム
 *
 */
public class ScissorsPaperRockGame {
	public static void main(String[] args) {
		ScissorsPaperRock scissorsPaperRock = new ScissorsPaperRock();

		// 引数が正しいかどうか判定
		if (!scissorsPaperRock.isParameter(args)) {
			return;
		}

		// あいこかどうか判定
		if (scissorsPaperRock.isDraw()) {
			scissorsPaperRock.displayDraw();
			return;
		}

		// 勝敗を判定
		if (scissorsPaperRock.isBattle()) {
			scissorsPaperRock.displayWin();
		} else {
			scissorsPaperRock.displayLose();
		}
	}
}

じゃんけんの勝敗を判定するプログラム

package scissorsPaperRock;

import java.util.Random;

/**
 * じゃんけんを表すクラス
 *
 */
public class ScissorsPaperRock {
	/** じゃんけんの手 */
	public static final int SCISSORS = 1;
	public static final int PAPER = 2;
	public static final int ROCK = 3;

	public static final String SCISSORS_HAND = "チョキ";
	public static final String PAPER_HAND = "パー";
	public static final String ROCK_HAND = "グー";

	/** 定型文 */
	public static final String SIZE_CHECK = "入力してください";
	public static final String INPUT_CHECK = "1から3の間で入力してください";
	public static final String NUM_CHECK = "数字を入力してください";
	public static final String MAN_INPUT = "人間が選んだ手:";
	public static final String MACHINE_INPUT = "乱数が選んだ手:";
	public static final String DRAW_DISPLAY = "結果はあいこです";
	public static final String WIN_DISPLAY = "結果はあなたの勝ちです";
	public static final String LOSE_DISPLAY = "結果はあなたの負けです";

	/** 人間が選んだ手 */
	private int man = 0;

	/** 乱数で選んだ手 */
	private int machine = 0;

	/**
	 * コンストラクタ
	 */
	public ScissorsPaperRock() {
		Random random = new Random();
		this.machine = random.nextInt(3) + 1;
	}

	/**
	 * 引数が正しいかどうか判定するメソッド
	 * @param args 標準入力
	 * @return true:正しい引数 false:誤った引数
	 */
	public boolean isParameter(String[] args) {
		// 引数が入力されているかどうか判定
		if (args == null || args.length == 0) {
			System.out.println(SIZE_CHECK);
			return false;
		}

		// 数字を入力しているか判定
		try {
			this.man = Integer.parseInt(args[0]);
		} catch(NumberFormatException e) {
			System.out.println(NUM_CHECK);
			return false;
		}

		// 1から3までの数字を入力しているかどうか判定
		if (ROCK < this.man || SCISSORS > this.man) {
			System.out.println(INPUT_CHECK);
			return false;
		}

		return true;
	}

	/**
	 * 人間の手と乱数の手があいこかどうか判定するメソッド
	 * @return true:あいこ false:あいこではない
	 */
	public boolean isDraw() {
		if (this.man == this.machine) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * あいこの時、何の手を出したかを表示するメソッド
	 */
	public void displayDraw() {
		if (this.man == SCISSORS) {
			System.out.println(MAN_INPUT + SCISSORS_HAND);
			System.out.println(MACHINE_INPUT + SCISSORS_HAND);
		} else if(this.man == PAPER) {
			System.out.println(MAN_INPUT + PAPER_HAND);
			System.out.println(MACHINE_INPUT + PAPER_HAND);
		} else {
			System.out.println(MAN_INPUT + ROCK_HAND);
			System.out.println(MACHINE_INPUT + ROCK_HAND);
		}

		System.out.println(DRAW_DISPLAY);
	}

	/**
	 * じゃんけんの勝敗を判定するメソッド
	 * @return true:人間の勝ち false:乱数の勝ち
	 */
	public boolean isBattle() {
		if (this.man == SCISSORS && this.machine == PAPER) {
			return true;
		} else if(this.man == PAPER && this.machine == ROCK) {
			return true;
		} else if(this.man == ROCK && this.machine == SCISSORS) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 勝った時、何の手を出したかを表示するメソッド
	 */
	public void displayWin() {
		if (this.man == SCISSORS) {
			System.out.println(MAN_INPUT + SCISSORS_HAND);
			System.out.println(MACHINE_INPUT + PAPER_HAND);
		} else if (this.man == PAPER) {
			System.out.println(MAN_INPUT + PAPER_HAND);
			System.out.println(MACHINE_INPUT + ROCK_HAND);
		} else {
			System.out.println(MAN_INPUT + ROCK_HAND);
			System.out.println(MACHINE_INPUT + SCISSORS_HAND);
		}

		System.out.println(WIN_DISPLAY);
	}

	/**
	 * 負けた時、何の手を出したかを表示するメソッド
	 */
	public void displayLose() {
		if (this.man == SCISSORS) {
			System.out.println(MAN_INPUT + SCISSORS_HAND);
			System.out.println(MACHINE_INPUT + ROCK_HAND);
		} else if (this.man == PAPER) {
			System.out.println(MAN_INPUT + PAPER_HAND);
			System.out.println(MACHINE_INPUT + SCISSORS_HAND);
		} else {
			System.out.println(MAN_INPUT + ROCK_HAND);
			System.out.println(MACHINE_INPUT + PAPER_HAND);
		}

		System.out.println(LOSE_DISPLAY);
	}
}

実行結果

では実行します。
標準入力の引数には、次のものを入力します。

  • 引数を入力しない
  • 文字を入力
  • 1から3以内の数字を入力しない
  • 1から3以内の数字を入力

引数を入力しない

f:id:Tairax:20180717074739p:plain

入力してください

文字を入力

f:id:Tairax:20180717074856p:plain

数字を入力してください

1から3以内の数字を入力しない

f:id:Tairax:20180717080828p:plain

1から3の間で入力してください

1から3以内の数字を入力

f:id:Tairax:20180717080916p:plain

人間が選んだ手:チョキ
乱数が選んだ手:グー
結果はあなたの負けです

今回は負けでしたが、何回かするとあいこになったり

人間が選んだ手:チョキ
乱数が選んだ手:チョキ
結果はあいこです

勝ったりします。

人間が選んだ手:チョキ
乱数が選んだ手:パー
結果はあなたの勝ちです

解説

このじゃんけんプログラムで大切なポイントを解説します。
解説する順番は

  • じゃんけんの手について
  • 乱数の作り方
  • 標準入力の引数

の順番で解説します。

じゃんけんの手について

今回のプログラムではじゃんけんの手を次のように定義しています。

  • チョキ:1
  • パー:2
  • グー:3

上記のように定義している理由は、楽だからです。
出した手を文字通りカタカナの「チョキ」で定義してもいいんですが、そうするとひらがなの「ちょき」でもOKにする必要があります。
単純に処理が増えます。
また乱数で手を決めているので、数字で定義している方が比較しやすいです。

乱数の作り方

乱数はコンストラクタのこの部分で作ってます。

Random random = new Random();
this.machine = random.nextInt(3) + 1;

nextIntメソッドは0から引数の数字-1の乱数が生成されます。
今回は引数に3を与えているので、0から2までの乱数が生成されます。
1を足すことで、1から3までの乱数が生成されます。

標準入力の引数

今回は標準入力で入力された引数を判定してじゃんけんしてます。
引数が1から3以内の数字以外が入力される可能性があります。
なので、引数が正しいものかどうかチェックしまくっています。
たとえば

if (args == null || args.length == 0) {

で入力されているかどうかチェックしたり

this.man = Integer.parseInt(args[0]);

try-catch文で囲って文字を入力していないかどうかなどですね。
入力された引数が適切なものかを判定することは大切です。

まとめ

Javaで標準入力から判定してじゃんけんするプログラムを作りました。
いかがでしたか?
少しでも皆様のご参考になれば幸いです。

 

ほかにもJava勉強記事を書いてます。
よければご参考ください。

JavaのTreeSetの特徴を分かりやすく解説します。

【Java】eclipseにあるデバッグ機能の「値の変更」で、ArrayListを変更するやり方をできるだけわかりやすく解説します

JavaのgetResourceAsStreamメソッドでプロパティファイルを読み込む