• ベストアンサー

ドラクエ4の戦闘のAIが知りたい

どのジャンルで質問するのがベストなのか迷いましたが C言語をやっている方なら詳しいんじゃないかと思いました。宜しくお願いします。 条件として ・敵が4人、プレーヤー4人(例えばわかりやすく、戦士、戦士、戦士、賢者とします) ・AIとして、ドラクエ4では「ガンガンいこう」や「呪文を使うな」などありますが、 今回は「みんながんばれ」で(要は、回復呪文、攻撃呪文、攻撃を均等に行う) ・賢者の呪文は「ヒャド(攻撃系)、ホイミ(回復系)、スカラ(守備系)、ルカニ(攻撃補助系)」が使えるとします 実際にプログラムを組んでいて分からないところは、呪文を使う時で、 その時、その時で何の呪文を使えば良いのか決める基準が分からないのです。 例えば、味方1人(戦士)のHPが70の時(MAXは100)、 1、その時点で回復した方がベストなのか? 2、敵にダメージを与えた方がベストなのか? 3、スカラを唱えて味方の守備を上げてこれから続く戦いに備えた方がベストなのか? など、何がベスト(ベストじゃなくても限りなくそうなるように)なのかが分かりません・・・ 例えば3だったら敵全員のHPや見方の攻撃力などを調べて、普通に攻撃してたら あと何ターンで倒せるのかを計算しなくてはなりません(たぶん) いやそれ以上に調べる個所があるかも・・・ そういうの(攻撃系、回復系、守備系、攻撃補助系)を全部ひっくるめて評価関数 みたいなのにかけれないでしょうか?攻撃した場合の評価(ヒャドなどの攻撃、ルカニなどの間接攻撃) と守備に徹した時の評価(ホイミなどの回復、スカラなどの防御力UP)を分けるんじゃなくて、 全部一緒に評価して、その返ってきた1番大きい値のものを実行するみたいな。。 自分で言っててなんですが、その評価関数自体の内容もあまりイメージできていませんけど・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★どうやら本格的にRPGゲームを作っていますね。 ・『AI』はいろいろな方法があります。→質問者さんの自由ですよ。最終的にはね。 ・今回は『みんながんばれ』のアルゴリズムですね。 ●評価関数のアルゴリズム(一例) ・まず、味方1人(戦士)の HP が 70 の時に、最大攻撃(平均攻撃)であと何回で  『敵パーティ』を全滅させられるかの回数をはじき出します。→サブ関数で。 ・それで、現在のターンで全滅させられるのならば、(2)番の『敵にダメージ』を  与えると評価します。→残りの仲間の攻撃数も考慮して。 ・もしも、回数が数ターンの場合は、敵の中で一番攻撃力が高い、最大攻撃以下に  HPが下回っているか調べ、下回っていたら(1)の『回復系呪文』と評価します。  でも、『回復系呪文』が唱えられない場合も考えて MP の関係で『スカラ系』の  呪文を行うようにも評価させます。→残りの MP も調べて。 ・上記以外で戦闘が長引きそう(敵の攻撃力が仲間よりも平均的に大きい場合)は、  スカラ系(攻撃補助呪文)がある時は、(3)の『攻撃補助呪文』と評価します。 ・よって、『味方パーティ』と『敵パーティ』の平均攻撃から何ターンで敵を全滅  させられるかを中心に『敵に攻撃』か、『味方の守備力UP』そして、『味方回復』  と評価させていきます。→HP に余裕がある場合には『攻撃』、少なければ『回復』  戦闘が長引きそうならば『攻撃補助』の順に評価させます。でも残り MP も考えて  さらに、魔法を唱えられない場合の第二評価関数をサブ関数として作ります。 まとめ: ・何ターン(何回)で『敵パーティ』を全滅させられるかのサブ関数。 ・HP を調べ『攻撃』か、『守備・回復』かの判定サブ関数。 ・MP を調べ『回復』か、『守備(スカラ)』かの判定サブ関数。 ・MP を調べ『魔法』か、『攻撃・防御』かの判定サブ関数。 ・上記のサブ関数を呼び出しメイン評価関数。 ・以上。最適でも 5 の関数(処理)に分ける必要がありそうです。 補足: ・また、味方の職業(戦士・賢者)でも判定サブ関数の状態を変化させるように、  職業別に処理を定義させると、さらに賢い『AI』システムを構築できます。  この場合は職業別にサブ関数を作って、関数のポインタで切り替えたりします。  つまり、転職(パーティ入れ替え時)のときに関数ポインタを切り替えるのです。 ・素晴らしい『AI』システムを作るには、まず、人間(質問者さん)ならばどれが、  一番よい『攻撃・回復・守備』かを考え、それを元に判定サブ関数と評価関数を  作り上げていきます。→ソースファイルを分けて1つの『評価システム』という  感じで作っていきましょう。 ・以上。おわり。参考にして下さい。→昔、RPG 作ったときのアルゴリズムです。

takagoo100
質問者

お礼

ご返答ありがとうございます。 全体のイメージが掴めたような気がします。 ありがとうございます。 >●評価関数のアルゴリズム(一例) 本来、このような決定は自分で決めるべきことなんでしょうけど、 RPGの製作経験者の方の具体的な決定の基準が分かって参考になりました。

その他の回答 (2)

回答No.2

すみません、回答の趣旨がおかしかったです。 先ほどのように乱数を最初に全て確認しておいて、最後までの攻撃シュミレートを把握します。 守備系魔法を唱えて防御力を1.5倍にする事でダメージが減ったりするのなら、 減らなかったときと減ったときのトータルの攻撃回数とHP,MPの差を計算すれば、単にそれでいいのではないですか? 4人に守備魔法を唱えるのに4ターン必要なら5ターン以上攻撃回数が減らないと意味が無い事になります。 HP,MPの差を取って(HPの差はMPで埋めましょう)ターンとMPを比較してはどうでしょう。

takagoo100
質問者

お礼

ご返答ありがとうございます。 こちらこそ、そういう意味で捉えられても仕方ない質問ですいません。 自分としては、最強のAIを作りたいわけじゃなくて、 そのAIの中の評価の仕方に対して曖昧なイメージしか持ってなくて 実際にどうプログラムを組めば良いのか分からないでいました・・・ たしかにランダムの比重を重くした方が面白いAIになりそうですね。 >4人に守備魔法を唱えるのに4ターン必要なら5ターン以上攻撃回数が減らないと意味が無い事になります。 このあたりの考えが基準になりそうです。自分なりに構築していきたいと思います。

回答No.1

私もよく趣味でゲームを作ります。 >あと何ターンで倒せるのかを計算しなくてはなりません(たぶん) ということは、最後までどの攻撃があたって、どの攻撃がからぶるか、攻撃のダメージ数はいくらかといった乱数も最初に全部作っておくという事でしょうか? そして最短で倒す方法を考えると? 全てのダメージとからぶる回数や敵の攻撃などわかっているのでしたら計算すれば最善の方法は作れるでしょうけど、それじゃおもしろくないんじゃないでしょうか・・。 ゲームにはランダム要素ほど大事なものはありませんし、 適当にHPが7割以下だったら回復で、前の奴が回復してるなら次の奴は攻撃とか、ってある程度適当に作った方がよさそうじゃないですかね。 すみません回答になってなくて。

関連するQ&A