ランダムな値、すなわち乱数はゲームには必須です。
ジャンケン一つとっても、何度遊んでも結果が毎回必ず一定になるようなものはゲームとは言えませんよね。
DXライブラリでは、GetRand関数 でランダムな数を取得します。 GetRand関数 のリファレンスを確認 してみましょう。
宣言 | int GetRand( int RandMax ) ; |
概略 | 乱数を取得する |
引数 | RandMax : 取得する乱数の最大値 |
戻り値 | 0 から RandMax で指定した数値のどれかの数値 |
0~渡した引数までのどれかの値が返ってくる関数です。
int a = GetRand(3);
と書けば、a には 0,1,2,3 のどれかの値が入ることになります。
また、ゲームにリプレイなどを実装する時、乱数の「初期化」が必要になります。
コンピュータは「いい加減」「だいたい」「ばらばら」のような処理が非常に苦手です。
コンピュータは本当にランダムな数を生成することは出来ないのです。
一般的に乱数は「ランダムに見える数」です。
つまり「4,28,3,197」など一見ランダムな数が生成出来たとしても、次回ゲームを起動した時に生成する数も「4,28,3,197」になってしまうという「擬似的な乱数」なのです。
(※但しDXライブラリで生成する GetRand関数 は次回起動時も異なる乱数になるようになっています。上の例はCの標準関数です)
しかし乱数がある規則でしか生成出来ないというのは「乱数の出現を再現したい時」に有効です。
乱数には「初期値」が設定出来、初期値が変わると乱数が変わります。
ですから、ゲームする度に変わる数を渡すことで完全にランダムに見える数が生成出来ます。
「ゲームする度に変わる数」には現在の時刻をミリ秒で表した数などをよく利用します。
初期値を変えることで乱数が変わるということは逆に言えば、初期値を同じにすれば同じ乱数が生成出来ます。
「過去にプレイした時と同じ状態を再現したい時」は初期値を過去にゲームした時と同じにセットして計算すれば過去と同じ乱数が生成出来ます。
リプレイはこの性質を利用してプレイ状態を再現するのですが、その辺の話は少し難しいのでとりあえず今は
・乱数の初期値を同じにすることで同じ乱数が取得できる
・DXライブラリでは初期値を指定しなければ自動的に異なる初期値が与えられるので自然にランダムな値が取得できる
とだけ覚えておきましょう。
乱数の初期値を設定するには SRand関数 を使用します。何でもいい int型 の数を渡せばいいだけなので、特に関数の説明はしません。
では上のことをサンプルプログラムで確認してみましょう。
#include "DxLib.h" int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定 int Random[8]; int Green = GetColor( 0, 255, 0 ); // 緑の色コードを取得 SRand( 123456 ); // 乱数の初期値を123456に設定する Random[0] = GetRand( 100 ); // 0~100までの乱数を生成する Random[1] = GetRand( 100 ); Random[2] = GetRand( 100 ); Random[3] = GetRand( 100 ); SRand( 123456 ); // 乱数の初期値を123456に再度設定する Random[4] = GetRand( 100 ); // 0~100までの乱数を生成する Random[5] = GetRand( 100 ); Random[6] = GetRand( 100 ); Random[7] = GetRand( 100 ); // while(裏画面を表画面に反映, メッセージ処理, 画面クリア) while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){ for( int i=0; i<8; i++ ){ DrawFormatString( 0, 20*i, Green, "%d", Random[i] ); // 文字を描画する } } DxLib_End(); // DXライブラリ終了処理 return 0; }
- Remical Soft -