Javaで「数当てゲーム(数あてゲーム)」を作りたい初心者の方へ。本記事では、Random・Scanner・while文・if文という4つの基本要素を使い、コピペでそのまま動くソースコードを3ステップで解説します。
私自身もJava学習初期、参考書を読むだけでは理解が定着せず悩みました。実際に数当てゲームを作ってみたところ、変数・条件分岐・繰り返しの使い方が一気にイメージできるようになった経験があります。
本記事を読み終えれば、シンプルな数当てゲームの完成コードを手元で動かせるだけでなく、試行回数制限・難易度設定・リプレイ機能などの応用までステップアップできます。
この記事でわかること:
- Javaで数当てゲームを3ステップで作る方法(完全コードあり・コピペOK)
- Random・Scanner・while文・if文の実践的な使い方
- 試行回数制限・難易度設定・リプレイ機能などの応用実装
- メソッドを使ってコードをスッキリ整理する方法
この記事を読めば、Javaプログラミングが初めての方でも、簡単なゲームを自分の手で作り上げる達成感を味わえ、Javaの基本的な概念をしっかりと身につけられます。
「すぐにコードを動かしたい!」という方は、完成コード(コピペOK)へジャンプしてください。
数当てゲームってどんなゲーム?

数当てゲームは、プログラミング学習の題材として定番のゲームです。シンプルですが、奥は深いです。変数・条件分岐・繰り返しという3大要素をすべて使うため、多くのプログラミング教材で最初のゲーム課題に選ばれます。まずは、そのルールと実際のプレイの流れを見ていきましょう。
読み方と表記(数当て / 数あて / 数字当て)
読み方は「かずあてゲーム」です。記事や教材によって「数当てゲーム」「数あてゲーム」「数字当てゲーム」と複数の表記が使われていますが、いずれも同じゲームを指します。本記事ではコード変数名(NumberGuessingGame)との整合性を取り、漢字表記の「数当てゲーム」で統一します。
ルール
数当てゲームの基本的なルールは非常にシンプルです。
- コンピュータがランダムな数を決める: 0から100までの範囲で、一つの整数を秘密裏に選ぶ
- プレイヤーが数を予想する: プレイヤーは、コンピュータが選んだと思われる数を入力する
- コンピュータがヒントを出す: プレイヤーが入力した数とコンピュータが選んだ数を比較し、「もっと大きい」「もっと小さい」といったヒントを出す
- 正解するまで繰り返す: プレイヤーはヒントを頼りに、正解の数にたどり着くまで予想と入力を繰り返す
- 正解!: 見事、コンピュータが選んだ数と同じ数を入力できればゲームクリア
ルールは簡単ですが、ヒントを元に効率よく正解に近づく戦略を考えたり、試行回数に制限を設けたりすることで、ゲーム性を高められます。
プレイイメージ
実際にプレイすると、以下のようになります。
0から100の数を当ててください!
あなたの予想は?: 50
もっと大きいです。
あなたの予想は?: 75
もっと小さいです。
あなたの予想は?: 63
もっと大きいです。
あなたの予想は?: 69
正解! 4回で当たりました!このような対話形式でゲームが進んでいきます。プログラミングで作ることで、この一連の流れを自動化できるのです。
実装ステップ①:ランダムな数を生成しよう

