数当てゲーム2

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
junjunjun

数当てゲーム2

#1

投稿記事 by junjunjun » 12年前

書籍「明解 C言語 中級編」をしている者です。
作ったコードを見て頂きたいので投稿しました。
課題は「当てさせる数を3以上999以下の3の倍数とした数当てゲームを作成せよ。3の倍数でない値が入力された場合に、ただちにゲームを終了するものと、比較結果を表示せず再入力させる(入回数もカウントしない)ものの二つを作ること。プレイヤーが入力できる最大の回数が、どのくらいであるかも考察すること。」です。
3の倍数でない値が入力された場合に、ただちにゲームを終了するものが

コード:


#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
	int answer;  //乱数を入れる変数
	int input;    //入力値を入れる変数
	int tryCount=0;  //カウント変数
	srand(time(NULL));
	answer=(1+rand()%332)*3;
	while(1){
		printf("3~999の整数を入力してください。");
		scanf("%d",&input);
		if(input%3!=0){
			printf("3の倍数ではないので終了します。\n");
			break;
		}
		if(input==answer){
			printf("正解です!!当たり!\n");
			break;
		}
		else if(input>answer) printf("もっと小さいです。\n");
		else if(input<answer) printf("もっと大きいです。\n");
        tryCount++;
		if(tryCount>=20) {
			printf("残念!失敗です。正解は%dでした。\n",answer);
			break;
		}

	}
	return 0;
}
です。
比較結果を表示せず再入力させる(入回数もカウントしない)ものが

コード:

int main(void)
{
	int answer;  //乱数を入れる変数
	int input;    //入力値を入れる変数
	srand(time(NULL));
	answer=(1+rand()%332)*3;
	while(1){
		printf("3~999の整数を入力してください。");
		scanf("%d",&input);
		if(input==answer){
			printf("正解です!!当たり!\n");
			break;
		}
	}
	return 0;
}
です。
自分でコンパイルした分には問題ないのですが、どうでしょうか?アドバイスお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 数当てゲーム2

#2

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

コード:

answer=(1+rand()%332)*3;
だと、最大で(1+331)*3、すなわち996までしか出ません。
よって、ここが間違っています。

また、問題文の解釈も間違っているように感じます。
あなたは
「3の倍数でない値が入力された場合に、ただちにゲームを終了するもの」と、
「(全ての入力に関して)比較結果を表示せず再入力させる(入回数もカウントしない)もの」の二つを作る、と解釈したようですが、私には
「3の倍数でない値が入力された場合に、ただちにゲームを終了するもの」と、
「3の倍数でない値が入力された場合には、比較結果を表示せず再入力させる(入回数もカウントしない)もの」の二つを作る、と解釈できます。

また、「プレイヤーが入力できる最大の回数が、どのくらいであるかも考察すること。」はやりましたか?

前回の問題「プレーヤーが入力できる最大の回数が、どのくらいであれば適当であるのかも考察すること。」についてはどうですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

junjunjun

Re: 数当てゲーム2

#3

投稿記事 by junjunjun » 12年前

改良したコードがこれです。
3の倍数でない値が入力された場合に、ただちにゲームを終了するものが

コード:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
	int answer;  //乱数を入れる変数
	int input;    //入力値を入れる変数
	int tryCount=0;  //カウント変数
	srand(time(NULL));
	answer=(1+rand()%333)*3;
	while(1){
		printf("3~999の整数を入力してください。");
		scanf("%d",&input);
		if(input%3!=0){
			printf("3の倍数ではないので終了します。\n");
			break;
		}
		if(input==answer){
			printf("正解です!!当たり!\n");
			break;
		}
		else if(input>answer) printf("もっと小さいです。\n");
		else if(input<answer) printf("もっと大きいです。\n");
        tryCount++;
		if(tryCount>=20) {
			printf("残念!失敗です。正解は%dでした。\n",answer);
			break;
		}

	}
	return 0;
}
です。
3の倍数でない値が入力された場合には、比較結果を表示せず再入力させる(入回数もカウントしない)ものが

コード:


#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
	int answer;  //乱数を入れる変数
	int input;    //入力値を入れる変数
	int tryCount=0;  //カウント変数
	srand(time(NULL));
	answer=(1+rand()%333)*3;
	while(1){
		printf("3~999の整数を入力してください。");
		scanf("%d",&input);
		if(input%3!=0){
			printf("3の倍数を入力してください。\n");
			continue;
		}
		if(input==answer){
			printf("正解です!!当たり!\n");
			break;
		}
		else if(input>answer) printf("もっと小さいです。\n");
		else if(input<answer) printf("もっと大きいです。\n");
        tryCount++;
		if(tryCount>=20) {
			printf("残念!失敗です。正解は%dでした。\n",answer);
			break;
		}

	}
	return 0;
}
です。
自分でコンパイルした分には問題ないのですが、どうでしょうか?アドバイス宜しくお願いします。

