はじめまして

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

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

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

投稿記事 by tenmusu » 8年前

CODE:

#include 

int main(void)
{

	char buf[1];
	int i;
	int score = 0; //正解数を記憶しておく変数

	printf("四択クイズです\n\n");

	do {
		
		printf("元素記号の覚え方、すいへーりーべー…?\a\n");
		printf("1:そーですね\t2:おれのふね\n3:わしのふね\t4:ぼくのふね\n");

		gets(buf);
		sscanf(buf, "%d\n", &i);

		if (i == 4) {
			printf("正解です!\n\n");
			score++;	//正解するとスコアを1増やす
		}
		else if (i == 1 || i == 2 || i == 3) {
			printf("残念!正解は「ぼくのふね」ですよ\n");
		}

	} while (i = 5);		//入力値が不正であれば再入力させる

	do {
		i = 0;	//入力値の初期化
		printf("次のうち、最も新しい政令指定都市は…?\a\n");
		printf("1:新潟市\t2:岡山市\n3:熊本市\t4:相模原市\n");

		gets(buf);
		sscanf(buf, "%d\n", &i);

		if (i == 3) {
			printf("正解です!\n\n");
			score++;
		}
		else if (i == 1 || i == 2 || i == 4) {
			printf("残念!正解は「熊本市」ですよ\n\n");
		}

	} while (i = 5);


	do {
		i = 0;	
		printf("サンタクロースは何に乗っている…?\a\n");
		printf("1:トナカイ\t2:馬\n3:そり\t\t4:牛\n");

		gets(buf);
		sscanf(buf, "%d\n", &i);

		if (i == 3) {
			printf("正解です!\n\n");
			score++;
		}
		else if (i == 1 || i == 2 || i == 4) {
			printf("残念!サンタクロースが乗っているのは「そり」ですよ\n\n");
		}

	} while (i = 5);


	printf("\nあなたは3問中%d問正解しました\n\a",score);
	if (score == 3)							//全問正解ならば
		printf("おめでとうございます!");	//メッセージを追加する

	return 0;
}

勉強の成果確認も兼ねて、何も見ずに作ってみたクイズゲームもどき。case文を使ったほうが良かったのかな…

不正な数字が入力された場合に、ただループするだけでなく「再入力してください」等のメッセージを入れたかったけど
今の自分では無理だった。

次に何か投稿する時はそういう処理も入れたプログラムを載せたい。

一応は初めて作ったゲーム…もどきになるのだから、思い出としてここに残しておく。
最後に編集したユーザー tenmusu on 2017年1月30日(月) 00:23 [ 編集 2 回目 ]

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

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

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

危険なのでC99で非推奨、C11で廃止になったgets関数を使っている上、
そもそもbufの要素が1個しかないので1文字でも入力すれば終端文字を含めて範囲外アクセスを起こし、未定義動作になる。
ひどいですね。

【追記】
ラッキーなことに、実際に不都合が確認できました。
最初のクイズに正解しているはずなのに、「あなたは3問中0問正解しました」と出力されました。
範囲外アクセスにより、スコアの情報が破壊されているためでしょう。
http://melpon.org/wandbox/permlink/QTGh2doktVtwqYrm
最後に編集したユーザー みけCAT on 2017年1月30日(月) 01:06 [ 編集 1 回目 ]
理由: 未定義動作による不都合の例を追加

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

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

投稿記事 by usao » 8年前

同じようなことを3回書いているので,

・問題文
・4つの選択肢
・4つのうちのどれが正解なのか

くらいの情報を入力(引数)とした関数にまとめましょう.

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

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

投稿記事 by tenmusu » 8年前

みけCATさんへ
はじめまして、コメントありがとうございます。

gets関数はすでに廃止されているものだったんですね。
要素数についてのご指摘と不具合報告についても
本当にありがとうございます。


usaoさんへ
コメントありがとうございます。

確かに1問ずつ同じ処理していて無駄が多すぎますね。
関数と引数については、理解できていないので勉強します。

お二方とも、本当にありがとうございました。