最初のステップは、ゲームの核となる「コンピュータが秘密の数を決める」処理の実装です。Javaでランダムな数を生成するにはRandomクラスを使います。
Randomクラスの使い方
Randomクラスは、さまざまな種類の乱数を生成する機能を提供します。Randomクラスを使うには、まずオブジェクトを作成します。
import java.util.Random; // Randomクラスを使うために必要
public class NumberGuessingGame {
public static void main(String[] args) {
Random random = new Random(); // Randomオブジェクトを作成
int randomNumber = random.nextInt(101); // 0から100までのランダムな整数を生成
// (後でrandomNumberを使った処理を追加)
}
}コードの最初にimport java.util.Random;と書くことで、Randomクラスが使えるようになります。そして new Random() でオブジェクトを作り、nextInt() メソッドを呼び出すことで、ランダムな整数を取得します。
0〜100の範囲にする方法
nextInt(n)メソッドは、0以上n未満の整数をランダムに返します。したがって、0から100までの範囲の整数が欲しい場合は、n に101を指定します。
int randomNumber = random.nextInt(101);nextInt(101)の実行で、randomNumberに0から100までのいずれかの整数がランダムに代入されます。randomNumberが、プレイヤーが当てるべき正解の数です。
実装ステップ②:ユーザーの入力を受け取ろう

次に、プレイヤーが予想した数をキーボードから入力してもらう処理を作ります。これには Scannerクラスが便利です。
Scannerクラスの活用
Scannerクラスは、キーボードからの入力やファイルからの読み込みなど、さまざまな入力ソースからデータを読み取るためのクラスです。
import java.util.Scanner; // Scannerクラスを使うために必要
import java.util.Random;
public class NumberGuessingGame {
public static void main(String[] args) {
Random random = new Random();
int randomNumber = random.nextInt(101);
Scanner scanner = new Scanner(System.in); // Scannerオブジェクトを作成
System.out.println("0から100の数を当ててください!");
System.out.print("あなたの予想は?: ");
int playerGuess = scanner.nextInt(); // ユーザーが入力した整数を読み取る
System.out.println("あなたが入力したのは: " + playerGuess); // 入力確認 (後で削除)
scanner.close(); // Scannerを閉じる (重要)
}
}Randomと同様に、import java.util.Scanner;でScanner クラスをインポートします。
new Scanner(System.in)で、キーボードからデータを読み取るScannerオブジェクトを作成します。nextInt()メソッドは、入力された文字列を整数(int)に変換して返します。
最後に、使い終わったScannerはscanner.close();で閉じるのがお作法(マナー)です。
💡 ハマりポイント:Scannerをclose()せずに放置すると、IDE(IntelliJ・Eclipse等)で「Resource leak」警告が表示されます。一方で、複数のScannerをSystem.inに対して作ってclose()すると、内部的に標準入力ストリームが閉じてしまい、後続のScanner生成で例外が出ます。1つのScannerをプログラム全体で使い回し、最後に1回だけclose()するのが安全です。
入力値の型とエラーハンドリング
scanner.nextInt()は整数を期待しますが、もしユーザーが文字などを入力すると、エラー (例外) が発生してプログラムが停止してしまいます。
本格的なアプリケーションでは、このような予期せぬ入力に対応する「エラーハンドリング(予期せぬ入力への対処)」が必要です。hasNextInt()で整数かどうかを確認する方法や、try-catch構文で例外を捕まえる方法があります。
本記事はシンプルさを優先し、エラーハンドリングは省略します。
実装ステップ③:ヒントを表示しよう

