3
Help us understand the problem. What are the problem?

posted at

updated at

【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クラスが使われている

ソースコード

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

リファクタリング後

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
3
Help us understand the problem. What are the problem?