スクリーンショット_2019-07-15_19

敵・仲間などのNPCの動きの斜め対応 ローグライク(仮)

今日の作業はNPCの通常の移動・攻撃の振る舞いに斜めを追加したものです。NPCはこのゲームでは今の所、プレイヤーの敵と仲間の2種類あります。

ただ、これが一瞬で対応できてしまいました。1枚目の1ターン後に2枚めになっています。一匹だけ部屋を出ていってますが・・・。

不思議のダンジョンシリーズなどとは違って、このゲームでは A* というアルゴリズムを使って動きを制御しています。

経路探索と言われる、障害物を考慮しつつ最短距離を導き出すアルゴリズムです。

今日やったのは、これに数行コードを足しただけでした。詳しいことを述べると、Wikipedia にも書いてある「ノード」と呼ばれる「座標・移動コスト・隣接マスとの関係」を表す情報を OPEN するときのコードに斜め情報を追加しただけです。4方向分あるので、4行ですね。

良かったです。斜め関係については、方向型の抽象性を意識していたものの、大前提として上下左右しか考慮しなくてよいと決めて開発を進めていた部分もあるので、もっと大変な作業が待っているかと思っていました。

方向型 (struct Direction) の抽象性とは、方向という型が具体的に何を表しているのかを知らなくても扱う側はそれを気にせず利用できるということです。

例えば座標型 (class Position) に get_next(Direction) というメソッドが用意されていたとします。これは Direction 型が「向き」に対して「相対的な座標」を返す機能を持っているので、Position は Direction のその機能の中身を全く知らずに利用することで、Direction の内容が変わると Position も自動的に対応したことになるわけです。

これが色々な場面で効いていて、今回は A* でも、前回まででも修正箇所が大幅に減った理由です。責務の適切な分離を意識していたからこそ、方向型がその責務をしっかり果たしてくれたんですね。

今度は、この数日間で大幅に変更された仕様に対してユニットテスト(実装内容の正しさを検証をするプログラム)の修正をしようと思います。かばん機能はユニットテストを書きながら作りましたが、既存機能は斜め移動を考慮していない前提の初期データでテストしているので、その辺りを含めて検証内容が17個壊れていますね。ユニットテストは抽象性より具体性を意識して書くものですので、こっちは作業が待っているという訳になります。

応援してくださると嬉しいです。よろしくお願いいたします!