前回の記事では、シンプルな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】じゃんけんアプリをつくろう⑧~あっちむてほい~
最後まで読んでいただいた方、ありがとうございました。