こんばんは!
今回はJavaで数当てゲームを作ってみたいと思います。
数当てゲームのルール
今回製作するのは「CodeBreaker」や「Hit&Blow」、「NumerOn」のような3つの数字を当てるだけの単純なゲームです。
ルールは以下のように設定します。
・数字は3つ(2つや4つにも簡単に変更できるようにプログラムしておく)。
・数字は0~9の範囲で重複はないものとする。
・ユーザーが入力した数字と桁が答えと一致していたら「eat」、数字のみ一致していたら「bite」としてカウントする。
・3eatとなればゲーム終了となる。
今回はNumerOn(ヌメロン)を参考にし、eat,biteという表記にしました。
「CodeBreaker」や「Hit&Blow」ではHit,Blowという表記なのでそちらがいいという方は適宜変更してください。
コード
今回作成したコードは以下の通りです。
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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | /* * 2019/02/15 * @author 物を作る者 * ヌメロンゲーム */ package sample; import java.io.*; public class Numeron { final static int answer_size = 3;//当てる数。4にすれば4つの数字を当てるゲームになる。 static int eat = 0; static int bite = 0; static int challenge = 1; //メインメソッド public static void main(String[] args) { printDirection(); int[] right_answer; right_answer = makeRightAnswer(); while(true) { int[] user_answer; user_answer = readUserAnswer(); checkAnswer(right_answer, user_answer); challenge++; if(eat == answer_size) { System.out.println("正解です。ゲームを終了します。"); break; } } } //説明を出力するメソッド public static void printDirection() { String direction = "ゲームを開始します。\n" + "これから0~9の"+answer_size+"つの数字を当ててもらいます。\n" + "同じ数字が使用されていることはありません。\n" + "数字と位置が合っていた場合、\"eat\"\n" + "数字が合っていて位置が間違っていた場合、\"bite\"とカウントされます。\n\n"; System.out.println(direction); } //ランダムに正解を作成するメソッド public static int[] makeRightAnswer() { int[] answer = new int[answer_size]; for(int i = 0; i < answer.length; i++) { answer[i] = (int)(Math.random()*10); for(int j = i-1; j >=0; j--) { if(answer[j] == answer[i]) { answer[i] = (int)(Math.random()*10); } } } return answer; } //入力された数字を読み込むメソッド public static int[] readUserAnswer() { eat = 0; bite = 0; int[] answer = new int[answer_size]; BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("\n"+challenge+"回目のチャレンジ"); for(int i = 0; i < answer.length; i++) { try { System.out.print((i+1)+"つ目の数字:"); String a = reader.readLine(); int b = Integer.parseInt(a); answer[i] = b; }catch (NumberFormatException e) { System.out.println("数字を入力してください。"); i--; }catch (IOException e) { System.out.println("形式が間違っています。"); i--; } } return answer; } //解答と照らし合わせるメソッド public static void checkAnswer(int[] right_answer,int[] user_answer) { for(int i = 0; i < right_answer.length; i++) { for(int j = 0; j < user_answer.length; j++) { if(right_answer[j] == user_answer[i]) { if(j==i) { eat++; }else { bite++; } } } } System.out.println(eat+" eat "+bite+" bite"); } } |
コードの説明をしていきます。
まず、printDirection()メソッドはゲームのルールを説明を出力するためのメソッドです。
メインメソッド内でも最初に呼び出しを行うことでゲーム開始時にゲームのルール説明をすることができます。
次に、makeRightAnswer()メソッドはランダムに3つの数字の配列を作成するメソッドです。Mathクラスのrandomを使って乱数を生成しています。これが答えの3つの数字となります。
3つの数字を得るので戻り値はint型の配列になっています。
次に、readUserAnswer()メソッドはユーザーの入力した3つの数字を読み取り、int型の配列として保存するメソッドです。
try catch構文で、数字以外のものが入力されたときはエラー文を出し、入力のやり直しを求めるようになっています。
次に、checkAnswer(int[] right_answer,int[] user_answer)メソッドはmakeRightAnswer()メソッドで生成された答えの数字の並びと、readUserAnswer()メソッドで読み取ったユーザーが入力した数字の並びを比較して、数字と桁が答えと一致していたら「eat」、数字のみ一致していたら「bite」としてカウントし、その結果を出力するメソッドです。全ての数字が合致していたらゲームを終了し、1つでも数字や桁が間違っている場合はゲームが継続します。
これらのメソッドをメインメソッドで順に呼び出してゲームを進行しています。
また、最初に定義した
1 | final static int answer_size = 3; |
の部分を4に変更すれば4つの数字を当てるゲームに、2に変更すれば2つの数字を当てるゲームに変更できるように工夫しました。
実行結果
実行結果を載せておきます。
まずは3つの数当てゲーム
6回目でクリアできました。
続いて2つの数字当てゲーム(answer_sizeを2に変更する)
こちらも6回目でクリアしました。
まとめ
今回はJavaでの物を作る者初めての作品(?)、数字当てゲームを作成してみました。
Javaの文法は勉強したけど、何も作ったことがないという人におすすめだと思います。
今後は2人での対戦やアイテムなどが使えるように拡張していこうと思います。
最後までお読みいただきありがとうございました。
ではまた!