こんにちは!
本記事では、人気の数学パズルゲーム「ヌメロン」をJavaで作る方法を解説します。
Java初心者の方でも理解できるように、具体的なコード例を交えて説明します!
この記事を見ながら実際にコードを書いて試して見てね!
ヌメロンとは
まずヌメロンについて少し説明します。
一応この記事はヌメロンを知っている人向けなので、詳しく知りたい方は調べてみるといいかもしれません!
ヌメロンは、数字を使った数学パズルゲームの一つです。
10個の数字を使って3桁の数を作り、相手の答えを当てるゲームです。
数字と桁が一致した場合は“eat”、数字だけが一致した場合は“bite”となります。
相手の選んだ数字が369の場合
自分の予想が123 → 0 eat / 1 bite (桁は違うが3という数字は出てくる)
自分の予想が396 → 1 eat / 2 bite(3は桁も数字も一致/6と9は桁は違うが数字は出てくる)
このような情報をもとに相手の選んだ3桁の数字を推測していくゲームです!
今回は1人で遊べるヌメロンをJavaで作ってみよう
Java でのヌメロン作成の手順
Javaでヌメロンを作るには、以下の手順が必要です。
- 10個の数字からランダムに3桁の数を作成する
- プレイヤーに3桁の数字を入力してもらう
- プレイヤーの入力と正解を比較する
- eatとbiteの数を計算して表示する
- 正解した場合はおめでとうメッセージを表示する
- 最後に答えを表示する
具体的なコード例
解説の前にJavaでヌメロンを作成するための具体的なコード例を紹介します!詳しい説明はこの後に行います。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class Numeron {
public static void main(String[] args) {
// ランダムに3桁の数字を生成する
List<Integer> answer = new ArrayList<>();
Random rand = new Random();
while (answer.size() < 3) {
int num = rand.nextInt(10);
if (!answer.contains(num)) {
answer.add(num);
}
}
int turn = 0;
// 入力を受け付ける
Scanner scanner = new Scanner(System.in);
System.out.println("3桁の数字を入力してください");
while (turn<7) {
// 入力された数字をリストに変換する
List<Integer> input = new ArrayList<>();
String inputStr = scanner.next();
for (int i = 0; i < inputStr.length(); i++) {
int num = Character.getNumericValue(inputStr.charAt(i));
input.add(num);
}
// eat, biteを計算する
int eat = 0;
int bite = 0;
for (int i = 0; i < answer.size(); i++) {
if (answer.get(i).equals(input.get(i))) {//位置と数字が完全一致
eat++;
} else if (answer.contains(input.get(i))) { // 数字のみ一致
bite++;
}
}
// eat, biteを表示する
if (eat == 3) { // 正解の場合
System.out.println("おめでとうございます!正解です!");
break;
} else { // 不正解の場合
System.out.println("eat:" + eat + " bite:" + bite);
turn++;
}
}
// 答えを表示する
System.out.println("答え:" + answer.get(0) + answer.get(1) + answer.get(2));
}
}
上の画像は実行した例です。コピペでも模写でもいいので一度ご自身のパソコンで実行して見てください!
コードの解説
ここからはこのコードを、先ほどの「Javaでのヌメロン作成の手順」に沿って解説します。
3桁の数字をランダムに生成する
// ランダムに3桁の数字を生成する
List<Integer> answer = new ArrayList<>();
Random rand = new Random();
while (answer.size() < 3) {
int num = rand.nextInt(10);
if (!answer.contains(num)) {
answer.add(num);
}
}
ランダムに生成された数字は、List<Integer>型の変数answerに格納されます。
生成された数字に重複がなければanswerに格納しているので、同じ数字は含まれません。
入力を受け付ける
int turn = 0; //プレイ回数
// 入力を受け付ける
Scanner scanner = new Scanner(System.in);
System.out.println("3桁の数字を入力してください");
while (turn<7) {
// 入力された数字をリストに変換する
List<Integer> input = new ArrayList<>();
String inputStr = scanner.next();
for (int i = 0; i < inputStr.length(); i++) {
int num = Character.getNumericValue(inputStr.charAt(i));
input.add(num);
}
Scannerクラスを使用して、入力を受け取っています。
入力された文字列は、List<Integer>型の変数inputに格納されます。
for文を使って文字列を1文字ずつ数字に変換し、リストに格納しています。
while文の条件はプレイ回数(turn)を決めています。(何回以内に正解しなければゲームオーバーとするか)
eat, biteを計算する
// eat, biteを計算する
int eat = 0;
int bite = 0;
for (int i = 0; i < answer.size(); i++) {
if (answer.get(i).equals(input.get(i))) { // 位置と数字が完全一致
eat++;
} else if (answer.contains(input.get(i))) { // 数字のみ一致
bite++;
}
}
eatとbiteの数を計算しています。
eat:位置と数字が完全に一致する数の個数
bite:数字のみが一致する数の個数
for文を使って、answerとinputを比較しています。
位置と数字が完全一致する場合はeatを、数字のみが一致する場合はbiteをインクリメントしています。
ただし注意点があります。
先にbiteから計算するとeatの場合もbiteがインクリメントされてしまう
→ ifとelse ifの条件の順番は変えない!
eatとbiteを表示する
// eat, biteを表示する
if (eat == 3) { // 正解の場合
System.out.println("おめでとうございます!正解です!");
break;
} else { // 不正解の場合
System.out.println("eat:" + eat + " bite:" + bite);
turn++;
}
このコードでeatとbiteの数を表示することができます。
正解 → 「おめでとうございます!正解です!」と表示され、whileループから抜ける(ゲームを終了する)。
不正解 → プレイ回数を1つ増やす。
答えを表示する
// 答えを表示する
System.out.println("答え:" + answer.get(0) + answer.get(1) + answer.get(2));
ゲームが終了した時(ゲームオーバー、もしくは正解)、答えを表示します。
これでヌメロンは完成です!はじめは難しく思えた内容も、今は理解できているのではないでしょうか。
まとめ
今回はJavaでヌメロンを作成しました!
ここで解説したコードを自分で発展させて独自ルールを追加したりすると、プログラミングの学習としてはとてもいい効果が出ると思います。
是非試して見てください!
当サイトではJava以外にもJavaScriptの解説記事も公開しています!ぜひご覧ください。
他にも様々なプログラミング言語やAWS、競技プログラミングについての記事も公開しています。
そちらも併せて見て頂けると嬉しいです!
カテゴリーを検索する
コメント