はじめまして

プレイ時間10秒の四択クイズゲームもどき 2

tenmusu
記事: 0
登録日時: 8年前

プレイ時間10秒の四択クイズゲームもどき 2

投稿記事 by tenmusu » 8年前

以前投稿した四択クイズゲームもどき
http://dixq.net/forum/blog.php?u=2356&b=6433

ありがたい事にコメントで色々とご指摘をいただいた。

gets関数禁止、要素数不足による不具合解消、関数の自作。
以上を心がけて再び四択クイズを作り直してみた。

CODE:

#include 
int question(), answer();
int in, score, no;
char str[256];

int main()
{
	while (no 4) puts("ERROR!!\a\a\a\n");
		} while (in  4);	//有効な入力がされるまで繰り返す

		answer();
		no++;
	}

	printf("あなたは3問中%d問正解しました\n\a", score);

	if (score == 3)						//全問正解であれば
		puts("おめでとうございます!");	//メッセージを追加する

	return 0;
}


int question()	//問題と選択肢
{
	printf("第%d問\n", no + 1);
	if (no == 0) {
		puts("元素記号の覚え方、すいへーりーべー…?\a\n"
			"1:そーですね\t2:おれのふね\n3:わしのふね\t4:ぼくのふね");
	}
	else if (no == 1) {
		puts("次のうち、最も新しい政令指定都市は…?\a\n"
			"1:新潟市\t2:岡山市\n3:熊本市\t4:相模原市");
	}
	else {
		puts("サンタクロースは何に乗っている…?\a\n"
			"1:トナカイ\t2:馬\n3:そり\t\t4:牛");
	}
}


int answer()		//答え
{
	if (no == 0 && in != 4)
		puts("残念!正解は、4の「ぼくのふね」ですよ\n");
	else if (no == 1 && in != 3)
		puts("残念!正解は、3の「熊本市」ですよ\n");
	else if (no == 2 && in != 3)
		puts("残念!サンタクロースが乗っているのは、3の「そり」ですよ\n");
	else {
		puts("正解です!\n");
		score++;
	}
}
コードは以前より少し短くなった
が、果たして関数の使い方ってこれで合っているのか…

一応動くは動いてるけども…
最後に編集したユーザー tenmusu on 2017年2月06日(月) 03:30 [ 編集 1 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: プレイ時間10秒の四択クイズゲームもどき 2

投稿記事 by みけCAT » 8年前

なるべく共通の処理は1回しか書かないのがコツです。
実装してみました。
意外と各問題で仕様が統一されていなくて(特に3問目)頭を使った…。

CODE:

#include 

/* 選択肢の数 */
#define CHOICE_NUM 4

/* 問題を表す構造体 */
struct quiz_t {
	const char *question; /* 問題 */
	const char *choice[CHOICE_NUM]; /* 選択肢 */
	int choice_tab[4]; /* 各選択肢の後に出力するタブの数 */
	const char *answer_comment; /* 正解発表の時に表示する文字列 */
	int answer; /* 答え */
};

/* 問題を出力する */
void print_question(const struct quiz_t* q, int no) {
	int i, j;
	printf("第%d問\n", no);
	printf("%s\a\n", q->question);
	for (i = 0; i choice[i]);
		for (j = 0; j choice_tab[i]; j++) putchar('\n');
		putchar(i % 2 == 0 ? '\t' : '\n');
	}
}

/* 答え合わせをして、得点の増加量を返す */
int judge(const struct quiz_t* q, int user_answer) {
	if (q->answer == user_answer) {
		puts("正解です!\n");
		return 1;
	} else {
		printf("残念!%sは、%dの「%s」ですよ\n\n", q->answer_comment, q->answer, q->choice[q->answer - 1]);
		return 0;
	}
}

