本ページはプロモーションが含まれています

Java入門

Javaで数当てゲームを作ろう!初心者向け完全ソースコード解説【コピペOK】

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

「プログラミングを学び始めたけれど、何から作れば良いかわからない」「Javaの基本を楽しく復習したい」そんな方にぴったりの記事です。

プログラミング学習は、実際に何かを作りながら学ぶのが一番の近道です。

私自身、Javaを学び始めた頃は参考書を読むだけでは理解が深まらず悩みました。でも簡単なゲームを作ったら、変数・条件分岐・繰り返しの使い方を体感的に理解できたのです。

この記事では、プログラミング初心者の方でも楽しみながらJavaの基礎を学べる「数当てゲーム」の作り方を、3つのステップで解説します。

この記事でわかること:

  • Javaで数当てゲームを3ステップで作る方法(完全コードあり・コピペOK)
  • Random・Scanner・while文・if文の実践的な使い方
  • 試行回数制限・難易度設定・リプレイ機能などの応用実装
  • メソッドを使ってコードをスッキリ整理する方法

この記事を読めば、Javaプログラミングが初めての方でも、簡単なゲームを自分の手で作り上げる達成感を味わえ、Javaの基本的な概念をしっかりと身につけられます。

「すぐにコードを動かしたい!」という方は、完成コード(コピペOK)へジャンプしてください。

数当てゲームってどんなゲーム?

数当てゲームは、プログラミング学習の題材としてよく使われる、シンプルでありながら奥深いゲームです。変数・条件分岐・繰り返しという3大要素をすべて使うため、多くのプログラミング教材で最初のゲーム課題に選ばれます。まずは、そのルールと実際のプレイの流れを見ていきましょう。

ルール

数当てゲームの基本的なルールは非常にシンプルです。

  1. コンピュータがランダムな数を決める: 0から100までの範囲で、一つの整数を秘密裏に選ぶ
  2. プレイヤーが数を予想する: プレイヤーは、コンピュータが選んだと思われる数を入力する
  3. コンピュータがヒントを出す: プレイヤーが入力した数とコンピュータが選んだ数を比較し、「もっと大きい」「もっと小さい」といったヒントを出す
  4. 正解するまで繰り返す: プレイヤーはヒントを頼りに、正解の数にたどり着くまで予想と入力を繰り返す
  5. 正解!: 見事、コンピュータが選んだ数と同じ数を入力できればゲームクリア

ルールは簡単ですが、ヒントを元に効率よく正解に近づく戦略を考えたり、試行回数に制限を設けたりすることで、ゲーム性を高められます。

プレイイメージ

実際にプレイすると、以下のようになります。

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)に変換して返します。

最後に、使い終わったScannerscanner.close();で閉じるのがお作法です。

入力値の型とエラーハンドリング

scanner.nextInt()は整数を期待しますが、もしユーザーが文字などを入力すると、エラー (例外) が発生してプログラムが停止してしまいます。

本格的なアプリケーションでは、このような予期せぬ入力に対応する「エラーハンドリング(予期せぬ入力への対処)」が必要です。hasNextInt()で整数かどうかを確認する方法や、try-catch構文で例外を捕まえる方法があります。

今回はシンプルさを優先し、エラーハンドリングは省略します。

実装ステップ③:ヒントを表示しよう

数が大きい・小さいを判断する条件分岐

プレイヤーの入力 (playerGuess) と正解の数 (randomNumber) を比較するには if-else文を使います。

  • playerGuessrandomNumber より大きければ、「もっと小さいです」と表示します。
  • playerGuessrandomNumber より小さければ、「もっと大きいです」と表示します。
  • どちらでもなければ (つまり等しければ)、「正解!」と表示します。

繰り返し処理でゲーム性アップ

一度だけの予想ではゲームになりません。正解するまで何度も予想とヒントの表示を繰り返す必要があります。これには 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ループを使って、playerGuessrandomNumberが一致しない限り、入力を促し、ヒントを表示し続けます。

一致した時点で elseブロックが実行され、正解メッセージが表示されてループが終了します。試行回数をカウントする変数 attemptsも追加しました。

完成コード(コピペ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() を呼ぶだけ」というシンプルな役割になりました。ゲームロジックが独立したことで、後から機能を追加したり変更したりしやすくなります。

応用編:もっと面白くしてみよう

基本の数当てゲームが完成したら、さらに面白くするための機能を追加してみましょう。

試行回数の制限をつける方法

簡単な難易度調整として、試行回数に上限を設ける方法があります。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 に変更し、ループ内で attemptsmaxAttempts に達したらゲームオーバーのメッセージを表示するようにします。

もう一度プレイする機能を追加する

ゲームをクリアしたあと「もう一度遊ぶか?」を聞いて、繰り返しプレイできるようにしてみましょう。ゲーム全体を外側の 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. 最初に難易度 (例: 1:簡単, 2:普通, 3:難しい) を入力してもらいます。
  2. 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までの範囲

// ... (以降のゲームロジック) ...

このように、少しの工夫でゲームはもっと面白くなります。ぜひ挑戦してみてください。

まとめと次のステップ

今回は、Javaプログラミングの入門として、数当てゲームの作り方を解説しました。

数当てゲームを作ることで、Javaの基本的な要素を実践的に学べています。

RandomScannerの使い方、if文の条件分岐、while文の繰り返し。プログラミングの根幹となる概念を、実際にコードとして書いて動かしたからです。

さらに、メソッドへの切り出しやリプレイ機能の実装を通じて、「動くコードをより良いコードへ改善する」という開発の流れも体験できたことになります。

次は、じゃんけんゲームやTodoリストアプリなど、少し複雑なプログラムに挑戦してみてください。

このゲームで学べたJavaのポイント

  • 標準ライブラリの活用: RandomScanner といった、Javaが提供する便利なクラスの使い方。
  • 変数とデータ型: int を中心としたデータの扱い方。
  • 制御構造: if 文による判断と while / do-while 文による繰り返し。
  • 基本的な入出力: コンソールへの表示 (System.out.println) とキーボードからの入力 (Scanner)。
  • メソッドへの分離: コードを部品化して読みやすく、改修しやすくする設計の第一歩。
  • プログラムの構造: main メソッドを中心とした基本的なプログラムの組み立て方。
  • この記事を書いた人
  • 最新記事

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

-Java入門