【Java】じゃんけんアプリをつくろう①～シンプルなじゃんけん～

Javaの基礎をさらった後に、少し自分で手を動かしてみたくなります。
分岐や、繰り返しなど基本を押さえつつ、要件をイメージしやすい課題を考えてみました。テーマは「じゃんけん」です。じゃんけんといっても、様々な種類のじゃんけんがあるので、少しずつ条件を変えながら、手を動かしてみましょう。

まずは、シンプルなじゃんけんアプリを作成してみましょう。


# じゃんけんアプリをつくろう！

:::note info
問題
「じゃんけんポン！」と標準出力される。その後、ユーザがコンソールにじゃんけんの手（0,1,2）を入力すると、じゃんけんの結果（ユーザの手、PCの手、ユーザの勝ち負けあいこ）が標準出力されるプログラムをJavaで記載せよ。
:::

:::note info
条件
・ユーザーとCPの1対1のじゃんけんであること
・PCの手はランダムであること
・じゃんけんの手は次のように数字で扱うこと グー：0,チョキ：1,パー：2
・0,１,２以外の値が入力された場合は、「グー：0，チョキ：1、パー：2　どれかの数字をいれてください。」とメッセージを表示し、じゃんけんの手を再入力できるようにすること
:::


***

# 解答例
解答例を用意しましたので、見ていきましょう。

```java:Janken.java
package com.example.demo.controller;

import java.util.Random;
import java.util.Scanner;

public class Janken {

	public static void main(String[] args) {

		// メッセージの表示
		System.out.println("じゃんけんポン！(グー：0，チョキ：1、パー：2　どれかの数字をいれてください。)");

		//ユーザーの手を読み取る
		Scanner stdin = new Scanner(System.in);
		int userHands = stdin.nextInt();
		
        // 入力チェック
        while (userHands < 0 || userHands > 2) {
            System.out.println("グー：0，チョキ：1、パー：2　どれかの数字をいれてください。");
            userHands = stdin.nextInt();
        }
		
		// PCのじゃんけんの手を準備
		Random rand = new Random();
		int pcHands = rand.nextInt(3);

		// 結果判定
		String result;
        if (userHands == pcHands) {
        	result = "あいこです。";
        } else if ((userHands == 0 && pcHands == 1) ||
                (userHands == 1 && pcHands == 2) ||
                (userHands == 2 && pcHands == 0)) {
        	result = "ユーザーの勝ちです！";
        } else {
        	result = "ユーザーの負けです。";
        }

		// 判定結果の表示
		String[] hands = { "グー", "チョキ", "パー" };
		System.out.println("ユーザーの手:" + hands[userHands] + ",コンピュータの手:" + hands[pcHands]);
		System.out.println("結果：" + result);
		
		stdin.close();

	}
}
```

## 解説  

```java
		//ユーザーの手を読み取る
		Scanner stdin = new Scanner(System.in);
		int userHands = stdin.nextInt();
```

```java
		stdin.close();
```

Scannerクラスを利用し、キーボードで入力された値を受け取っています。また、最後に、Scannerオブジェクトをクローズするのも忘れずに行われています。

＊
```java
        // 入力チェック
        while (userHands < 0 || userHands > 2) {
            System.out.println("グー：0，チョキ：1、パー：2　どれかの数字をいれてください。");
            userHands = stdin.nextInt();
        }
```
入力チェックはwhileを使って条件判定しています。ifだと1回しかチェックできず、例えば2回連続で想定外の入力があったときに対処できないので、この形にしました。

＊
```java
		// PCのじゃんけんの手を準備
		Random rand = new Random();
		int pcHands = rand.nextInt(3);
```
RandomクラスのnextInt() で、整数の乱数を作成しています。今回は、0,1,2という3種類の整数を使用するため、nextInt()の引数は「3」となっています。

＊

```java
		// 結果判定
		String result;
        if (userHands == pcHands) {
        	result = "あいこです。";
        } else if ((userHands == 0 && pcHands == 1) ||
                (userHands == 1 && pcHands == 2) ||
                (userHands == 2 && pcHands == 0)) {
        	result = "ユーザーの勝ちです！";
        } else {
        	result = "ユーザーの負けです。";
        }
```

じゃんけんアプリで、一番難しいのは結果判定の部分だと思います。
ちなみに、アルゴリズムで結果判定をする場合は以下のようになります。

```java
 (userHands - pcHands + 3) % 3;
```

ただ、初見でこれにたどり着くのは難しいので、今回は、勝ち・負け・あいこのパターンを並べることにしました。

ポイントとしては、いきなりコードで考えるのではなく、パターン分けを言語化（日本語化）することです。紙に書き出して整理するとよいですね。じゃんけんの手を0、1、2で置き換えているので、「誰がどの手を出した時の結果」を検討します。すると、条件をコードで書きやすくなります。

あいこの場合は、ユーザーもPCも同じ数字（同じ手）になるので、少しでもスッキリかけるように工夫を入れて、回答例を作ってみました。

＊

```java
		// 判定結果の表示
		String[] hands = { "グー", "チョキ", "パー" };
		System.out.println("ユーザーの手:" + hands[userHands] + ",コンピュータの手:" + hands[pcHands]);
		System.out.println("結果：" + result);
```

最後に結果の表示部分です。じゃんけんの手を配列で持たせて、数字と日本語が対応するように出力します。

＊

簡単に解説も加えてみました。問題を作成する側にも学びや発見があって楽しかったです！ちなみに、Java17,STS,Mavenで動かしました。

＊
「習うより慣れよ」ということで、8種類題材を作成してみました！
[【Java】じゃんけんアプリをつくろう①～シンプルなじゃんけん～](https://qiita.com/aki_number16/items/89b3c0803c2bc235e0c9 "【Java】じゃんけんアプリをつくろう①～シンプルなじゃんけん～")
[【Java】じゃんけんアプリをつくろう②～あいこの場合はもう一度～](https://qiita.com/aki_number16/items/2c13747e1e89bd1a110b "【Java】じゃんけんアプリをつくろう②～あいこの場合はもう一度～")
[【Java】じゃんけんアプリをつくろう③～3回じゃんけんをしてみよう～](https://qiita.com/aki_number16/items/a0d79dbfe252c6b566dd "【Java】じゃんけんアプリをつくろう③～3回じゃんけんをしてみよう～")
[【Java】じゃんけんアプリをつくろう④～先に3勝した方が勝ち～](https://qiita.com/aki_number16/items/a58308affbf3bbe18168 "【Java】じゃんけんアプリをつくろう④～先に3勝した方が勝ち～")
[【Java】じゃんけんアプリをつくろう⑤～3人でじゃんけん～](https://qiita.com/aki_number16/items/38ed393c8cc39c3a6bf4 "【Java】じゃんけんアプリをつくろう⑤～3人でじゃんけん～")
[【Java】じゃんけんアプリをつくろう⑥～後出しじゃんけん～](https://qiita.com/aki_number16/items/59fe0b0b8323c3650d43 "【Java】じゃんけんアプリをつくろう⑥～後出しじゃんけん～")
[【Java】じゃんけんアプリをつくろう⑦～両手じゃんけん～](https://qiita.com/aki_number16/items/8e70be194ab64676f116 "【Java】じゃんけんアプリをつくろう⑦～両手じゃんけん～")
[【Java】じゃんけんアプリをつくろう⑧～あっちむてほい～](https://qiita.com/aki_number16/items/deb5c9b87e59e5dc77b4 "【Java】じゃんけんアプリをつくろう⑧～あっちむてほい～")

最後まで読んでいただいた方、ありがとうございました。