【Java】じゃんけんアプリをつくろう②～あいこの場合はもう一度～

前回の記事では、シンプルな1回のじゃんけんアプリを作成しました。
今回は、勝負がつくまでじゃんけんを続けるような（あいこの場合はもう一度じゃんけんを行う）アプリをつくってみましょう。

# じゃんけんアプリをつくろう！
:::note info
問題：「じゃんけんポン！と標準出力される。ユーザがコンソールにじゃんけんの手（0,1,2）を入力すると、じゃんけんの結果（ユーザの手、PCの手、ユーザの勝ち負けあいこ）が標準出力されるプログラムをJavaで記載せよ。また、あいこの場合はじゃんけんをもう一度実施し、勝敗がつくまでじゃんけんを続けよ。」
:::

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

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

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

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

public class JankenEvenRoop {

	public static void main(String[] args) {

		// 結果の変数を用意
		int result = 0;

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

			// ユーザーの手を読み取る
			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);

			//結果判定
			result = (userHands - pcHands + 3) % 3;
			String winOrLose = null;
			if (result == 2) {
				winOrLose = "ユーザーの勝ちです！";
			} else if (result == 1) {
				winOrLose = "ユーザーの負けです";
			} else {
				winOrLose = "あいこです";
			}

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

			// あいこの場合は繰り返す
		} while (result == 0);
		
		stdin.close();
	}
}

```

## 解説

```java
			//結果判定
			result = (userHands - pcHands + 3) % 3;
			String winOrLose = null;
			if (result == 2) {
				winOrLose = "ユーザーの勝ちです！";
			} else if (result == 1) {
				winOrLose = "ユーザーの負けです";
			} else {
				winOrLose = "あいこです";
			}
```
結果判定の部分をアルゴリズムで記載してみました。結果を並べるやり方よりも可読性が高いですね。あまりの数で場合分けするのがポイントです。
＊

```java
		// 結果の変数を用意
		int result = 0;

		do {
			//省略

		// あいこの場合は繰り返す
		} while (result == 0);
```
「あいこの場合はじゃんけんをもう一度実施し、勝敗がつくまでじゃんけんを続けよ。」をコードで表現した部分がこちらです。do-while文を使って、繰り返しをしています。最低1回はじゃんけんをするので、do-while文を使いました。

ポイントとしては、resultをdo-while文の外で初期化することです。whileの条件式で、あいこの場合（result == 0）を記載しておくと、繰り返し動作します。ただ、resultが0の状態がずっと続くと、無限ループになってしまいますので、注意が必要です。。

＊
```java
		//Scannerのインスタンス化
		Scanner stdin = new Scanner(System.in);
```
Scannerのインスタンス化を繰り返しの外に記載しました。繰り返しの中に記載すると、繰り返すたびにインスタンス化してしまいますので、これを防ぐ狙いです。
＊

いろんな書き方があるので、一例ととらえてもらえると嬉しいです。
解説は以上です！

＊
「習うより慣れよ」ということで、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】じゃんけんアプリをつくろう⑧～あっちむてほい～")

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