ランダムエンカウント

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kms

ランダムエンカウント

#1

投稿記事 by kms » 15年前

kmsです。皆様、あけましておめでとうございます。

新年早々の質問、恐縮なのですが、
「ランダムエンカウント」の処理の仕方がいまいちわかりません。
softya様のご教授もあり、画面の遷移については勉強させて頂いたのですが、
フィールド画面を歩いていると、敵と遭遇する、というランダムエンカウント方式を
GetRand()関数を用いて色々と試したのですが、
歩いてもいないのにバトル画面になったり、逆にバトル画面が呼び出されなかったりと、
四苦八苦の状態です。
ランダムエンカウント方式は、WinMain関数のメインループ内に存在する、
列挙型~switch文では実現不可能なのでしょうか?
switch( function_status ) {
        case STATE_FIELD:
            //    フィールド
            Field();
            if( Key[KEY_INPUT_B]==1 ) { //Bキーが押されたら、
                function_status = STATE_BATTLE;    //Battleへ移行。
この箇所のif文を変えたりもしたのですが、うまく実働しません。
もしよろしければ、アドバイス等頂けないでしょうか? 画像

バグ

Re:ランダムエンカウント

#2

投稿記事 by バグ » 15年前

歩いた(移動が成立した)場合にのみ、カウンタ値を生成した乱数分だけ増やし、一定値に達していたらバトルへ移行する…みたいな流れでよいのではないかと思います。

DVDM

Re:ランダムエンカウント

#3

投稿記事 by DVDM » 15年前

>>kmsさん
ソースを全部見たわけではないので間違っていたら非常に申し訳ないのですが
歩くキーを入力した時、ランダムな数を発生させる関数を呼んでみてはいかがでしょうか。

そのまま書くとこんな感じですか・・・。
if((Key[KEY_INPUT_UP] == 1) || (Key[KEY_INPUT_DOWN] == 1) || (Key[KEY_INPUT_LEFT] == 1) || (Key[KEY_INPUT_RIGHT] == 1))
        {
            if(GetRand(100) == 1)
                function_status = STATE_BATTLE;
        }

Justy

Re:ランダムエンカウント

#4

投稿記事 by Justy » 15年前

 歩きが成立したかどうかは ch.walking_flagで判定できますね。

 よくあるゲームのランダムエンカウントは地形だったり持っているアイテムやプレイヤーのレベルなどの
影響を受けて常に確率が変動していることがありますが、このサンプルならそこまでやる必要はないので、
バグさんの方法で十分だと思います。

 もういっそのこと「一定歩数歩いたらエンカウント」でもいいかもしれませんね。
 一定歩数と言っても値はランダムで決めて、バトルが終わる度にランダムで初期化しなおせば、
毎回異なる歩数でエンカウントすることになりますから。

kms

Re:ランダムエンカウント

#5

投稿記事 by kms » 15年前

バグ様、DVDM様、Justy様、
ご丁寧なお返事、誠にありがとうございます。

>「一定歩数歩いたらエンカウント」
歩数を記録するのに、専用の変数を新たに定義したほうが良いのでしょうか?

皆様のアドバイスでなんとかランダムエンカウントの処理が出来ました。
本当に助かりました。ありがとうございます。

Justy

Re:ランダムエンカウント

#6

投稿記事 by Justy » 15年前


> 専用の変数を新たに定義したほうが良いのでしょうか

 そうですね。
 定義するなら ch_t構造体の中が望ましいかと。

kms

Re:ランダムエンカウント

#7

投稿記事 by kms » 15年前

>定義するなら ch_t構造体の中が望ましいかと。

わかりました。
ありがとうございます!

閉鎖

“C言語何でも質問掲示板” へ戻る