MENU

【C言語】クイズゲーム作成(2)ループ処理でスッキリさせる

クイズゲーム作成(2)ループ処理でスッキリさせる_サムネ

こんにちは、コン(@pippi_kon)です。

この記事では『C言語でのクイズゲームの作り方』をご紹介しています。

前回は、クイズゲームの基本となる簡単な三択形式の問題の作り方をご紹介しました。

問題をただ愚直に表示するというシンプルな作りで、同じような処理を何度も行っていました。

なので今回は、似たような処理の部分をループ処理に置き換えてプログラムをスッキリさせます

OS:Windows 10(x64)
開発環境:Visual Studio 2019(Community)

目次

今回の目標

今回作成するプログラムの出力結果です。

クイズゲーム02_今回の目標

出力結果自体は前回と変わりませんが、中身のプログラム処理が変わります

前回は3つの問題をそれぞれprintf関数で表示していました。

そのため、同じ処理がプログラム内に3か所ありました。

今回は、これらを1つにまとめます。

▲目次へ戻る

プログラム全文

今回作成したプログラムのご紹介です。

のちほど、プログラムの解説を行います。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int		ans;
	int		i;

	char	q[3][5][100] = {
		{"リンゴは英語で何と言う?", "apple", "orange", "banana", "1"},
		{"大正->昭和->○○->令和\n○○に入る年号は?", "慶応", "明治", "平成", "3"},
		{"世界三大珍味はどれ?", "イカスミ", "キャビア", "チーズ", "2"}
	};

	for (i = 0; i < 3; i++) {
		printf("[第%d問]\n", i + 1);
		printf("%s\n", q[i][0]);
		printf("1:%s  2:%s  3:%s\n", q[i][1], q[i][2], q[i][3]);
		printf(">>> ");
		scanf("%d", &ans);
		if (ans == atoi(q[i][4])) {
			printf("正解!\n\n");
		}
		else {
			printf("不正解...\n");
			printf("正解は %d:%s です。\n\n", atoi(q[i][4]), q[i][atoi(q[i][4])]);
		}
	}

	return 0;
}

▲目次へ戻る

スポンサーリンク

プログラムの解説

ヘッダーの追加(atoi関数用)

#include <stdlib.h>

新しく「stdlib.h」をインクルードしています。

これはのちに出てくる「atoi関数」を使用するために必要となります。

▲目次へ戻る

問題・選択肢の配列化

	char	q[3][5][100] = {
		{"リンゴは英語で何と言う?", "apple", "orange", "banana", "1"},
		{"大正->昭和->○○->令和\n○○に入る年号は?", "慶応", "明治", "平成", "3"},
		{"世界三大珍味はどれ?", "イカスミ", "キャビア", "チーズ", "2"}
	};

printf関数で愚直に表示していた問題文や選択肢を多次元配列に格納しました。

こうすることで、配列の添え字を変更するだけで問題文を切り替えることが可能になります。

配列要素は左から順に「問題、選択1、選択2、選択3、正解の番号」となります。

▲目次へ戻る

for文で3回ループ

	for (i = 0; i < 3; i++) {
    // 割愛
	}

前回のプログラムでは問題の出題処理が3か所ありました。

これらをループ処理で一つにまとめました

ループカウンターiを0から1ずつ増やし、3になったらループ終了。

つまり、3回ループさせます。

▲目次へ戻る

何問目かを表示

		printf("[第%d問]\n", i + 1);

何問目なのかはループカウンターiを利用して表示します。

iは0からスタートするのでそのまま使うと「第0問、第1問、第2問」となってしまいます。

なので表示時に「i +1」をして「第1問、第2問、第3問」となるようにしています。

▲目次へ戻る

スポンサーリンク

問題文を表示

		printf("%s\n", q[i][0]);

問題文を表示します。

先ほど作成した多次元配列の中から問題を取り出します。

「q[i][0]」は、i行目の左から0番目という意味。

つまり、配列から取得されるものは以下のようになります。

ループ数q[i][0]の内容
1回目リンゴは英語で何と言う?
2回目大正->昭和->○○->令和\n○○に入る年号は?
3回目世界三大珍味はどれ?

▲目次へ戻る

選択肢を表示

		printf("1:%s  2:%s  3:%s\n", q[i][1], q[i][2], q[i][3]);

選択肢を表示します。

こちらも問題文と同様に多次元配列の中から取り出します。

配列から取得されるものは以下のようになります。

ループ数q[i][1]q[i][2]q[i][3]
1回目appleorangebanana
2回目慶応明治平成
3回目イカスミキャビアチーズ

▲目次へ戻る

解答の判定

		if (ans == atoi(q[i][4])) {
			printf("正解!\n\n");
		}
		else {
			printf("不正解...\n");
			printf("正解は %d:%s です。\n\n", atoi(q[i][4]), q[i][atoi(q[i][4])]);
		}

入力された解答のチェック処理です。

チェックのもととなる正しい答えは多次元配列の中から取り出します。

配列から取得されるものは以下のようになります。

ループ数q[i][4]の内容
1回目1
2回目3
3回目2

▲目次へ戻る

スポンサーリンク

次回

▲目次へ戻る

created by Rinker
¥2,750 (2024/04/26 05:26:40時点 Amazon調べ-詳細)
created by Rinker
¥1,680 (2024/04/25 10:31:42時点 Amazon調べ-詳細)
  • URLをコピーしました!