Javaの基礎をさらった後に、少し自分で手を動かしてみたくなります。
分岐や、繰り返しなど基本を押さえつつ、要件をイメージしやすい課題を考えてみました。テーマは「じゃんけん」です。じゃんけんといっても、様々な種類のじゃんけんがあるので、少しずつ条件を変えながら、手を動かしてみましょう。
まずは、シンプルなじゃんけんアプリを作成してみましょう。
じゃんけんアプリをつくろう!
問題
「じゃんけんポン!」と標準出力される。その後、ユーザがコンソールにじゃんけんの手(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 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】じゃんけんアプリをつくろう⑧~あっちむてほい~
最後まで読んでいただいた方、ありがとうございました。