int main(void) {
	static struct quiz_t quiz[3] = {
		{
			"元素記号の覚え方、すいへーりーべー…?",
			{"そーですね", "おれのふね", "わしのふね", "ぼくのふね"},
			{0, 0, 0, 0},
			"正解",
			4
		}, {
			"次のうち、最も新しい政令指定都市は…?",
			{"新潟市", "岡山市", "熊本市", "相模原市"},
			{0, 0, 0, 0},
			"正解",
			3
		}, {
			"サンタクロースは何に乗っている…?",
			{"トナカイ", "馬", "そり", "牛"},
			{0, 0, 1, 0},
			"サンタクロースが乗っているの",
			3
		}
	};

	int quiz_num = sizeof(quiz) / sizeof(*quiz);
	int no;
	int score = 0;
	/* 各クイズを出題する */
	for (no = 0; no < quiz_num; no++) {
		int user_answer = 0;
		for (;;) {
			char input[256];
			/* 問題を出力する */
			print_question(&quiz[no], no + 1);
			/* 解答を読み込む */
			if (fgets(input, sizeof(input), stdin) == NULL) {
				puts("入力エラーです。");
				return 1;
			}
			if (sscanf(input, "%d", &user_answer) == 1 && 1 <= user_answer && user_answer <= CHOICE_NUM) {
				/* 有効な解答なので、次の処理に進む */
				break;
			} else {
				/* 無効な解答なので、繰り返す */
				puts("ERROR!!\a\a\a\n");
			}
		}
		/* 答え合わせをする */
		score += judge(&quiz[no], user_answer);
	}

	/* 結果を出力する */
	printf("あなたは%d問中%d問正解しました\n\a", quiz_num, score);
	if (score == quiz_num) { /* 全問正解であれば */
		puts("おめでとうございます!"); /* メッセージを追加する */
	}

	return 0;
}

アバター
usao
記事: 1889
登録日時: 12年前

Re: プレイ時間10秒の四択クイズゲームもどき 2

投稿記事 by usao » 8年前

(サンプルが少ないので法則性がどの程度あるのか判断付かないけど)
不正解時のコメントは最初から完全な文として持ってしまってもよいかも.

tenmusu
記事: 0
登録日時: 8年前

Re: プレイ時間10秒の四択クイズゲームもどき 2

投稿記事 by tenmusu » 8年前

みけCATさんへ

返信が遅くなってしまい大変申し訳ありません

まさかコードを一から書き直していただけるとは…
処理に細かくコメントまでついてあるのでとても勉強がしやすいです。
本当にありがとうございます。

載せていただいたコードにはわからない部分がたくさんありつつも
自分の書いたコードと圧倒的に違うと感じた部分は
みけCATさんのソースコードだと、簡単に問題を追加できるということ。

実際、static struct quiz_t quiz[]の要素数と
問題をそのまま増やすだけで済みました。

そして、3番の答えだけ処理が違うのも自分で作っていながら
全く意識していませんでした、気をつけます。

それと、載せていただいたコードを実行し少し疑問に思った部分がありまして
3番の問題の選択肢の表示についてなのですが、私の環境だと
4つ目の選択肢の「牛」だけがずれて表示されてしまうのですが
実行環境によっては表示がずれたりする事も起こり得るのでしょうか。


一応スクリーンショットを撮ってみました
http://www.dotup.org/uploda/www.dotup.o ... 159195.png
Pass:4taku

OSはWindows 7 Ultimate
Visual Studio Community 2017 RC を使用しています

お時間がある時で結構ですのでお返事いただければ幸いです
__________________________________________________________

usaoさんへ

返信が遅くなってしまい大変申し訳ありません
コメントありがとうございます

不正解時のコメント、3番だけ処理が違っているために効率悪いことをしていたようです。
自分で作っていて全く意識していませんでした…

それでも前よりいくらかコードがマシ(になった気がする…)のは
usaoさんから以前の日記へいただいたコメントのおかげです
__________________________________________________________

お二方ともコメント本当にありがとうございました。
最後に編集したユーザー tenmusu on 2017年2月17日(金) 17:56 [ 編集 1 回目 ]