地図/探索/経路探索

毎フレーム解かない — 貪欲なナビ

マップ全体を相手にする探索は、敵が多いと全員ぶん毎フレーム回すのが重い。最短をいちいち解かず、今いるマスから標的にいちばん近づく隣へ一歩進むだけでも、追い詰める動きは出る。

標的へ近づく隣を毎歩選ぶだけのナビは greedy(貪欲法)の一種で、最短経路は保証しない。袋小路や凹んだ壁に正面から入ると、近づく隣が無くなって詰まる。Pac-Man の鬼はこれに近く、各鬼が標的マスを少しずつ変えて(自機の数マス先、自機と別の鬼の対称点など)追う・先回りするを撃ち分ける。来た方向への逆戻りを禁じる一手が、迷路で往復してハマるのを防ぐ。

壁を撒いた格子で、追手が一匹。各歩で四方の隣を見て、標的とのユークリッド距離がいちばん小さい隣へ進む。来た方向(rev[dir])だけは候補から外す。標的は sincos でマップ上を漂わせている。

追手が標的の薄い四角を追って、壁の隙間を縫って進む。最短は解いていない。各歩で見るのは四方の距離だけで、見る範囲は手元の四マスに閉じている。標的が壁の裏へ回ると、追手は近づく隣を選び続けて壁に張り付き、隙間が見えるまで沿って動く。逆戻り禁止を外すと、行き止まりで一マスを往復してハマる。

距離の符号を反転すると、近づくのが遠ざかるに変わる。状態ごとに符号を切り替えると、一匹で追う・散る・逃げるを撃ち分けられる。state を 0 なら -dist(近づく)、1 なら +dist(遠ざかる)にして、タイマーで切り替える。2 では距離にランダムを混ぜて、ふらつきながら散る。

濃い鬼が標的へ寄り、淡い鬼は逆に離れ、枠だけの鬼はふらつく。state の数字一つで符号が変わるだけで、同じ貪欲な一歩が追う動きにも散る動きにもなる。タイマーが切れるたびに役が入れ替わって、四匹がてんでに寄ったり離れたりする。score の式は四方の隣を比べて一番を選ぶだけで、盤の他のマスは一切読んでいない。

最短を保証する探索は盤全体を読む。貪欲なナビは手元の隣しか読まない。何匹を、どれだけの頻度で、どこまで正確に動かしたいかで、読む範囲を盤全体に取るか手元に絞るかが分かれる。