3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-05-03

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

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

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

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

解答例

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

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

解説

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

結果判定の部分をアルゴリズムで記載してみました。結果を並べるやり方よりも可読性が高いですね。あまりの数で場合分けするのがポイントです。

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

		do {
			//省略

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

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

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

		//Scannerのインスタンス化
		Scanner stdin = new Scanner(System.in);

Scannerのインスタンス化を繰り返しの外に記載しました。繰り返しの中に記載すると、繰り返すたびにインスタンス化してしまいますので、これを防ぐ狙いです。

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


「習うより慣れよ」ということで、8種類題材を作成してみました!
【Java】じゃんけんアプリをつくろう①~シンプルなじゃんけん~
【Java】じゃんけんアプリをつくろう②~あいこの場合はもう一度~
【Java】じゃんけんアプリをつくろう③~3回じゃんけんをしてみよう~
【Java】じゃんけんアプリをつくろう④~先に3勝した方が勝ち~
【Java】じゃんけんアプリをつくろう⑤~3人でじゃんけん~
【Java】じゃんけんアプリをつくろう⑥~後出しじゃんけん~
【Java】じゃんけんアプリをつくろう⑦~両手じゃんけん~
【Java】じゃんけんアプリをつくろう⑧~あっちむてほい~

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?