課題6 課題8

課題7

今までの復習をかねて

今までの復習をかねて、(とても単純な)数字当てのゲームプログラムを作ってみることにしよう。

第1段階

基本のプログラムを次に示す。 どのような処理をしているのか、理解できるか読んでみよ。

/* sujiate.c */
#include <stdio.h>

int main()
{
        int ch;
        int answer;

        answer = 7;  /* 当てる数字 */

        printf("1桁の数字当てをしましょう。\n");
        printf ("1桁の数字を入力してください => ");

        ch = fgetc(stdin);  /* 標準入力から1文字読み込む */

        /* 答えの照合 */
        if (ch < '0' || ch > '9') {
                printf("数字をいれてください\n");
        } else {
                ch -= '0';   /* ch = ch - '0'; あるいは
                              * ch = ch - 48;  と同等
                              * 数字から数値へ変換
                              */
                if (ch == answer) {
                        printf("当りです!\n");
                } else {
                        printf("ハズレです。答えは %d でした。\n", answer);
                }
        }
}
  

数字から、数値へ変換している部分は、課題5で示した 文字コードの表を参照すれば理解できるかと思う。

第2段階

第1段階のプログラムでは、答が固定されており楽しくない。 答を自動的に変えるために、乱数を利用してみよう。

乱数とは、順序や規則がない数字の列である。 厳密な乱数を生成するのは難しいので、C 言語には疑似乱数と呼ばれる ある規則にしたがってはいるが通常の範囲では乱数と思っても差し支えがない 数列を生成する関数 rand()が用意されている。

rand()関数は次のように使用されることが多い。

/* rand.c */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main()
{

        int i;

        srand(time(NULL));  /* rand() を呼び出す前に1度だけ行う */
        for (i = 0; i < 10; ++i) {
                printf("rand() = %d\n", rand());  /* 実際の乱数の利用 */
        }
}
  

乱数を利用する前に、一度だけ srand(time(NULL)) を実行し、 乱数が必要になる度に rand()を実行する。

たとえば、数字当ての答を乱数にするためには次のように修正を行えば良い。

/* sujiate2.c */
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
        int ch;
        int answer;

        srand(time(NULL));   /* 乱数発生のための種の初期化 */
        answer = rand() % 10;  /* 当てる数字 */

        printf("1桁の数字当てをしましょう。\n");
        printf ("1桁の数字を入力してください => ");

        ch = fgetc(stdin);  /* 標準入力から1文字読み込む */

        /* 答えの照合 */
        if (ch < '0' || ch > '9') {
                printf("数字をいれてください\n");
        } else {
                ch -= '0';   /* ch = ch - '0'; あるいは
                              * ch = ch - 48;  と同等
                              * 数字から数値へ変換
                              */
                if (ch == answer) {
                        printf("当りです!\n");
                } else {
                        printf("ハズレです。答えは %d でした。\n", answer);
                }
        }
}
  

0 から 9 の間の乱数を得るためには、rand()を10で割ったあまりを用いれば 良いことに注意する。

第3段階

一度しか試すことができないゲームは、つまらないので、 正解するまで何度でも試すことができるように、以下の指示にしたがって 改良してみよ。

  1. for もしくは while を用いて、繰り返し処理を 実装してみる。
  2. ヒントが、はずれだけでは難しいので、「大きい」もしくは「小さい」とヒントを 与えてみるように修正する。
  3. 当てる数字の桁数を2桁にするにはどうすれば良いかを考えて、修正してみる

課題6 日程表 課題8

tacha@tack.fukui-med.ac.jp
$Id: kadai07.html,v 1.1 2008/06/06 05:05:39 tacha Exp tacha $