【Java】じゃんけんゲームを作ってみた

Javaの勉強をしておりましたが、アウトプットと備忘のために記事に起こしておきます。
なお、今回クラスの継承は一切しておらず、Mainクラスのみのとても簡易的なコードになります。

# 仕様・要件

#### 【入出力】

- 入力値が0のとき、人間の手としてグーが選択される
- 入力値が1のとき、人間の手としてチョキが選択される
- 入力値が2のとき、人間の手としてパーが選択される
- 入力値が0,1,2以外のとき、再入力を求められる (3以上の半角数字を入力する)
- 入力値が0,1,2以外のとき、再入力を求められる (半角特殊記号を入力する)
- 入力値が0,1,2以外のとき、再入力を求められる (全角文字を入力する)
- 入力値が0,1,2以外のとき、再入力を求められる (絵文字を入力する)
- 入力値が0のとき、人間の手としてグーが選択される
- 入力値が1のとき、人間の手としてチョキが選択される
- 入力値が2のとき、人間の手としてパーが選択される
- 各対戦の勝敗が画面に表示される（指定要件外だがユーザが自然に期待する仕様）
- 10回勝負後に「あなたは，○勝○敗○引分でした」とメッセージが表示される

#### 【じゃんけん機能】

- 人間 グー　 vs COM グー 　→ あいこ
- 人間 グー　 vs COM チョキ → 勝ち
- 人間 グー　 vs COM パー 　→ 負け
- 人間 チョキ vs COM グー　 → 負け
- 人間 チョキ vs COM チョキ → あいこ
- 人間 チョキ vs COM パー　 → 勝ち
- 人間 パー　 vs COM グー　 → 勝ち
- 人間 パー　 vs COM チョキ → 負け
- 人間 パー　 vs COM パー　 → あいこ
- キー入力が全て正しく行われた場合、対戦が10回で終了する
- キー入力が正しくない場合(0,1,2以外)を含んだとしても、対戦が10回で終了する

#### 【その他】

- 数値の入力を受け付けるのに BufferReaderクラスまたはScannerクラスが使われている


### ソースコード

```java:Main.java
import java.util.Random;
import java.util.Scanner;

public class Main {
		public static void main(String[] args) {
		// 標準入力
		// Scannerクラス
		Scanner scanner = new Scanner(System.in);

		// じゃんけんの回数を格納する変数
		int janken_num = 0;
		// 勝数を格納する変数
		int win_num = 0;
		// 敗数を格納する変数
		int lose_num = 0;
		// 引き分けを格納する変数
		int draw_num = 0;
		// 10回戦が終わるまでじゃんけんを繰り返す
		System.out.println("0〜2の整数で入力してください。0：グー、1：チョキ、2：パーです。");
		while(true) {
			try {
				janken_num++;
				System.out.println("■じゃんけん" + (janken_num) + "回戦目");
				// nextLineメソッド
				int input = Integer.parseInt(scanner.nextLine());
				System.out.println("【人間】" + input);
				// input = 0：グーを表す
				// input = 1：チョキを表す
				// input = 2：パーを表す
				// コンピュータ用に乱数を生成し変数computer_numに格納
				Random rand = new Random();
				int computer_num = rand.nextInt(3) + 0;
				// computer_num = 0：グーを表す
				// computer_num = 1：チョキを表す
				// computer_num = 2：パーを表す
				System.out.println("【コンピュータ】" + computer_num);
					if ((input == 0) && (computer_num == 1) || ((input == 1) && (computer_num == 2) || ((input == 2) && (computer_num == 0)))) {
					win_num += 1;
					}
					else if ((input == 0) && (computer_num == 2) || ((input == 1) && (computer_num == 0) || ((input == 2) && (computer_num == 1)))){
					lose_num += 1;
					}
					else if ((input == 0) && (computer_num == 0) || ((input == 1) && (computer_num == 1) || ((input == 2) && (computer_num == 2)))){
					draw_num += 1;
						}
					if( janken_num == 10) {
						break;
					}
			} catch (NumberFormatException e) {
				System.out.println("0〜2の整数で入力してください。じゃんけんを終了します。");
				break;
			}
		}
		System.out.println(janken_num + "あなたは，" + win_num + "勝" + lose_num + "敗" + draw_num + "引き分けでした");
		scanner.close();
	}
}
```

### リファクタリング後

```java:Main.java
import java.util.Random;
import java.util.Scanner;
import java.util.InputMismatchException;

public class Main {
		public static void main(String[] args) {
		// 標準入力
		// Scannerクラス
		Scanner scanner = new Scanner(System.in);

		// じゃんけんの回数を格納する変数
		int janken_num = 0;
		// 勝数を格納する変数
		int win_num = 0;
		// 敗数を格納する変数
		int lose_num = 0;
		// 引き分けを格納する変数
		int draw_num = 0;
		// 10回戦が終わるまでじゃんけんを繰り返す
		System.out.println("0〜2の範囲の整数を入力してください。0：グー、1：チョキ、2：パーです。");
		while(true) {
			try {
				janken_num++;
				System.out.println("----------------------------------");
				System.out.println("<じゃんけん" + (janken_num) + "回戦目>");
				// nextLongメソッド
				long input = scanner.nextLong();
					// 0,1,2以外の数値を入力した場合は再入力
					if ((input > 2) || (input < 0)) {
					// throwで例外(NullPointerException)を投げる
					throw new InputMismatchException();
					}
					// 0,1,2をそれぞれ「グー」,「チョキ」,「パー」に変換
					if (input == 0) {
						System.out.println("【人間】グー");
					}
					else if (input == 1) {
						System.out.println("【人間】チョキ");
					}
					else if (input == 2) {
						System.out.println("【人間】パー");
					};
				// コンピュータ用に乱数を生成し変数computer_numに格納
				Random rand = new Random();
				int computer_num = rand.nextInt(3) + 0;
				if (computer_num == 0) {
					System.out.println("【コンピュータ】グー");
				}
				else if (computer_num == 1) {
					System.out.println("【コンピュータ】チョキ");
				}
				else if (computer_num == 2) {
					System.out.println("【コンピュータ】パー");
				}
				if ((input == 0) && (computer_num == 1) || ((input == 1) && (computer_num == 2) || ((input == 2) && (computer_num == 0)))) {
				win_num += 1;
				}
				else if ((input == 0) && (computer_num == 2) || ((input == 1) && (computer_num == 0) || ((input == 2) && (computer_num == 1)))){
				lose_num += 1;
				}
				else {
				draw_num += 1;
				}
				if( janken_num == 10) {
					break;
				}
			} catch (NumberFormatException e) {
				System.out.println("数字以外が入力されています。0〜2の範囲の整数を入力してください。");
				janken_num--;
				continue;
			} catch (InputMismatchException e) {
				System.out.println("0〜2の範囲の整数を入力してください。");
				janken_num--;
				continue;
			}
		}
		System.out.println("----------------------------------");
		System.out.println("あなたは，" + win_num + "勝" + lose_num + "敗" + draw_num + "引き分けでした");
		scanner.close();
	}
}
```