Hit & Blow

1.ルール

  1. 出題者は、0から9までの互いに異なる数字を使った 4桁の数を正解として用意し、解答者から隠しておく。
  2. 解答者は、解を予想し、質問をする。
  3. 出題者は、質問と正解の数を比較して、
    Hit数  
    同じ数字が同じ桁に出現する回数
    Blow数  
    同じ数字が違う桁に出現する回数
    をヒントとして解答者に与える。
  4. 解答者はなるべく少ない質問で正解を当てる。

2.ゲームの進行例

正解:4832
回数質問HitBlow
1012302
2234503
3346702
4423822
5483240

3.遊びかたの例

  1. 2人で互いに問題を作る。
  2. 先行、後攻を決めて、交互に質問をする。
  3. 質問数が少ない方、つまり先に正解を見つけた方が 勝ちとなる。

4.出題プログラム

Hit&Blowの出題プログラムを作るメリットとして、 以下の項目が挙げられる。
1人でも遊べる。
Hit数とBlow数の計算ミスがない。
貧弱なユーザインターフェースでも十分遊べる。

4.1.出題プログラムの機能

出題プログラムの機能は以下のようなものである。
  1. 問題を作成する。
  2. 質問に答える。

4.1.1.乱数の生成

問題の作成にあたって乱数の生成が必要である。 cで乱数を作るためには、以下のようにすればよい。
/* 乱数の生成プログラム       */
/*    Dec 15,1997  by K.OKANO */

#include < stdlib.h >   /* 標準ライブラリ Standard Library */
#include < time.h >     /* 時刻に関するライブラリ          */

void main(void){
    double x;
    srand( (unsigned int)time(NULL) ); /* 現在時刻を乱数の種にする */
    x=(double) rand()/RAND_MAX;        /*rand():0からRAND_MAXまでの乱数の生成*/
    printf("RAND_MAX=%d\n",RAND_MAX);
    printf("random(0-1.0)=%lf\n",x);        /* 0から1までの乱数  */
    printf("random(0-10.0)=%lf\n",x*10.0);  /* 0から10までの乱数  */
}

5.課題提出

5.1.提出方法
電子メールで、okano@ece.numazu-ct.ac.jpに送る。
5.2.提出期限
1998年1月16日(金)まで。
5.2.1.UNIXのコマンドでメールを送る方法
% mail -s kadai okano@ece.numazu-ct.ac.jp < hb.c
        
  -s の後に題名 、その後に宛先、<を付けた後にファイル名。

6.追加機能:スコアをのこす。

出題プログラムに、スコアを付ける機能を追加する。 スコアを残す為には、ファイルの入出力をしなければならない。

6.1.ファイル入出力

例:score.datというファイルに、Helloという文字列を書き込むプログラム。
#include <stdio.h>

void main(void){
  double x;

  FILE *fp;	    
  fp = fopen("score.dat","w");

  fprintf(fp,"Hello\n");

  x=3.14;
  fprintf(fp,"x=%lf\n",x);

}