
● エンカウント ●
エンカウントとは、
キャラクターが歩行中に敵に遭遇することです
ランダムに敵と遭遇し
場所によっては強敵が出現する
今章では
そのエンカウントの仕組みと
プログラムの作り方について解説していきます
乱数について
まず、歩行中ランダムに敵と遭遇するわけですから
if~elseなどの式やフローチャートだけでは
実現が困難です
現在時刻を取得して、
その秒数の時に敵を出現させる
という方法も可能ですが
もっと良い方法があります
乱数を使う
という方法です
乱数とは規則性のない値
のことで、身近なものでいうと
サイコロの目が乱数に当たります
サイコロの目は
振るたびにランダムな1~6の数値が出ます
サイコロの目のように
乱数を発生させる関数を使用して
エンカウントの仕組みを作っていきます
好みの乱数値を取得する
rand();
という関数が、C言語において乱数を取得するための関数です
a=rand();
で、変数aにランダムな数値が入ります
ただしこの関数で取得できる乱数の値は
0~32767
しかも環境によって最大値は異なるという厄介な関数です
う~ん
そんなにいらないんだけど・・
ですよね
そんな膨大な数に対しての条件分岐を作るのは大変です
仮に最大値が無限にあったとしても
そこから好みの範囲の値を取る方法があります
その方法は
数字を割り算で割ればいいだけです
たとえばサイコロの目の乱数が欲しいなら
6で乱数を割ります
はぁ?
膨大な数を割ったって
その値は膨大じゃん
注目するのは、余りです
どんな数字であろうと6で割った場合、
余りは0~5の6種類しかないはずです
32767÷6=5461 余り1
4÷6=0 余り4
12÷6=2 余り0
・・・ほんとだ
なので仮に範囲10の乱数が欲しい場合
a=rand()%10;
とすればOKです
乱数の初期化
rand()関数は確かにランダムな数値を出します
ですが初期化を行わないと
何度も同じ値を出し続けます
これでは全然意味がないですよね
プログラムの初期化時に
srand((unsigned)time(NULL));
という1文を、おまじないのように入れてください
srand()の引数に現在時刻を入れることによって
毎回完全にランダムな数字を呼び出せます
time()関数を使用するには
<time.h >
をインクルードしてください
歩行プログラムへの実装
それではいよいよ、
コーディングを行っていきます
前章までのプログラムをそのまんま使います

<time.h >をインクルード
グローバル変数intencount;
に0を入れて準備します

初期化の関数InitInstance()内で
srand()を実行します
さて、
エンカウントするための条件式を
プログラム中のどこに作るべきでしょう?
う、う~ん・・
表示が全部終わった後、だっけ?
そうです
しかも会話とエンカウントは
被らないようにしないといけません

Kaiwa()が成立しなかった時
エンカウントして戦闘に突入する関数
Battle()
を実行するように組んでみましょう

Battle()関数の中身です
グローバル関数で定義してください
まず、変数encountの値を1足します
これには現在の歩数が入っており、
3歩目からじゃないとエンカウントしないような
処理になっています
1歩目でエンカウントすると
かなり鬱陶しいので処理を施しています
(SKULLというゲームはこの処理を行わなかったので1歩目でエンカウントします)
やっとここで乱数が登場するのですが
10分の1の確率でエンカウントするようにしました
数字は好きにいじってください
敵と遭遇した時、
BitBlt()の第9引数で
会話枠の画像をマップと重ね、色を反転して表示させています
そして、1度戦闘に突入したら
歩数encountは再び0にします
実行結果

3歩目以上、10分の1の確率でこの画面が表示されます
お疲れ様でした
これで、エンカウントの処理は完成しました
● 「敵エリア」の作成 ●
マップの場所によって
敵の強さが変わると
ゲームはより面白さが増します
モンスターの生息場所も作ってみましょう

こんな感じで
3種類のモンスターの生息場所を作ってみようと思います

条件式のイメージです
もしxが14以上なら強敵
違くてもしyが13以下なら標準
それ以外ならやや強敵
のように指定すればいいと思います
もっと面白くする!
という強者は、
マップの数字自体を変えて
エンカウントした場所の数字によって判断すると良いと思います
ソースコード
