敵アルゴリズム改良(長期的ルート探索)

例えば、敵AIの行動が

マップ内の最も近いユニットに接近し、攻撃する(ただしマップギミックは無視する)
で、以下のような地形の場合...

こんな風に、目標地点に接近しようとして動けなくなるのが現状。
マップギミックだけでなく、移動不可能なマス(地形)に囲われた場合も同じ。



これは敵AIが、
"現在"移動(攻撃)可能なすべてのマスを評価⇒最も評価の高いマスへの最適ルートを探索⇒移動処理
という順番で処理していて、長期的にルートを考える、つまり次の行動を見越して移動する、みたいな思考ができないから。
まあもちろん、作成時にそんなマップにしなければいいってだけの話なんですが、一応改良します。


具体的には、
"現在"移動(攻撃)可能なすべてのマス内に攻撃対象(ユニット・マップギミック)が一つもない場合、もしくは
敵AI行動パターンで行動が確定できなかった場合(これも本来はそうならないように設定する)に、
①ターゲットまでの最短経路を、"マップ全体から"検索して、
②そのルート上の実際に移動できるマスを特定することで、移動先が確定する
という流れ。

移動までの処理構造を整理

コモン[┗相手ターン]
  コモン[■マップ情報読込]可変DB[マップ情報]に、各マスの移動コストを記録。
  コモン[■敵AI処理]コモン[■評価値計算]を呼び出して、移動先のマスを決定。
  コモン[■移動範囲計算]可変DB[移動範囲]に、ユニットの現在地点周囲のマス移動後の残り移動力を記録。
             要するに周囲に向かって段々と小さい数値が記録されていく。詳しくはこちら
  コモン[■移動処理]【ループ】コモン[┣ルート検索(上/下/左/右方向)]で、周囲の移動後の残り移動力が一番が大きいマスを順に特定。
           上記ループでルート確認後、移動処理。詳しくはこちら


ルート検索と移動の仕組み

これが結構複雑で、実は理解するのを後回しにしてた...
もう逃げられないので、銀日記さんの解説などを参考に、処理の仕組みを理解。
ginyoku892.blog69.fc2.com
donichi-game.com


コモンEv[■移動範囲計算]でやっていること
例えばこんなマップだった場合。


手順1.可変DB[移動範囲]0で初期化


手順2.可変DB[移動範囲]の計算開始地点に持ち点を代入


手順3.座標リスト※の座標を抜き出す

※ただし座標リストが空なら処理終了


手順4.その周囲4マス(下左右上)について手順5以降を繰り返し

4マス全て処理したら手順3に戻る


手順5.可変DB[移動範囲]のマスの値が、持ち点-1以上なら手順4へ戻る

この場合、
 可変DB[移動範囲]のマスの値 = 0
 持ち点 - 1 = 5 - 1 = 4


手順6.持ち点-マスの移動コストが0以下(つまり持ち点が足りない)なら手順4へ戻る

 持ち点 - マスの移動コスト = 5 - 1 = 4
※移動コストはコモンEv[■マップ情報読込]可変DB[マップ情報]に記録済み


手順7.持ち点-マスの移動コスト可変DB[移動範囲]のマスの値より大きいなら記録して、座標リストに追加して手順4へ戻る

 可変DB[移動範囲]のマスの値 = 0
 持ち点 - マスの移動コスト = 4
※より大きい数字が可変DB[移動範囲]に記録される



これを繰り返すと以下のような結果になる



コモンEv[■移動処理]でやっていること
コモンEv[┣ルート検索(上方向)]コモンEv[┣ルート検索(左方向)]を使って、上記で可変DB[移動範囲]に記録した数字を順に辿って移動


改造

コモンEv[■移動処理]コモンEv[■ルート検索]という名前に変更して、ルート検索後に移動するだけでなく、移動せずに移動先の座標を返すだけのモードを追加。


ここで、最適ルート探索のために角度一致率を逐一計算する必要性が出てきたため、コモンEv[■敵AI処理]の「角度一致率で効率化」の処理をこのコモンEv[■ルート検索]に移動、さらにコモンEv[┣ルート検索(上方向)]コモンEv[┣ルート検索(左方向)]の処理も全部移動しました。
うーんこれは処理重くなりそう(予言

仕様変更

可変DB[移動範囲]の初期値を0から-1に変更して、記録する数字を周囲に向かって段々と”大きく”なるように処理を改造。
さらにコモンEv[■移動範囲計算]に、通常とは別にマップの隅まで数値を計算するモードを追加。

つまりこんなイメージ

こうする事で、移動力に関係なくマップの端までルート検索が可能になるので、長期的な最適ルートを検索してから、現在移動可能なマスまで移動、という処理が実現。
目的地まで自動運転するロボットなんかと同じですね(たぶん


その他、仕様変更で影響のある処理やDBを調整。

完成


これでだいぶ頭良く…最低限人間ぽい動きができるようになったかな。


ただ明らかにAIの思考時間が長くなってしまったので、ウディタをver3にアップデートした時に多少なりとも処理が速くなれば嬉しいな…(最後はツール任せ