【Java】ジャンケンゲームを作ってみた

# はじめに
この記事では学習の過程で作成したジャンケンゲームの作成過程を紹介します。
このゲームはコマンド上でプレイヤーとCPUが対戦し、グー・チョキ・パーの手を出して勝敗を競うゲームです。

## ゲームの仕様

ジャンケンゲームを作成するにあたって、ゲームの仕様は以下になります

- プレイヤーは1～3の数字を入力して手を選択する（1: グー、2: チョキ、3: パー）。
- CPUはランダムに手を選択する。
- プレイヤーとCPUそれぞれの選択を表示する
- 勝敗を判定し結果を表示する。
- もう一度対戦するか確認する(yesの場合はループする）
- 終了する場合は勝敗と引き分けの数を表示する（終了）

## クラスの作成
今回作成したクラスはmainメソッドを内包した`Execution`というクラスと
実行する処理を全て記述したJankenクラスの2つになります

```java:Execution.java
public class Execution {
    public static void main(String[] args) {

        Janken janken = new Janken(); // Jankenクラスのインスタンスを作成

        janken.execution(); // インスタンスを介してexecution()メソッドを呼び出す

    }
}

```

```java:Janken.java
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Random;

public class Janken {
                        
                        public void playGame() {
    
                                   //　実行コードを記述

                    }
                        
                        public void execution() {
                                   playGame();
                            }
                    }
}
```


## メソッドの作成

### Janken()メソッド
このプログラムで使用するリソースを管理します
```java:Janken.java
public Janken() {
        hands.put(1, "グー");
        hands.put(2, "チョキ");
        hands.put(3, "パー");

        results.add("あいこ");
        results.add("負け");
        results.add("勝ち");

        scanner = new Scanner(System.in); // Scannerインスタンスの作成
    }
```

### playGame() メソッド
ゲームのメイン処理を行う playGame() メソッドを作成します。
このメソッドでは以下の処理を行います。

- プレイヤーの手を入力する(1~3のキー入力を受け付ける）
- CPUの手をランダムに選択する(1~3)
- 勝敗の判定を行い結果を表示する
- ゲームを続行するかどうかを確認する（ループ処理するか判断する）
- 各メソッドはここで呼び出す


```java:Janken.java
public void playGame() {
        int playHand;
        String input;
        do {
            System.out.println("1:グー 2:チョキ 3:パー");
            input = scanner.next(); //コマンド画面から文字列の入力を読み取ります
            if (input.matches("[1-3]")) {//1~3の場合はtrue
                playHand = Integer.parseInt(input); // 文字列の入力を整数型に置き換えて代入します
                break; //ループを抜けます
            }
            System.out.println("該当する半角数字で入力してください");
        } while (true); // 途中でbreakしないかぎりずっとループします

        String Hand = hands.get(playHand); // プレイヤーの手
        int cpuHandNumber = cpuHand(); // 1~3までのランダムな数字を取得
        String cpuHand = hands.get(cpuHandNumber); // CPU側のグーチョキパーを取得する
        String judge = judge(playHand, cpuHandNumber); // 勝敗判定

        System.out.println("Player : " + Hand); // Player : グー
        System.out.println("CPU : " + cpuHand);// CPU   : パーなど
        System.out.println("Result : " + judge); // 判定結果

        resultCount(judge); // カウント増減の処理を追加

        continueGame();
    }
```
### cpuHand()メソッド
CPUの手をランダムに選択します。
このメソッドでは、1～3のランダムな数字を返します。
```java:Janken.java
public int cpuHand() {
        Random random = new Random();
        int randomNumber = random.nextInt(3) + 1; // 1~3までのランダムな数字を出力
        return randomNumber;
    }
```
### judge()メソッド
judge() メソッドは勝敗の判定を行います
与えられた引数により勝敗の結果を返します。
```java:Janken.java
 public String judge(int player, int cpu) {
        if (player == cpu) {
            return results.get(0); // あいこ
        } else if ((player == 1 && cpu == 2) || (player == 2 && cpu == 3) || (player == 3 && cpu == 1)) {
            return results.get(2); // 勝ち
        } else {
            return results.get(1); // 負け
        }
    }
```
### resultCount()メソッド
勝敗数をカウントします
勝ち・負け・あいこの結果に応じてカウントを増減させます。
```java:Janken.java
public void resultCount(String judge) {
        switch(judge) {
            case "勝ち":
                winCount += 1;
                break;
            case "負け":
                loseCount += 1;
                break;
            case "あいこ":
                draw += 1;
                break;
        }
    }
```
### continueGame()メソッド
ゲームを続行を確認します
続行する場合はplayGame()メソッドを呼び出すことでループさせます
```java:Janken.java
public void continueGame() {
        String input;
        int number;

        do {
            System.out.println("1:もう一度対戦する 2:終了する");
            input = scanner.next();
            if (input.matches("[1-2]")) {
                number = Integer.parseInt(input);
                break;
            }
            System.out.println("該当する半角数字で入力してください");
        } while (true);

        if (number == 1) {
            playGame();
        } else {
            System.out.println("最終結果：" + winCount + "勝 " + loseCount + "敗 " + draw + "引き分け");
        }
    }
```

### execution()メソッド
外部クラスから処理をスタートさせます
```java:Janken.java
public void execution() {
        playGame();
    }
```
## 実行結果
![スクリーンショット 2023-06-14 10.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/c8d752af-2763-3634-a844-1d915d569b4a.png)


## 完成と感想
これでジャンケンゲームの作成が完了しました。この記事では、プレイヤーの手の入力方法、CPUの手の決定方法、勝敗の判定方法など、基本的なプログラミングの概念やロジックの組み立て方に触れることができました。もっと効率の良い書き方があるはずなのでもっとスキルアップ出来そうです。

## GitHubで確認
GitHub上に公開しているのでコードは[こちら](https://github.com/AlecTrippier/practice-Janken-Game.git)で確認できます。