★ゲームを作ろう1(乱数1)★


さて、基本制御文の1つ「分岐」について色々と説明してきましたが、書いてあることを打ち込んで動作確認をするだけではプログラムの実力は身につきません。

やはり、自分の作りたいものをどうやったら作れるのか、を考えながら試行錯誤していくことが実力のアップにつながります。

そこで、今まで勉強してきた順次構造と分岐構造を使った、非常に簡単なゲームを作ってみましょう。

ただ、ゲームを作るためには、もうちょっとやっておいた方が良い事がありますので、まずはそれをやってみましょう。

ゲームの面白さの要因の一つとして、「偶然性」というものがあります。

「トランプを使ったゲーム」であれば、シャッフルしたカードを配るということが「偶然性」につながります。

毎回、同じ手札でポーカーをやったとしたら、楽しいでしょうか。

毎回、同じ手札で大富豪は?ブラックジャックは ?

おそらく、楽しくないとおもいます。

「偶然」配られた手札でゲームをすることが「面白さ」につながっているはずです。

「麻雀」や「すごろく」も同じです。

毎回、同じ手配で同じツモの麻雀や、毎回同じ目が出るサイコロですごろくをやっても面白くありません。

偶然来た配牌に偶然来たツモ、偶然出たサイコロの目がゲームを面白くしているのです。


逆に、偶然性を極力なくすことで面白くなるゲームもあります。

例えば、「将棋」や「パズル」などのゲームです。

偶然性を排除しているため、実力のみで勝負することになります。

ただし、難易度は非常に上がります。

今回は、C言語で「偶然性」を表現するために必要な「乱数」について説明します。


乱数


乱数とは、「ランダムな数」のことです。

「ランダム」とは「無作為」という意味です。

「無作為」な数がゲーム性を引き上げるのです。

では、「無作為」な数はどのように考えれば良いか段階を追って書きます。


<sample program 021-01>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int number;

    srand( 0);

    number = rand();

    printf("乱数 %d\n", number);

    return 0;
}

<実行結果>

乱数 38
続行するには何かキーを押してください・・・

これまでのプログラムと違う点がいくつかありますが、mainの前の「#include」の部分に注目してみましょう。

  #include <stdlib.h>

という行が追加されています。

stdio.h や stdlib.h は「ヘッダファイル」と呼ばれているものです。

拡張子「.h」の「h」は「header(ヘッダ)」の頭文字です。

「ヘッダファイル」の詳細は、後々書いていきますが、「ヘッダファイル」の役割は、新しい命令(関数)を提供するものだと(今は)思っておいてください。

stdio.h は「Standard Input-Output」の略で、「標準入出力」の命令(関数)を提供しています。

このヘッダをinclude(含むという意味)することで、入力用の「scanf」や出力用の「printf」が使えるようになっているのです。

試しに、プログラムの1行目を削除してみてください。

「printf」の箇所でエラーが発生するはずです。

つまり、stdio.h が無ければ、「scanf」や「printf」は使えないということです。


stdlib.h は「Standard Library」の略で、「標準ライブラリ」といいます。

ライブラリというと、「図書館」という意味ですが、コンピュータでのライブラリは、「いくつかのプログラムをまとめてあるファイル」という意味で、「プログラムの図書館」と考えてください。

この、stdlib.hをincludeすることで、乱数が使用可能になります。


乱数の使用方法は、大きく2つに分けられます。

  1.乱数の「種(たね:Seed)」を設定する。

  2.乱数を生成する。

の2点です。


1の乱数の種とは、乱数を生成するための「基(もと)」になるものです。

「種」の設定には、「srand」を使います。

「種」が同じ場合、同じ乱数しか生成されません。

上のプログラムでは、乱数の種は「ゼロ」です。

実行結果は38ですが、何回か実行してみてください。

何度実行しても、38が表示されます。

種が変わらなければ、繰り返し同じ数が生成されます。


2の乱数を生成するには、「rand」を使います。

rand() と書けば、ランダムな数が生成されます。

上のプログラムでは、生成された乱数を、変数「number」に代入しています。


しかし、毎回同じ数では、使い物になりませんので、プログラムを改良してみましょう。


<sample program 021-02>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int number;

    srand(0);

    number = rand();

    printf("乱数 %d\n", number);

    number = rand();

    printf("乱数 %d\n", number);

    number = rand();

    printf("乱数 %d\n", number);

    return 0;
}

<実行結果>

乱数 38
乱数 7719
乱数 21238
続行するには何かキーを押してください・・・

何度か、乱数を生成してみました。

1回目は、相変わらず38ですが、2回目は7719、3回目は21238という数が表示されました。

「乱数の生成」を繰り返すと、違った数が作り出されているようです。

では、このプログラムも何度か実行してみてください。

実行結果は変わりましたか?




変わらないですね・・・

「乱数の生成」を繰り返すと、違った数が作られているように見えますが、「種」が同じなので、プログラムを再実行するとまったく同じ順番で乱数が生成されます

では、「種」を変えてみましょう。


<sample program 021-03>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int number;

    srand(1);

    number = rand();

    printf("乱数 %d\n", number);

    number = rand();

    printf("乱数 %d\n", number);

    number = rand();

    printf("乱数 %d\n", number);

    return 0;
}

<実行結果>

乱数 41
乱数 18467
乱数 6334
続行するには何かキーを押してください・・・

「種」を1にすることで、生成される乱数は変わりました。

しかし、プログラムを再実行すると、やはり同じ数が表示されます。

別の数値でも、試してみてください。


乱数の値は、「偶然性」に直接影響します。

このままでは、毎回同じ数値が生成されてしまい、プログラムを再実行しても、毎回変わらない数が作られるため、「サイコロ」であれば、毎回同じ目が出てしまい、「ポーカー」であれば、毎回同じ手札が配られることになります。

では、どうすればプログラムを再実行しても、毎回異なる数値が生成されるようになるのでしょうか。

そのヒントは「種」にあります。

プログラムを実行する度に、違った「種」がセットできれば、毎回違った乱数が生成されるはずです。

その方法の1つが次のプログラムです。


<sample program 021-04>

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int number;

    int seed;

    printf("乱数の種をセットしてください:");

    scanf("%d", &seed);

    srand(seed);

    number = rand();

    printf("乱数 %d\n", number);

    number = rand();

    printf("乱数 %d\n", number);

    number = rand();

    printf("乱数 %d\n", number);

    return 0;
}

<実行結果1>

乱数の種をセットしてください:0
乱数 38
乱数 7719
乱数 21238
続行するには何かキーを押してください・・・

<実行結果2>

乱数の種をセットしてください:1
乱数 41
乱数 18467
乱数 6334
続行するには何かキーを押してください・・・

毎回、乱数の種をセットすれば、毎回違った乱数が生成されます。

しかし、皆さんがコンピュータゲームをする際に、毎回乱数の種を入力していますでしょうか?

手間がかかるのはもちろんですが、自分で入力するのであれば、毎回同じ数値を入力することで、毎回同じ乱数を発生させることも可能になります。

もう少し工夫が必要ですね。

他に、プログラムを再実行する度に変化する要素は無いのでしょうか。

考えてみてください・・・









































答えは、「時間」です。

「時間」は刻一刻と変化していきます。


では、次は時間の扱いについて説明しましょう。


次へ

戻る

目次へ