dポイントプレゼントキャンペーン実施中!

このジャンルでお願いします。

例えば、ドラゴンクエストモンスターズ
http://way78.com/gb/dqm2/mgc.html
のような戦闘システムを再現したいと考えているのですが、
単純な攻撃特技なら耐性と照らし合わせてダメージを算出するだけだと思います。
ただ補助特技や補助特技の

・たかくとびあがる(次のターンに攻撃)
・うけながし(自分が受けた攻撃を敵か味方に受け流す)
・ふういんのいのり(自分の受けた特技を敵味方一切使えなくする)
・まねまね(敵から受けた攻撃をそのまま跳ね返す)
・きあいをためる(ターンの最後に通常の1.5倍の打撃を与える)
・せいしんとういつ(次のターンの攻撃が2回連続になる)

ここらへんの処理を実装するとなるとかなり複雑になりそうです・・・(他にもややこしそうなのがありますが)
自分では考えられそうもないので、
ネットなどで戦闘システムを検索したり関連の書籍を探したりしたのですが、
簡単な戦闘システム(1対1で単純な攻撃だけとか)の説明しか今のところ見つかりませんでした・・・
少し考えてみたのですが、キャラの状態が
・飛んでるとき
・気合を溜めてるとき
・何らかの状態異常のとき(混乱や麻痺)
は攻撃ができなくて、混乱してる時は麻痺をかけられても効かないとすると、
有限ステートマシンなどのアルゴリズムを利用した方がいいのかな?と
思ったりして、でもそもそも上の3つの場合を一まとめにできるものなのか
とにかくわけがわからず想像ができないです・・・

みなさんならどのようにクラス分けして処理していくか知りたいです。
またはこのような戦闘のアルゴリズムが書かれてる書籍などありましたら
紹介して頂けないでしょうか?

A 回答 (4件)

鉄則は「深く考えるな」です。



「状態」と言うステータスがあるなら、そのステータスを「すべて書き出し」して下さい。1つも漏らさず、考える限りのすべてを書き出します。

そして「そのステータスの時に、どの行動が出来るか?」を、ステータスごとに全て書き出して下さい。

そして「出来る行動を選んだ時、どういうステータスになるか」も、行動ごとに全て書き出して下さい。

深く考えずに、とにかく、思い付く限り、全部書き出して下さい。

例えば、

○ステータス
・通常
・死亡している
・飛んでいる
・麻痺している
・混乱している
・気合を貯めている
・気合を貯め終わっている(前のターンで気合を貯めた)
・祈っている
・祈り終わっている(前のターンで祈った)
・特技使用不可
・精神統一している
・精神統一し終っている(前のターンで精神統一した)
・精神統一後の1回目の攻撃をした
・まねまねしている

○行動
・通常時
 飛ぶ(攻撃キャラで飛べるキャラのみ)
 気合を貯める(気合が使えるキャラのみ)
 祈る(祈れるキャラのみ)
 敵を攻撃する(攻撃キャラのみ)
 防御する
 回復薬で回復する(薬を持っている時のみ)
・死亡時
 死亡し続ける
・飛んでいる時
 攻撃する(攻撃キャラのみ)
 攻撃し終わったら通常状態になる
・麻痺時
 麻痺から自動回復(乱数?一定ターン過ぎたら?) 
 麻痺し続ける
・混乱時
 敵に回復をかける(乱数?回復魔法の使えるキャラのみ)
 味方を攻撃する(乱数?攻撃キャラのみ)
 味方に状態異常の魔法をかける(乱数?魔法の使えるキャラのみ)
 何もしない
・気合を貯めている
 何もしない。気合を貯め終わっている状態になる
・気合を貯め終わっている
 気合入り特殊攻撃をして、通常状態になる。
・祈っている
 何もしない。祈り終っている状態になる
・祈り終っている
 特技を敵味方一切使えなくして、特技使用不可になる
・特技使用不可
 特技以外の行動をして、一定のターン後、通常状態になる
・精神統一している
 何もしない。精神統一し終っている状態になる
・精神統一し終っている
 攻撃し、精神統一後の1回目の攻撃をした状態になる
・精神統一後の1回目の攻撃をした
 ターン後にもう一度攻撃し(連続攻撃)、通常状態に戻る
・まねまねしている
 敵と同じ事をして、通常状態に戻る

のように。

もれなく全部書き出したら、「状態」と「行動」と「行動の結果、なる状態」に、抜けが無いか確認しましょう。

例えば「体力が低下している状態」があって、その状態で選べる行動に「回復薬を飲む」と言う行動があるのに「回復薬を飲んだ結果」が書いて無かったりすると困ります。そういう「抜け」が無いかチェックしましょう。

チェックして抜けが無いと判ったら、あとは「書き出した通りにプログラムするだけ」です。
    • good
    • 0

「戦闘アルゴリズム」、または「ゲーム」に限った話ではなく、


一般的な話として。
---
普通にひたすらswitch文や「if-else文の羅列」を書くことと
まったく同じことなのですが、
「ソースコードの整理術」的な意味あいからすれば、

・書籍「実例で学ぶゲームAIプログラミング」第2章
・デザインパターン「Stateパターン」

などを参考にするといいかも。

・「状態ごとに」わけて考えて、プログラミングする
 (つまり、各状態ごとにインスタンスを割り当てる)
・「状態の変化」は、「インタンスの切り替え」に相当する

の2点がポイント
    • good
    • 0

>少し考えてみたのですが、キャラの状態が


>・飛んでるとき
>・気合を溜めてるとき
>・何らかの状態異常のとき(混乱や麻痺)
>は攻撃ができなくて、混乱してる時は麻痺をかけられても効かないとすると、

とりあえず適当に…

#define 飛んでる 0x80
#define 気合い貯め 0x40
#define 混乱 0x08
#define 麻痺 0x04
#define 状態異常 (混乱|麻痺)
とか設定して、
char 状態;
って変数にそれぞれ論理和などで入れればよいかと。

if(状態 == 0){
 通常攻撃
} else if((状態 & 気合い貯め) != 0) {
 行動優先順位を変更
 次回の攻撃力に1.5倍の+補正
} else if((状態 & 飛んでる) != 0) {
 行動不能
 次回の攻撃力に+補正
}

とか。
    • good
    • 0

単にフラグを立ててそれを条件分岐していけばいいだけでしょ?


なにがそんなに難しい?
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!