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

Java入門

3ステップで完成!Java数あてゲームプログラミング

トム

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

「プログラミングを学び始めたけれど、何から作れば良いかわからない」「Javaの基本を楽しく復習したい」そう考えている方はいらっしゃいませんか。

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

私自身、Javaを学び始めた頃、参考書を読むだけではなかなか理解が深まらず、悩んだ経験があります。そんな時、簡単なゲームを作ることで、変数や条件分岐、繰り返しといった基本文法がどのように使われるのか、体感的に理解できました。

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

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

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

数あてゲームは、プログラミング学習の題材としてよく使われる、シンプルでありながら奥深いゲームです。まずは、そのルールと実際のプレイの流れを見ていきましょう。

ルール

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

  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);

これで、randomNumberという変数に、0から100までのいずれかの整数がランダムに代入されます。これが、プレイヤーが当てるべき「正解の数」になります。

実装ステップ②:ユーザーの入力を受け取ろう

次に、プレイヤーが予想した数をキーボードから入力してもらう処理を実装します。これには 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構文で例外を捕捉したりする方法があります。

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

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

正解の数とプレイヤーの入力が得られたので、これらを比較してヒントを出し、正解するまで繰り返す処理を実装します。ここでは if文と while文が活躍します。

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

プレイヤーの入力 (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も追加しました。

完成コード

これまでのステップを組み合わせると、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 メソッドの中に、ゲームの準備、開始メッセージ、メインループ、終了処理という流れで記述されています。

応用編:難易度を設定してみよう

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

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

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

難易度別に範囲や回数を変えるには?

さらに、ゲーム開始時にプレイヤーに難易度を選んでもらい、それに応じて数の範囲や試行回数を変えることもできます。

  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文による繰り返し処理という、プログラミングの根幹をなす概念を実際にコードとして記述し、動かしたからです。

例えば、ランダムな数を生成し、ユーザー入力を受け取り、ヒントを出しながら正解に導く、という一連の流れを組み立てる経験は、今後の学習に大いに役立ちます。

この経験を通して、Javaプログラミングの楽しさと奥深さを感じていただけたなら幸いです。

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

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

トム

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

-Java入門