【Java】じゃんけんアプリをつくろう⑦～両手じゃんけん～

前回はお題に沿ってじゃんけんの出し手を変える後出しじゃんけんアプリをつくりました。次は、両手じゃんけんをするじゃんけんアプリを作ってみましょう。結果判定の前に新しい処理が必要になります。

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

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

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

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

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

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

public class JankenbBothHands {
	
	public static void main(String[] args) {
	
	       // メッセージの表示
			System.out.println("じゃんけんポイポイどっち出すの！(グー：0，チョキ：1、パー：2　どれか2つの数字をいれてください。)");

			//ユーザーの初手を読み取る
			Scanner stdin = new Scanner(System.in);
			int userFirstHands = readHand(stdin);
			int userSecondHands = readHand(stdin);
			
			// PCのじゃんけんの手を準備
			Random rand = new Random(System.currentTimeMillis());
			int pcFirstHands = rand.nextInt(3);
			int pcSecondHands = rand.nextInt(3);
			
			//ユーザとPCのそれぞれの手を表示
			String[] hands = { "グー", "チョキ", "パー" };
			System.out.println("ユーザーの手①:" + hands[userFirstHands] + ",ユーザーの手②:" + hands[userSecondHands]);
			System.out.println("コンピュータの手①:" + hands[pcFirstHands] + ",コンピュータの手②:" + hands[pcSecondHands]);

			//メッセージの表示
			System.out.println("こっち出すの！(上で選んだ2つの手のうち対応する手の数字（グー：0，チョキ：1、パー：2　）を1ついれてください。)");

			//ユーザーの手を読み取る
			int userHands = stdin.nextInt();
			while((userHands != userFirstHands) && (userHands != userSecondHands)) {
				System.out.println("最初に選んだ手から、選択してください。");
				userHands = stdin.nextInt();
			}
			
			//PCの手を準備
			int pcHands = 0;
			Random randdom = new Random(System.currentTimeMillis());
			int randomIndex = randdom.nextInt(2);
			 if(randomIndex == 1) {
				 pcHands = pcFirstHands;
			 }else {
				 pcHands = pcSecondHands;
			 }
			 
			 // 結果判定
			 String result;
			 if (userHands == pcHands) {
				 result = "あいこです。";
			 } else if ((userHands == 0 && pcHands == 1) ||(userHands == 1 && pcHands == 2) ||(userHands == 2 && pcHands == 0)) {
				 result = "ユーザーの勝ちです！";
			 } else {
		        result = "ユーザーの負けです。";
		        }

			// 判定結果の表示
			System.out.println("ユーザーの手:" + hands[userHands] + ",PCの手:" + hands[pcHands]);
			System.out.println("結果：" + result);
			
			// Scannerをクローズ
			stdin.close();
			}

	//ユーザーの手を取得
	private static int readHand(Scanner stdin) {
	    int hand = stdin.nextInt();
	    while (hand < 0 || hand > 2) {
	        System.out.println("グー：0,チョキ：1,パー：2　どれかの数字をいれてください。");
	        hand = stdin.nextInt();
	    }
	    return hand;
	}
}

```

# 解説
```java
			//ユーザーの初手を読み取る
			Scanner stdin = new Scanner(System.in);
			int userFirstHands = readHand(stdin);
			int userSecondHands = readHand(stdin);

            //省略

	//ユーザーの手を取得
	private static int readHand(Scanner stdin) {
	    int hand = stdin.nextInt();
	    while (hand < 0 || hand > 2) {
	        System.out.println("グー：0,チョキ：1,パー：2　どれかの数字をいれてください。");
	        hand = stdin.nextInt();
	    }
	    return hand;
	}
```
ユーザーの手を2つ取得するので、取得用のメソッドを作成してみました。今までずっとmainメソッドの中だけで記載していましたが、メソッドを分けて記載してもよいですね。

＊
```java
			// PCのじゃんけんの手を準備
			Random rand = new Random(System.currentTimeMillis());
			int pcFirstHands = rand.nextInt(3);
			int pcSecondHands = rand.nextInt(3);
```
Randomをインスタンス化する際にコンストラクタの引数を工夫すると、pcFirstHandsとpcSecondHandsの値が一致する確率を減らせそうです。System.currentTimeMillis()は現在時刻をミリ秒単位で取得するメソッドです。

＊
```java
			//ユーザーの手を読み取る
			int userHands = stdin.nextInt();
			while((userHands != userFirstHands) && (userHands != userSecondHands)) {
				System.out.println("最初に選んだ手から、選択してください。");
				userHands = stdin.nextInt();
			}
```
最初に選んだ2つの手が入力されたからチェックする部分がこちらです。これを書かないと、最初に手を2つに絞った意味がなくなってしまうので、書いておきたいです。

＊

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

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

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