敵の移動アルゴリズム

これは何?

ここでは敵をどのように移動させるかについて書いたものです。

パックマン

パックマンでは、プレイヤーを囲むような敵のアルゴリズムを構築するために、
  • 追跡タイプ
  • 迎撃タイプ
  • プレイヤーと点対称に動くタイプ
  • ランダムに動くタイプ
という4つのアルゴリズムを用意したそうです。

追跡型

プレイヤーを愚直に追いかけるタイプです。

このタイプは、単純ながらもゲーム的にかなり有効だったりします。

それは、
  • 「耐久力が高い」または「数が多い」場合にゴリ押しできる
というメリットがあるからです。

例えば、ピンクスウィーツのステージ4では、
プレイヤーを誘導する耐久力の高い敵や、
高速で大量に発射される誘導弾が飛び交うため、
何も考えずローズクラッカーを連発しているだけでは、
すぐにやられてしまいます。

ただ、行動パターンを読みやすいため、
  • 待ち伏せ
をされるとあっさりやられてしまいます。
また、
  • 狙った場所に誘導しやすい
ということもあります。
(つまり、ピンクスウィーツの例では、攻略するには敵をうまく誘導する必要がある)


実装方法は簡単です。
プレイヤー座標から敵座標を引いて(P')、
P1(プレイヤー座標)-P2(敵座標)=P'
P'を正規化し(||P'||)、移動量をかけてやれば求めることができます。
追跡移動量=||P'|| × 移動量

迎撃(先読み)型

迎撃とは、プレイヤーが数フレーム後に移動するであろう座標を、
先読みして、そこに移動するタイプです。

追跡型よりも、行動パターンが読みにくいのが特徴です。

ですが、プレイヤーが全く移動しないと、
追跡と同じ移動量になるので、
結局、待ち伏せには弱かったりします。

実装方法です。
手順は、
  1. プレイヤーと敵の相対速度(Vr)を求める
  2. プレイヤーと敵の相対距離(Sr)を求める
  3. |Sr|÷|Vr|で接近時間(Tc)を求められる
となり、Tcから、
プレイヤー座標+プレイヤー移動ベクトル×Tc
により、迎撃ポイントを算出することができます。

念のため式を書いておくと、
  • プレイヤーの現在座標をSp
  • プレイヤーの移動ベクトルをVp
  • 敵の現在座標をSe
  • 敵の移動ベクトルをVe
とすると、
  1. Vr=Vp-Ve
  2. Sr=Sp-Se
  3. Tc=|Sr|÷|Vr|
迎撃ポイント=Sp+Vp×Tc
となり、
迎撃移動量=||迎撃ポイント-敵座標||×移動量
となります。

逃走型

追跡型の移動ベクトルを逆にするだけ。

あんまり使い道はなさそう。

待ち伏せ型

普段は隠れていて、プレイヤーと敵との距離が「ある一定の値以内」となった場合に、
追跡・迎撃型となるタイプです。
強力な攻撃力を持つ敵がこのタイプである場合、対処が非常に困難になります。

間合い確保型

プレイヤーと敵との「距離を常に一定」に保とうとするタイプです。
プレイヤーの有効な攻撃範囲に入らず、
敵の有効な攻撃範囲であるギリギリの距離を保たれると、
たぶん、倒せません(´Д`;

直角移動型

プレイヤー座標と敵座標を結んでできた線から直角の方向へ移動するタイプです。

固定画面シューや全方向シューなどで、
プレイヤーとの距離をとりながら、遠距離攻撃をするような敵に向いています。

また、この移動量を毎フレーム求めてやると、プレイヤーの周りをぐるぐる回る
といった動きになります。

移動量の求め方は、
相対距離のベクトルから角度を求めて90°を加算・減算したり、
ベクトルをZ軸まで拡張して、法線ベクトル(0, 0, 1)をかけても求めることができます。

評価値計算型

評価値の高いスペースを狙うタイプです。
例えば、シューティングでは画面の中心は弾を避けやすいため、
プレイヤーは中心に移動しようとします。
そこを狙います。

また、アイテムがあるとプレイヤーはそれを取りに行こうとします。
そこを狙います。(嫌な敵だ、、(´Д`;


参考