next up previous contents
Next: 12. 関数 II Up: 11. 関数 I Previous: 11.7 強制終了

11.8 課題11

cd c を実行した後で( ~/c に移動した後で)、以下の課題を やってみよ。

課題 11.1
乱数発生関数を使う I

前ページの強制終了の例を打ち込んで動かしてみよ。

課題 11.2
乱数発生関数を使う II

先の課題では、seed には定数を代入したが、キーボードから入力する ように改造せよ。

課題 11.3
乱数発生関数を使う III

0 から 9 までの間の乱数を発生させるプログラムを作成せよ。但し、 seed にはキーボードから適当な数値を入力するものとする。

ヒント モジュロ演算子を用いる。

課題 11.4
乱数発生関数を使う IV

12.3 で、-1 から 1 までの間の乱数を発生 させるプログラムを作成せよ。

課題 12.5
簡単なゲームを作る。I

敵の機体はあなたの所から 10 離れたところから、一つづつ進んで来て、あなたの いる所、すなわち 0 の所まで来たらあなたの負けです。あなたの武器はレーザーガン で、相手が一つ進むごとに一回だけうてます。敵は 6 つのコース(方角)のどれかに いますから、適当な方角を選んでレーザーを 撃ってください。また、敵の位置をレーダーで索敵する 事も出来ますが、レーダーとレーザーは同時には使えません。 敵は、一つ進むごとにコースを変える事が出来ますが、必ず隣り合うコースに しか移動しません。従って、3 のコースに居たら、次は、2、3又は4のコース に必ずいます(コースを変えない事もあります)。 端のコース(0 または 5 のコース)にいる場合は、0 に居たら次は、0 又は 1 に います。 敵の破壊に成功したら、そのメッセージを 出し、外れたら敵との距離を表示して、レーザーの方角の入力を待つようにし、 距離が 0 になったらプレイヤーの負けを表示する事。 ゲームは、5 回戦まであり、敵のスピードは段々と早くなって行きます。

乱数の種(seed)にはキーボードから適当な数字を入力してもらうように する。

ヒント1
最初に、敵が 6つのコースのどこから現れるかは、乱数で生成する。

ヒント2
敵のコースの移動は課題11.4 を参考にせよ。

ヒント3
fflush() と入力待ちのループを使った方が良いであろう。

参考

#include <stdio.h>
#include <stdlib.h>
main()
{
    int teki_kyori, teki_course, lazer_course, round, sokudo=0;
    char lazer='L';
    /* その外に必要と思われる変数の宣言 */

    /* キーボードから適当な数を入力してもらい */
    /* 乱数の種を決める */

    for(round=1; round<6; round++){
        printf("第 %d ラウンド\n\n", round);
        /* 敵の最初の位置を乱数で決める */
        sokudo ++;      /* 敵の接近速度は段々早くなる */
        for(teki_kyori=10; ; teki_kyori-=sokudo){
           /* もし敵との距離が 0 以下だったら負けを宣告して exit(0) する */
           /* 敵機の移動方向を乱数で決める。*/
           if ( teki_course == 0 ){
               /* 左端にいるとき */
           else if ( teki_course == 5){
               /* 右端にいるとき */
           }else{
               /* 1 から 4 にいるとき */
           }
           /* 敵機との距離を表示する */
           /* レーザーを撃つか、レーダーを使うか ? 入力を待つ */
           /* L ならばレーダー、F はレーザー */
           if ( lazer == 'L' ){
              /* レーダーで、敵のコースの表示 */
           }else{
              /* レーザー */
              /* 撃つ方向の入力を待つ  0 から 5 まで */
              if (teki_course == lazer_course){   /* 命中した場合 */
                 /* プレイヤーの勝ちを表示する */
                 break;
              }
              /* 外れを表示する */
           }
        }
    }
}

作成したプログラムをメイルで、creport まで送ること。 但し、題は kadai11 とすること。

(時間があれば、どうしたらこのゲームをもっと面白く 出来るか考えて見なさい。)

前回の復習
関数
プログラムで利用できる部品

 全く中身のことを知らなくても、関数に与える情報(引数)と返り値さえ知って いれば利用できる。

呼び出し
最も簡単な関数の呼び出し
    関数名( 引数 [,引数[...]]);

引数がない関数があっても良いが、そのような場合でも呼び出すときは、必ず 丸括弧をつけなければならない。

引数と返り値
関数の引数と返り値の型

関数の引数と返り値には、共に型がある。従って、常に使用しようとしている関数 の型には注意を払う必要がある。

標準関数
標準関数と標準ライブラリ

C 言語で標準的に既に用意されている関数を標準関数といい、標準関数の集まりを 標準ライブラリという。printf, scanf, fflush, srand, rand, exec なども標準関数である。 (但し、if, for などは関数ではないので注意すること。)

モジュロ演算子
余りを求める演算子

整数同士の割り算の余りを求めるモジュロ演算子(%) がある。

例
        int amari;
        amari = 7 % 2;

この結果、整数変数 amari には、7/2 の余り1が代入される。



Noriyo Kanayama