LoginSignup
5
4

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-05-03

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

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

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

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

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


解答例

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

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

	}
}

解説

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

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

        // 入力チェック
        while (userHands < 0 || userHands > 2) {
            System.out.println("グー:0,チョキ:1、パー:2 どれかの数字をいれてください。");
            userHands = stdin.nextInt();
        }

入力チェックはwhileを使って条件判定しています。ifだと1回しかチェックできず、例えば2回連続で想定外の入力があったときに対処できないので、この形にしました。

		// PCのじゃんけんの手を準備
		Random rand = new Random();
		int pcHands = rand.nextInt(3);

RandomクラスのnextInt() で、整数の乱数を作成しています。今回は、0,1,2という3種類の整数を使用するため、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 = "ユーザーの負けです。";
        }

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

 (userHands - pcHands + 3) % 3;

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

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

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

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

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

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


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

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

5
4
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
5
4