たいしたプログラムじゃない割にやたら時間がかかった罠。
出題者が0〜MAXまでの整数をランダムで一つ決めて、それを当てるゲーム。出題者の嘘に惑わされずにいかに少ない回数で当てられるかを競います。挑戦者は以下のchallenger.hだけを書き換えます。
だれかやってくれる人募集。日記にソース書いてトラックバック打つか、メールかメッセでヘッダファイルだけもらえればコメントします。*1
ちなみにデフォルトの設定でやった場合、完全に相手の返事を無視して答えると平均は約1000回。素直に聞くようにした場合は約750回、もうちょい工夫すれば500回くらいまでは減ります。そこからどれだけ減らせるかな?
ちなみに俺は40回切るくらいまでいけました。授業でやったときはこれと同じやり方のもうちょっと凝ったやつで50切れなかったんだが…パラメータが違うせいなのか出題者プログラムがマズイのか…?後者なら見つけた人は指摘してくれると嬉しいです。
ソースはこちら。
/* define文は書き換えちゃダメ */ #define MAX 1000 /* 答えの取りうる範囲 */ #define YOUR_ANSWER_IS_LARGE 1 #define YOUR_ANSWER_IS_SMALL 2 #define BINGO 3 typedef struct { int answer; /* これは書き換えちゃダメ */ /* 他に変数がほしければここで定義 */ }variables; /****************** * 挑戦者の初期化 ******************/ void init_challenger(variables *val){ /* 最初になんと答えるかを決める */ val->answer = 0; /* その他初期化が必要なものがあればここに記述 */ } /****************** * 結果を聞いて答えを決める ******************/ void think_answer(variables *val,int result){ /* * 相手の答えによってresultの値が変わる * 「あなたの答えは正解より大きい」→YOUR_ANSWER_IS_LARGE * 「あなたの答えは正解より小さい」→YOUR_ANSWER_IS_SMALL * それを元に次に答える数字を決めてval->answerに入れる * ただし出題者は一定の確率(50%以下)で嘘をつく */ /* sample */ /* ひたすら0からMAXまでの答えを返す。MAXを超えたら0に戻る */ val->answer++; if(val->answer>1000){ val->answer = 0; } }