【C++入門】計算クイズゲームを作成してみよう!

計算クイズゲーム画像 C++実践

ゲーム概要

この記事では、C++を用いて簡単な算数クイズゲームを作成する方法を紹介します。このゲームは、ランダムに生成された算数の問題を出題し、ユーザーの回答をチェックします。このゲームを作成することで、以下のような学びが得られます。

  • C++の基本的な概念(変数、ループ、条件文など)
  • 乱数の生成と利用方法
  • 入力のエラーチェックの方法
  • 算数の問題を自動生成するアルゴリズム

ゲームを実行するための環境構築がまだの方は「C++を実行するための環境構築|初心者でも簡単!(Windows)」をご覧ください。

コード一覧

下記のコードをコピーしてVisual Studioで実行してみてください。

実行方法がわからない方は「C++でプログラムを動かしてみよう!」をご覧ください。

※コード欄にカーソルを当てると右上にコピーボタンが表示されます。

#include <iostream>
#include <cstdlib>
#include <ctime>

int main() {
    // 乱数のシードを初期化
    std::srand(std::time(0));

    int numQuestions = 5;  // 出題する問題数
    int correctAnswers = 0; // 正解数

    for (int i = 0; i < numQuestions; i++) {
        int num1 = std::rand() % 10 + 1; // 1から10までの乱数
        int num2 = std::rand() % 10 + 1; // 1から10までの乱数
        char operators[] = { '+', '-', '*' }; // 除算を除外
        char op = operators[std::rand() % 3]; // ランダムに演算子を選択

        int correctAnswer;
        switch (op) {
        case '+':
            correctAnswer = num1 + num2;
            break;
        case '-':
            correctAnswer = num1 - num2;
            break;
        case '*':
            correctAnswer = num1 * num2;
            break;
        }

        while (true) {
            std::cout << "問題 " << i + 1 << ": " << num1 << " " << op << " " << num2 << " = ?\n";
            double playerAnswer;
            std::cin >> playerAnswer;

            // 入力エラーチェック
            if (std::cin.fail()) {
                std::cin.clear(); // エラー状態をクリア
                std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 改行文字が出現するまで入力を無視
                std::cout << "無効な入力です。整数を入力してください。\n";
                continue;
            }

            // 小数点チェック
            if (playerAnswer != static_cast<int>(playerAnswer)) {
                std::cout << "無効な入力です。整数を入力してください。\n";
                continue;
            }

            if (static_cast<int>(playerAnswer) == correctAnswer) {
                std::cout << "正解!\n";
                correctAnswers++;
            }
            else {
                std::cout << "不正解。正しい答えは " << correctAnswer << " です。\n";
            }
            break;
        }
    }

    std::cout << "あなたの正解数は " << correctAnswers << " / " << numQuestions << " です。\n";

    return 0;
}

コード解説

インクルードステートメント

#include <iostream>
#include <cstdlib>
#include <ctime>

これらの行は、プログラムが必要とする標準ライブラリをインクルードしています。

  • <iostream>は入出力ストリーム
  • <cstdlib>は一般的なユーティリティ関数(この場合は乱数生成)
  • <ctime>は時間関連の関数

メイン関数の開始:

int main() {

main関数は、C++プログラムのエントリーポイント(開始点)です。この関数内にプログラムの主要な動作を記述します。

乱数の初期化:

// 乱数のシードを初期化
std::srand(std::time(0));

この行は、乱数生成器のシード(開始点)を現在の時間に設定します。これにより、プログラムを実行するたびに異なる乱数が生成されます。

問題の出題と正解のチェック:

int numQuestions = 5;  // 出題する問題数
int correctAnswers = 0; // 正解数

for (int i = 0; i < numQuestions; i++) {
    int num1 = std::rand() % 10 + 1; // 1から10までの乱数
    int num2 = std::rand() % 10 + 1; // 1から10までの乱数
    char operators[] = { '+', '-', '*' }; // 除算を除外
    char op = operators[std::rand() % 3]; // ランダムに演算子を選択

    int correctAnswer;
    switch (op) {
    case '+':
        correctAnswer = num1 + num2;
        break;
    case '-':
        correctAnswer = num1 - num2;
        break;
    case '*':
        correctAnswer = num1 * num2;
        break;
    }

このforループは、指定された数の問題を出題します。各問題では、2つの乱数(num1num2が生成され、ランダムに選ばれた演算子(opを使用して算数の問題が作成されます。その後、ユーザーからの回答(playerAnswer)が正解(correctAnswer)と一致するかどうかをチェックします。

入力のエラーチェック:

while (true) {
    std::cout << "問題 " << i + 1 << ": " << num1 << " " << op << " " << num2 << " = ?\n";
    double playerAnswer;
    std::cin >> playerAnswer;

    // 入力エラーチェック
    if (std::cin.fail()) {
        std::cin.clear(); // エラー状態をクリア
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 改行文字が出現するまで入力を無視
        std::cout << "無効な入力です。整数を入力してください。\n";
        continue;
    }

このif文は、ユーザーからの入力が無効(例えば、数値ではない)場合にエラーメッセージを表示します。その後、std::cin.clear()std::cin.ignore()を使用して、エラー状態をクリアし、次の入力を待ちます。

小数点のチェック:

// 小数点チェック
if (playerAnswer != static_cast<int>(playerAnswer)) {
    std::cout << "無効な入力です。整数を入力してください。\n";
    continue;
}

このif文は、ユーザーからの入力が整数でない(つまり、小数点が含まれている)場合にエラーメッセージを表示します。

正解数の表示:

if (static_cast<int>(playerAnswer) == correctAnswer) {
    std::cout << "正解!\n";
    correctAnswers++;
}
else {
    std::cout << "不正解。正しい答えは " << correctAnswer << " です。\n";
}
break;
}
std::cout << "あなたの正解数は " << correctAnswers << " / " << numQuestions << " です。\n";

return 0;
}

最後に、ユーザーが正解した問題の数(correctAnswers)と出題された問題の総数(numQuestions)を表示します。

このコードは、C++の基本的な概念(変数、ループ、条件文、乱数の生成など)を使用しています。これらの概念を理解することは、C++や他のプログラミング言語を学ぶ上で非常に重要です。このコードを通じて、これらの概念がどのように動作するかを見ることができます。

まとめ

コードの流れは以下の通りです:

  • 乱数のシードを初期化
  • 指定された数の問題を出題
  • ユーザーからの回答が正解と一致するかチェック
  • 入力が無効(例えば、数値ではない)場合にエラーメッセージを表示
  • ユーザーが正解した問題の数と出題された問題の総数を表示

このゲームを作成することで、以下のような学びが得られます。

  • C++の基本的な概念の理解と実践
  • 乱数の生成と利用方法の理解
  • 入力のエラーチェックの方法の理解
  • 算数の問題を自動生成するアルゴリズムの理解

このゲームは、C++の基本的な概念を理解し、実践する絶好の機会です。また、乱数の生成と利用、入力のエラーチェック、算数の問題を自動生成するアルゴリズムなど、プログラミングの重要なスキルを身につけることができます。このゲームを通じて、プログラミングの楽しさとその可能性を体験してみてください。


ゲームを実行するための環境構築がまだの方は「C++を実行するための環境構築|初心者でも簡単!(Windows)」をご覧ください。

コメント

タイトルとURLをコピーしました