* 第6回 C言語の応用(マスターマインド) [#v9c30316]

** 課題 [#p7bb1ffc]

- [[プログラムの提出のしかた>../提出]]
- [[C言語のコンパイルと実行のしかた>../C言語環境]]

*** 中級レベル [#hb78c939]

v1) コンピュータが発生させた数を当てるゲームを作る。

+ (準備)rand関数を用いて、0以上100未満の整数を1つ発生させる。これを、「コンピュータの数」ということにする。※rand関数については、このページの最後を参照。
+ (入力)キーボードから整数を読み込む。これを、「プレイヤーの数」ということにする。
+ (判定)「コンピュータの数」が「プレイヤーの数」と等しければ正解なので、そう表示して終了する。等しくなければ、どちらが大きいか表示して、2.(入力)に戻って当たるまで繰り返す。

v2) コンピュータに、「@」「#」「*」「$」の4つの記号を組合せて、5文字の記号列を発生させ、それをプレイヤーが当てるゲームを作る。 
+ (準備)rand関数を用いて、0以上3以下の整数を5つ発生させ、配列に保存する。そして、~
  0 を @ 、 1 を # 、 2 を * 、 3 を $~
と呼ぶことにし、たとえば配列の中身が「21302」なら、「*#$@*」と呼ぶことにする。これを「コンピュータの記号列」ということにする。
+ (入力)キーボードから5文字の記号列を読み込み、数字に変換して配列に保存する。これを、「プレイヤーの記号列」ということにする。
+ (判定)「コンピュータの記号列」と「プレイヤーの記号列」を比較して、まったく同一ならば正解なので、そう表示して終了する。同一でなければ、当たったのは何箇所なのか表示して、2.(入力)に戻って当たるまで繰り返す。


v3) パズルゲーム「マスターマインド」を作りなさい。

- ここから引用 http://www.torito.co.jp/puzzles/314.html

>これは1973年にイギリスのインビクタ社から発売されて、世界中で3500万セット以上売れたといわれるパズルゲームで、次の写真(省略)はその標準的なセットである。

>''マスターマインド''

>2人ゲームで、1人が出題者、もう1人が解答者になる。出題者は、6色のコマのうち、好きなコマを4つ選び覆いの中に並べる。この場合、同色のコマがあってもかまわない。解答者はこのこまの色と配列を当てるのである。

>まず解答者は、その色と配列を予測して、コマを並べる。出題者は、この予測に対する判定をピンで示す。場所と色の双方が合っているものがあればその数だけ黒いピンを、色は合っていて場所が違うものがあればその数だけ白いピンを刺す。この判定をヒントにして、解答者は次の予測を行い、出題者はこれに対して判定を行う。これを繰り返して、何回で全部の色と場所が当たるかを競うのである。

----

【乱数の発生】 “乱数”というのは、サイコロを振るようにそのときそのときで発生するでたらめな数である。乱数がないとプログラムはいつも同じをするので、ゲームには乱数はいつも必要である。0以上N未満の乱数を発生させるには以下のようにする。

+ まず、ソースファイルの先頭に
 #inlucde <stdlib.h>  /* 標準ライブラリ関数randを使うのに必要 */
 #include <time.h>    /* 標準ライブラリ関数timeを使うのに必要 */
が必要である。
+ プログラムで乱数を用いるときには、実行し始めの1回だけ、現在時刻を「種」にして乱数を初期化する。これをしないと、プログラム実行のたびに同じ乱数が出てきてしまう。
 srand(time(NULL));
さらに、何回か使わない乱数を発生させて“かき混ぜる”とよい。
 for (i = 0; i < 100; i++)
     rand();
+ 実際に乱数を発生させるには、rand関数を用いる。rand関数は、0からint型の最大値までの値域で乱数を発生させるので、0以上N未満の数を得るには、
 n = rand() % N;
と、剰余演算子を用いるのが、よくあるやり方である。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS