その9ー4 《総集編》 ロールプレイングゲームの作成 エンカウント

 エンカウント 


エンカウントとは、
キャラクターが歩行中に敵に遭遇することです




ランダムに敵と遭遇し
場所によっては強敵が出現する


今章では
そのエンカウントの仕組みと
プログラムの作り方について解説していきます







乱数について


まず、歩行中ランダムに敵と遭遇するわけですから
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以下なら標準
それ以外ならやや強敵


のように指定すればいいと思います



もっと面白くする!


という強者は、
マップの数字自体を変えて
エンカウントした場所の数字によって判断すると良いと思います





ソースコード







次章はいよいよRPG作成の最終章
「戦闘」
です

章の最後には全てのソースコードを掲載します

お楽しみに!