また、「プレイヤーが入力できる最大の回数が、どのくらいであるかも考察すること。」は具体的にどうすればいいかわかりません。アドバイス等宜しくお願いします。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 数当てゲーム2

#4

投稿記事 by usao » 12年前

>プレイヤーが入力できる最大の回数が、どのくらいであるかも考察すること
って何がいいたいのかいまいち不明瞭ですよね.
「最大回数をどのくらいに設定しておけばゲームとして良さそうか,を考えてみろ」ということなのかなぁ?
(回数制限が少なすぎると まず当てられない→クソゲー
 多すぎると,てきとーに数を調べまくっていれば正解できる→クソゲー
 じゃあ多すぎず少なすぎずという具合はどのあたり? という.)

仮に↑のような話だとして…
junjunjunさんなら,このゲーム,何回の入力機会が与えられていたら「絶対に正解できる」でしょうか?
言い換えれば,N回の入力機会がある場合の必勝法 でしょうか.
回数制限をどのくらいにするのがよいか?というのは主観な気もしますが,例えば私なら
必勝法がある限り,N回以上の入力回数が許されていたら絶対にプレイヤが正解できてしまうのでゲームとしてはつまらないように思う
→N-1回とかN-2回あたりに最大回数を設定しとけば,「絞り込めるけど最後はいくつかの選択肢から選ぶしかなくなる」ので
勝率が100%ではなくなる からその辺がいいとこかなー,みたいなことを考えると思います.
(運ゲーが面白いのか? というのは別の話として.)
オフトピック
ところで,どうでもいい話ですが,脳内シミュレートした結果,
プログラム「3~999の整数を入力してください。」
ぼく「OK,じゃあ…4」
プログラム「3の倍数ではないので終了します。」
ぼく「えー!?」
という結果となりました.
(「3以上999以下の範囲で,3の倍数を入力せよ」という説明じゃないと理不尽だよ)

アバター
asd
記事: 319
登録日時: 14年前

Re: 数当てゲーム2

#5

投稿記事 by asd » 12年前

usao さんが書きました:>プレイヤーが入力できる最大の回数が、どのくらいであるかも考察すること
って何がいいたいのかいまいち不明瞭ですよね.
「最大回数をどのくらいに設定しておけばゲームとして良さそうか,を考えてみろ」ということなのかなぁ?
(回数制限が少なすぎると まず当てられない→クソゲー
 多すぎると,てきとーに数を調べまくっていれば正解できる→クソゲー
 じゃあ多すぎず少なすぎずという具合はどのあたり? という.)
最終的にはusaoさんの推測通りのことを求めているのかなぁと思います。
ただしそこに至るまでの条件付けも考察に含まれているのかなと。
(何も考えないと入力できる数3~999を全部対象にしちゃうけど、3の倍数以外は入力するとゲームENDなので入力される対象から外して考える、みたいな)

で、上記で対象の数(母数)を確定させたあとに最悪で何回入力すれば必ず正解できるのかを考えさせると。
#考察のヒントというか答えになりそうなのであえてアルゴリズム名などは省略してます

上記で求めた必ず正解できる回数以上にすると100%勝てるゲームになってしまうので、ゲームとしては最短を競うゲームになるのかなと。
上記で求めた必ず正解できる回数から減らしていくと減らして行った分だけ勝率が下がって行きます。
考察内容によりN回減らした場合の勝率も出せるので、そこまで含めて考察終わりなのかと思ってます。

入力される範囲を絞れるかどうかも考察に含めたいのであえて理不尽な書き方にしているのではないかと思ってます。
面白そうな考察になりそうですね。

(追記)
質問者さんの追加質問を見落としていたので、考察についてヒントっぽいものを。

まず入力される数値の最大数は3~999の間に含まれる3の倍数のものの個数(3の倍数以外を入力すると終了してしまうOr入力やり直しになり回数にカウントされないため)とします。
次に正解を絞り込むプロセスについて考える事になりますが、仮に外れた場合にプレーヤーに渡される情報は何でしょうか?
正解が入力した数より大きいか小さいかですよね?
するとその数以上かその数以下の数字は必然的にはずれとなり、入力する数から除外されます。

その時にできるだけ多くの数字を外れ判定するためには、どの数字を選ぶのがいいでしょうか?
(例.3と入力したときに「もっと大きい数です」と言われると外れ数値は3のみ、9と入力していたなら3,6,9の3つ・・といった具合)

そして上の法則に従って数字を選んで行くと、最大で何回まで入力することができるのか(正解以外が残らなくなる場合の最大試行数)がわかってきます。

というヒントで分かりますでしょうか。
Advanced Supporting Developer
無理やりこじつけ(ぉ

閉鎖

“C言語何でも質問掲示板” へ戻る