【配列編】Java言語で『じゃんけんゲーム』を作る
Java言語でプログラミングの勉強をしていくと、「じゃんけんゲーム」を作るというサンプルや課題が出てきます。
以前の記事では「if文を利用した作り方」「switch文を利用した作り方」について説明しました。今回は「配列を利用した作り方」について説明します。
プログラミングスキルを上げるためには、様々なアルゴリズムを確認することが重要です。1つのプログラムが完成したら、それで終わりではなく、他の方法はないのか? 考えることが重要です。
じゃんけんゲームを作成する場合も、今まで説明したように「if文」を使うプログラムと「switch文」を使う方法があります。また、今回説明する「配列」を使うプログラムもあります。他にも計算式を利用する場合もあり、まさに同じ「じゃんけんゲーム」でも様々なプログラムが存在します。
配列を利用すると、if文やswtich文のプログラムと異なり、行数が短くなります。ぜひ、配列を使ってどのように『じゃんけんゲーム』を作成するのか、この記事で確認してみて下さい。
まず、この記事は以下のような人を対象としています。
対象者・配列を使ったじゃんけんゲームの作り方を知りたい人
・様々なじゃんけんゲームのプログラムを確認したい人
この記事を読むと、次のようなことが理解できるようになります。
この記事を読むとできること・配列を使ったじゃんけんゲームのプログラムの作り方を知ることができる
・様々なじゃんけんゲームのプログラムを知ることができる
メソッドの書き方を詳しく説明した記事を追加しました。ぜひ参照してください。
なお、if文やswitch文を利用して『じゃんけんゲーム』を作成するプログラムの解説については、次の記事を参照してください。
「if」と「switch」を使ってじゃんけんゲームのプログラムの作り方を以前説明してきました。今日は、配列を使ったプログラムを説明します。
配列を使ってじゃんけんゲームを作るのですか?
全く想像ができません。
配列をうまく利用するとプログラムが簡単になります。
ぜひ今回のプログラムを参考にしてみて下さい!!
じゃんけんゲームの仕様
今回作成するじゃんけんゲームの仕様は、以前紹介した「if編」と同じです。
- グーは「0」、チョキは「1」、パーは「2」で表現する
- ユーザのじゃんけんの手は、キーボードから入力してもらう
- 「0」「1」「2」以外のデータが入力された時は、再入力させる
- コンピュータ側のじゃんけんの手は、乱数で自動的に求める
- ユーザの判定結果(勝ち、負け、引き分け)を画面に表示する
- メソッドを利用して作成する
もちろん今回も3部構成で考え、さらにメソッドで作っていきます。
プログラムの3部構成については、以下の記事を参照してください。
作成するメソッドの設計
仕様を元に、作成する各種メソッドを以下のようにします。これも、「if編」と全く同じです。
機能 | メソッド名 | 引数 | 戻り値 |
ユーザ側のじゃんけんの手を求める | getUser() | なし | 整数(0/1/2) |
コンピュータ側のじゃんけんの手を求める | getPc() | なし | 整数(0/1/2) |
ユーザの勝敗を判定する | judgeJanken() | ユーザの手(整数)、
コンピュータの手(整数) |
文字列 |
結果を表示する | showResult() | ユーザの手(整数)、
コンピュータの手(整数)、 判定結果(文字列) |
なし |
main()メソッドの内容(途中)
決定したメソッドをまずは、main()内に記述します。記述した内容は以下の通りです。
なお、まだ各メソッドの詳細内容を記述していないので、コンパイルエラーとなっていますが、気にする必要はありません。
main()メソッド内の記述は「if編」「switch編」のものと全く変わりません。
このようにmain()メソッド内に詳細な処理を記述せずにメソッド名のみ記述しておけば、各メソッド内の処理方法が変わったとしても、main()メソッドの内容は全く修正する必要がなくなります。
ユーザの手を取得:getUser()メソッド
ユーザの手をキーボードから入力するメソッドを説明します。
キーボードからデータを入力させる場合、「Scannerクラス」を利用します。
今回は「if編」で利用した「無限ループ」を使用します。例外処理を利用したい場合は過去の「switch編」を参照してください。
getUser()メソッドの記述内容
ユーザのじゃんけんの手をキーボードから入力してもらうメソッドの記述内容は以下のようになります。
キーボードから入力されたデータについて以下のチェックを行っています。
- 整数が入力されているか?
- 整数の場合、不適切な値(-1以下、3以上)か?
コメントを記述していますが、簡単に要点を説明します。
29行目:無限ループの指定
35行目:キーボードから入力されたデータが整数かどうかのチェック
37行目:入力された整数を変数に代入
39行目:整数が不適切な範囲の値かどうかのチェック
42行目:不適切な場合、再入力(29行目に戻る)
45行目:適切(0,1,2)な場合、読み込んだデータをmain()に戻す
51行目:整数以外が入力された場合、バッファをクリアする
もし、詳細な解説が知りたい場合は「if編」で確認してください。
https://ict-skillup.com/java/1107/
コンピュータの手を取得:getPc()メソッド
コンピュータのじゃんけんの手を乱数で求めるメソッドの記述内容は以下のようになります。
このプログラムではRandomクラスを利用しています。
getPc()メソッドの記述内容
Randomクラスで乱数を作成する場合、まずRandomインスタンスを生成します(58行目)。
そして、整数の乱数を作成するメソッド「nextInt()」を実行すると、()内に指定した値を元にした乱数が1つ作成されます。
()内には「0から始まる乱数の種類」を指定します。「3」を指定すると「0から始まる3種類の整数」となり、「0か1か2のどれか」となります。
勝敗の判定:judgeJuanken()メソッド
では、今回の説明で一番重要な配列を使ったじゃんけんの判定処理を説明します。
ユーザの手とコンピュータの手の対戦表を以下のように作成します。
この表を2次元配列で表現し、勝敗を判定します。
ユーザの手に該当する値(0~2)が行方向の添え字、コンピュータの手に該当する値(0~2)が列方向の添え字にし、勝敗結果を要素に格納しておきます。
例えば、ユーザの手がグー(0)で、コンピュータの手がパー(2)の場合、配列の[0][2]を参照すると「負け」という結果が取得できます。ユーザの手がパー(2)でコンピュータの手が(1)の場合、配列の[2][1]を参照し、「負け」となります。
judgeJanken()メソッドの記述内容
上記で説明した勝敗表の配列を利用したjudgeJanken()メソッドの内容は以下の通りとなります。
ユーザの手を行方向、コンピュータの手を列方向の添え字として、該当する値(勝敗結果)を参照し、main()メソッドに返しています。
if文やswitch文を使用したプログラムと比較すると、行数が非常に少ないのが分かります。プログラムだけでは理解しづらいかも知れませんが、対戦表と対比させながら見るとその処理内容を確認できるはずです。
結果の表示:showResult()メソッドの記述
結果を表示するメソッドはif編やswitch編と全く同じです。
全コード
以下に全コードを記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
package mygame; import java.util.Random; import java.util.Scanner; public class JankenArray { public static void main(String[] args) { // ユーザの手をキーボードから入力 int user = getUser(); // コンピュータの手を乱数で作成 int pc = getPc(); // 勝敗の判定 String result = judgeJanken(user,pc); // 結果の表示 showResult(user,pc,result); } public static int getUser() { // キーボード入力の準備 Scanner stdin = new Scanner(System.in); // 無限ループ while(true) { // メッセージの表示 System.out.println("あなたのじゃんけんの手を入力して下さい"); System.out.print("(グー:0,チョキ:1、パー:2) --> "); // 入力されたデータが整数かどうかのチェック if(stdin.hasNextInt()) { // 入力されたデータを整数として読み込む int number = stdin.nextInt(); // 整数でも有効なのは「0,1,2」のみ if(number<=-1 || number >=3) { // 範囲外は無効なデータなのでやり直し System.out.println("【エラー】入力できるのは「0~2」です"); continue; }else { // 0,1,2の場合、メソッドの結果として返す return number; } }else { // 整数以外の場合、無効なデータなのでやり直し System.out.println("【エラー】入力できるのは整数だけです"); // 不要なトークンをバッファから取り除く stdin.next(); } } } public static int getPc() { // 乱数の準備 Random rand = new Random(); // 0,1,2のどれかを求め、メソッドの結果として返す return rand.nextInt(3); } public static String judgeJanken(int user,int pc) { // じゃんけんの対戦表を2次元配列で定義 String[][] janken= { {"あいこ","勝ち","負け"}, {"負け","あいこ","勝ち"}, {"勝ち","負け","あいこ"}}; // それぞれの手による勝敗結果を返す return janken[user][pc]; } public static void showResult(int user,int pc,String result) { // じゃんけんの手を配列で定義 String[] janken= {"グー","チョキ","パー"}; // 結果の表示 System.out.println("あなたの手:"+janken[user]+",コンピュータの手:"+janken[pc]); System.out.println("結果:"+result); } } |
実行結果
実際に今回のプログラムを実行した結果は以下の通りです。
入力チェックは次の5パターンです。
①.不適切なデータ(-1以下)
②.不適切なデータ(3以上)
③.整数以外のデータ(小数点を含む数値)
④.整数以外のデータ(文字列)
⑤.適切なデータ(0、1、2)のどれか
きちんと対応できていることが、確認できます。
まとめ
今回は、配列を使った『じゃんけんゲーム』のプログラムについて説明しました。同じ結果が得られても、プログラムの作り方は多数あります。ぜひ、「if編」「switch編」、今回の「配列編」の3つのプログラムを比較して、確認してください。
・勝敗結果の対戦表を2次元配列で定義しておく
・それぞれの手(0~2)を行と列の添え字(index)として利用する
・配列をうまく利用すると判定用の行数を減らすことができる
・プログラムには様々な書き方がある
配列を使ったプログラムはどうでしたか?
2次元配列はちょっと難しいですが、プログラムの行数が短くなってビックリしました!!
このような方法もあるので、色々な書き方をぜひ確認するようにしてください。
「if編」「switch編」のプログラムを確認したい場合は、以下の記事を参照してください。