• ベストアンサー

数当てゲーム

たのしいCという本でプログラミングの勉強をしています。 演習問題の解答がないので質問します。 2つの乱数を決定し、x以上y以下の整数を当てるプログラムです。 入力した数に対してヒントがあり、正解よりも小さければ"小さいです"と表示されます。 入力回数の制限を設け、乱数によって適切な入力回数にする計算方法の仕方がわかりません。 0以上1000以下の乱数の場合10回が適切みたいです。 よって0以上2000以下の場合は11回だということだと思います。 下のプログラムは回数の計算はしませんが、x以上y以下の整数を当てるプログラムになっていると思います。 適当な変数の名前や見にくいプログラムですいません。 /* 課題1-3 */ #include <time.h> #include <stdio.h> #include <stdlib.h> #define MAX_STAGE 11 /* 最大入力回数 */ int main(void) { int i; int no1; /* 範囲1 */ int no2; /* 範囲2 */ int max; /* 大きい乱数 */ int min; /* 小さい乱数 */ int y; /* 当てさせる数 */ int k; /* maxとminの差 */ int stage; /* 入力回数 */ int x; /* 読み込んだ値 */ int xbuf[MAX_STAGE]; srand(time(NULL)); no1 = rand(); no2 = rand(); if(no1 > no2){ max = no1; min = no2; } else{ max = no2; min = no1; } k = max - min; y = min + rand() % (k+1); printf("%d以上%d以下の整数を当ててください。\n", min, max); stage = 0; do{ printf("残り%d回。いくつでしょう:\n", MAX_STAGE - stage); scanf("%d", &x); xbuf[stage++] = x; if(y > x) printf("小さいです。\n"); else if(y < x) printf("大きいです。\n"); }while(y != x && stage < MAX_STAGE); if(y != x) printf("残念でした。正解は%dです。", y); else printf("正解です。%d回目で正解しました。", stage); puts("\n---入力履歴---"); for(i=0; i<stage; i++) printf(" %2d : %4d %+4d\n", i+1, xbuf[i], xbuf[i] - y); return (0); } 自分が考えた入力回数の設定は、kの値をif文で場合分けして入力回数を決定するという方法が思いつきました。他に何か良いアイデアとかってあるのでしょうか。 また、ごちゃごちゃと文を書いているので改善点などもあればよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.1

>入力回数の制限を設け、乱数によって適切な入力回数にする計算方法の仕方がわかりません。 >0以上1000以下の乱数の場合10回が適切みたいです。 >よって0以上2000以下の場合は11回だということだと思います。 つまり 2^n >= m2-m1 (n:入力回数 m1,m2:乱数範囲) なのですから、 n=切り上げ(2底のlog(m2-m1)) とすればよいわけで、Cで書けば n=ceil(log2(m2-m1)); となります。 しかし、この回数だと2分検索法で必ず解けてしまいますよ。(ゲームとしては面白くないです)

tanosiiC
質問者

お礼

ありがとうございます。 logとかもつかえるんですね。 確かに必ず解けてしまいますね。 nの値を1~2減らせばゲームとしては面白そうです。

tanosiiC
質問者

補足

logとceilつかったことないのですが include <math.h>の他に宣言することはありますか。 やさしいCから勉強したのですが、そういった問題がなかったのでエラーが出てしまいました。 double log(double(x));やdouble ceil(double(x));があるみたいですが宣言して n=ceil(log2(k));とし、MAX_STAGEをnに変更したのですが駄目でした。

すると、全ての回答が全文表示されます。

専門家に質問してみよう