数が大きい・小さいを判断する条件分岐
プレイヤーの入力 (playerGuess) と正解の数 (randomNumber) を比較するには if-else文を使います。
playerGuessがrandomNumberより大きければ、「もっと小さいです」と表示します。playerGuessがrandomNumberより小さければ、「もっと大きいです」と表示します。- どちらでもなければ (つまり等しければ)、「正解!」と表示します。
繰り返し処理でゲーム性アップ
一度だけの予想ではゲームになりません。正解するまで何度も予想とヒントの表示を繰り返す必要があります。これには while文が適しています。
「プレイヤーの入力と正解の数が等しくない間」という条件でループさせ、ループの中で入力とヒント表示を行います。
import java.util.Scanner;
import java.util.Random;
public class NumberGuessingGame {
public static void main(String[] args) {
Random random = new Random();
int randomNumber = random.nextInt(101);
Scanner scanner = new Scanner(System.in);
int playerGuess = -1; // -1 など、ありえない値で初期化
int attempts = 0; // 試行回数をカウントする変数
System.out.println("0から100の数を当ててください!");
while (playerGuess != randomNumber) { // 正解するまで繰り返す
System.out.print("あなたの予想は?: ");
playerGuess = scanner.nextInt();
attempts++; // 試行回数を1増やす
if (playerGuess < randomNumber) {
System.out.println("もっと大きいです。");
} else if (playerGuess > randomNumber) {
System.out.println("もっと小さいです。");
} else {
System.out.println("正解! " + attempts + "回で当たりました!");
}
}
scanner.close();
}
}上のコードでは、whileループを使って、playerGuessとrandomNumberが一致しない限り、入力を促し、ヒントを表示し続けます。
一致した時点で elseブロックが実行され、正解メッセージが表示されてループが終了します。試行回数をカウントする変数 attemptsも追加しました。
💡 なぜ playerGuess = -1 で初期化するのか:今回のゲームは「0〜100の整数」を扱うため、ユーザーが絶対に入力しない値(=範囲外の-1)で初期化することで、while (playerGuess != randomNumber)の条件を初回必ず真にしてループに入れます。do-whileで書く方法もありますが、初期値で制御するパターンは「ループに入る前から条件式が成立している」ことを明示できる定番テクニックです。
完成コード(コピペOK)
3つのステップを組み合わせると、Javaによる数当てゲームの完成です。以下のコードをそのままコピーして実行できます。
全体コードの解説
import java.util.Random;
import java.util.Scanner;
/**
* Javaで実装した数当てゲームです。
*/
public class NumberGuessingGame {
public static void main(String[] args) {
// 1. ゲームの準備
Random random = new Random();
int randomNumber = random.nextInt(101); // 0から100のランダムな数を生成
Scanner scanner = new Scanner(System.in);
int playerGuess = -1; // プレイヤーの予想を初期化
int attempts = 0; // 試行回数を初期化
// 2. ゲーム開始のメッセージ
System.out.println("================================");
System.out.println(" Java 数当てゲーム スタート!");
System.out.println("================================");
System.out.println("0から100の数を当ててください!");
// 3. ゲームのメインループ (正解するまで繰り返す)
while (playerGuess != randomNumber) {
System.out.print("あなたの予想は?: ");
// ユーザー入力を受け取る
playerGuess = scanner.nextInt();
attempts++; // 試行回数を増やす
// 4. 入力値と正解を比較してヒントを出す
if (playerGuess < randomNumber) {
System.out.println("→ もっと大きいです。");
} else if (playerGuess > randomNumber) {
System.out.println("→ もっと小さいです。");
} else {
// 5. 正解の場合
System.out.println("🎉 正解! 🎉");
System.out.println(attempts + "回で当たりました!");
}
}
// 6. ゲーム終了処理
System.out.println("ゲームを終了します。");
scanner.close(); // Scannerを閉じる
}
}上のコードは、ステップ①〜③の要素を組み合わせたものです。main メソッドの中に、ゲームの準備、開始メッセージ、メインループ、終了処理という流れで記述されています。
メソッドに分割してコードを整理しよう
完成コードが動いたら、次はコードをメソッドに分けて整理してみましょう。メソッドを使うと、処理のかたまりに名前をつけて部品化でき、コードが読みやすくなります。メソッド分割は、オブジェクト指向プログラミング(データと処理をまとめて管理する考え方)の入り口です。
メソッド分離のコード例
ゲームのメインロジックを playGame() というメソッドに切り出すと、main メソッドがスッキリします。
import java.util.Random;
import java.util.Scanner;
public class NumberGuessingGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
playGame(scanner); // ゲームを実行するメソッドを呼び出す
scanner.close();
}
/**
* 数当てゲームのメインロジック
*/
static void playGame(Scanner scanner) {
Random random = new Random();
int randomNumber = random.nextInt(101);
int playerGuess = -1;
int attempts = 0;
System.out.println("================================");
System.out.println(" Java 数当てゲーム スタート!");
System.out.println("================================");
System.out.println("0から100の数を当ててください!");
while (playerGuess != randomNumber) {
System.out.print("あなたの予想は?: ");
playerGuess = scanner.nextInt();
attempts++;
if (playerGuess < randomNumber) {
System.out.println("→ もっと大きいです。");
} else if (playerGuess > randomNumber) {
System.out.println("→ もっと小さいです。");
} else {
System.out.println("🎉 正解! 🎉");
System.out.println(attempts + "回で当たりました!");
}
}
}
}main メソッドが「playGame() を呼ぶだけ」というシンプルな役割になりました。ゲームロジックが独立したことで、後から機能を追加したり変更したりしやすくなります。
ちなみに、最初からメソッド分割しようとして手が止まる初心者は多いです。実務でも「まず動くコードをmainにベタ書き → 動作確認後にメソッド抽出(リファクタリング)」という流れの方が、設計に悩まず学習が進みます。本記事もあえてステップ①〜③で全部mainに書き、完成後にメソッド分割する順序にしているのはこの理由です。
応用編:試行回数制限・難易度設定・リプレイ機能を追加しよう
基本の数当てゲームが完成したら、さらに面白くするための機能を追加してみましょう。
試行回数の制限をつける方法
簡単な難易度調整として、試行回数に上限を設ける方法があります。whileループの条件に、試行回数のチェックを追加します。
int maxAttempts = 10; // 最大試行回数を10回に設定
boolean isCorrect = false; // 正解したかどうかを管理するフラグ
// ... (randomNumber, scanner の準備) ...
System.out.println("0から100の数を当ててください!(チャンスは" + maxAttempts + "回)");
while (attempts < maxAttempts && !isCorrect) { // 回数上限 と 正解するまで
System.out.print("あなたの予想は? (" + (attempts + 1) + "回目): ");
playerGuess = scanner.nextInt();
attempts++;
if (playerGuess < randomNumber) {
System.out.println("→ もっと大きいです。");
} else if (playerGuess > randomNumber) {
System.out.println("→ もっと小さいです。");
} else {
System.out.println("🎉 正解! 🎉");
System.out.println(attempts + "回で当たりました!");
isCorrect = true; // 正解フラグを立てる
}
// ゲームオーバー判定
if (!isCorrect && attempts >= maxAttempts) {
System.out.println("残念! 回数上限です。正解は " + randomNumber + " でした。");
}
}
// ... (scanner.close()) ...while の条件を attempts < maxAttempts && !isCorrect に変更し、ループ内で attempts が maxAttempts に達したらゲームオーバーのメッセージを表示するようにします。
もう一度プレイする機能を追加する
ゲームをクリアしたあと「もう一度遊ぶか?」を聞いて、繰り返しプレイできるようにしてみましょう。ゲーム全体を外側の do-while ループで囲むだけで実現できます。
import java.util.Random;
import java.util.Scanner;
public class NumberGuessingGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String playAgain;
do {
// ゲームの準備
Random random = new Random();
int randomNumber = random.nextInt(101);
int playerGuess = -1;
int attempts = 0;
System.out.println("0から100の数を当ててください!");
while (playerGuess != randomNumber) {
System.out.print("あなたの予想は?: ");
playerGuess = scanner.nextInt();
attempts++;
if (playerGuess < randomNumber) {
System.out.println("→ もっと大きいです。");
} else if (playerGuess > randomNumber) {
System.out.println("→ もっと小さいです。");
} else {
System.out.println("🎉 正解! " + attempts + "回で当たりました!");
}
}
System.out.print("もう一度プレイしますか? (y/n): ");
playAgain = scanner.next();
} while (playAgain.equalsIgnoreCase("y")); // "y" または "Y" なら繰り返す
System.out.println("ゲームを終了します。ありがとうございました!");
scanner.close();
}
}do-while ループは「最低1回は実行し、条件が真の間繰り返す」構文です。ゲーム終了後に「y」を入力すると新しいゲームが始まります。
難易度別に範囲や回数を変えるには?
さらに、ゲーム開始時にプレイヤーに難易度を選んでもらい、それに応じて数の範囲や試行回数を変えることもできます。
- 最初に難易度 (例: 1:簡単, 2:普通, 3:難しい) を入力してもらいます。
if文やswitch文を使って、選ばれた難易度に応じて、randomNumberの範囲 (nextIntの引数) やmaxAttemptsの値を設定します。
// ... (Scannerの準備) ...
System.out.println("難易度を選んでください (1:簡単, 2:普通, 3:難しい)");
int difficulty = scanner.nextInt();
int maxNumber;
int maxAttempts;
switch (difficulty) {
case 1: // 簡単
maxNumber = 50;
maxAttempts = 10;
break;
case 3: // 難しい
maxNumber = 500;
maxAttempts = 8;
break;
default: // 普通 (または不正な入力)
maxNumber = 100;
maxAttempts = 7;
break;
}
Random random = new Random();
int randomNumber = random.nextInt(maxNumber + 1); // 0からmaxNumberまでの範囲
// ... (以降のゲームロジック) ...このように、少しの工夫でゲームはもっと面白くなります。ぜひ挑戦してみてください。
よくある質問(FAQ)
数当てゲームを実装するときに、初心者がつまずきやすいポイントをQ&A形式でまとめました。
Q1. nextInt()で数字以外を入力するとどうなりますか?
scanner.nextInt()は整数のみを期待するため、ユーザーが「abc」など文字を入力するとInputMismatchExceptionが発生してプログラムが停止します。本格的に対応する場合は、hasNextInt()で整数かどうかを事前判定するか、try-catch構文で例外を捕捉します。学習目的の今回は、シンプルさを優先して例外処理を省略しています。
Q2. 何度実行しても同じ乱数が出てしまうのですが?
new Random()は内部的に現在時刻をシード値として使うため、通常は実行ごとに異なる乱数が生成されます。同じ値が連続する場合は、ループ内でRandomオブジェクトを毎回 new し直していないか確認してください。Randomはループの外で1回だけ生成し、nextInt()を繰り返し呼び出すのが正しい使い方です。
Q3. 数の範囲を1〜100に変えるにはどうすれば?
random.nextInt(101)は0以上100以下を返します。1〜100にしたい場合はrandom.nextInt(100) + 1と書き換えます。nextInt(n)は「0以上n未満」を返す仕様なので、最大値を含めたいときは引数に+1、最小値を1以上にしたいときは戻り値に+1します。
まとめと次のステップ
本記事では、Javaプログラミング入門として、数当てゲームの作り方を解説しました。
数当てゲームを作ることで、Javaの基本的な要素を実践的に学べています。
RandomやScannerの使い方、if文の条件分岐、while文の繰り返し。プログラミングの根幹となる概念を、実際にコードとして書いて動かしたからです。
さらに、メソッドへの切り出しやリプレイ機能の実装を通じて、「動くコードをより良いコードへ改善する」という開発の流れも体験できたことになります。
次は、じゃんけんゲームやTodoリストアプリなど、少し複雑なプログラムに挑戦してみてください。
このゲームで学べたJavaのポイント
- 標準ライブラリの活用:
RandomやScannerといった、Javaが提供する便利なクラスの使い方。 - 変数とデータ型:
intを中心としたデータの扱い方。 - 制御構造:
if文による判断とwhile/do-while文による繰り返し。 - 基本的な入出力: コンソールへの表示 (
System.out.println) とキーボードからの入力 (Scanner)。 - メソッドへの分離: コードを部品化して読みやすく、改修しやすくする設計の第一歩。
- プログラムの構造:
mainメソッドを中心とした基本的なプログラムの組み立て方。
