ゲームボーイはまだ終わってない!本文へジャンプ

乱数

GBDKには、乱数を発生させるrand関数が用意されています。
下記は、そのrand関数を使用したサンプルです。

#include <stdio.h>
#include <gb.h>
#include <rand.h>

void main(  )
{
    UBYTE r;
    UBYTE i;
    
    for(i = 0; i < 10; i++){
        r=rand();    /* 乱数を取得 */
        printf("%u\n", r);
    }
}

【実行結果】


rand関数を呼び出せるようにするためにrand.hをインクルードする必要があります。

rand関数

UBYTE rand(void);

rand関数は0〜255までの範囲内でランダムな数値を返します。


ここで、上記サンプルプログラムを2、3回実行してみてください。
全て、同じ順番で同じ数値が画面に表示されていることが確認できると思います。

rand関数は「初期シード」という値を基に乱数を生成しています。
この初期シードを明示的に変更してやらないと、rand関数は何度呼び出しても同じ順番で同じ数値を返してしまいます。

そのため初期シード値をプログラム起動時こどに変更してやる必要があります。
プログラムを起動する度に初期シード値が異なれば、rand関数は異なる順番で異なる数値を返してくれるようになります。

initrand関数

void initarand(UWORD seed);

initrand関数は初期シードの値を設定する関数です。
initrand関数の引数に、プログラム起動時ごとに異なる数値を指定してやります。

#include <stdio.h>
#include <gb.h>
#include <rand.h>
#include <time.h>

void main(  )
{
    UBYTE r;
    UBYTE i;
    fixed seed; 

    printf(" ");
    puts("Getting seed");
    puts("Push any key (1)");
    waitpad(0xFF);
    waitpadup();
    seed.b.l = DIV_REG;
    puts("Push any key (2)");
    waitpad(0xFF);
    waitpadup();
    seed.b.h = DIV_REG;

    initrand(seed.w); /*乱数の初期シードを設定 */
    for(i = 0; i < 10; i++){
        r=rand();     /* 乱数を取得 */
        printf("%u\n", r);
    }
}

プログラム起動ごとに異なる数値を指定するには、少し工夫が必要です。
上記サンプルでは、ボタンを1度押した後、2回目が押されるまでの間隔を利用して、異なる数値を得ています。

乱数を利用すれば、プログラマの意思とは関係のないランダムな処理を実現することができます。

敵をランダムに発生させたい、ランダムに移動させたいなど、ゲームプログラミングにおいて乱数を必要とするケースは非常に多いので、しっかりおさえておいてください。

 
 <<アルファベット表示
 ゲームボーイはまだ終わってないトップへ