Мой подход требует небольшого объема памяти (с точки зрения эпохи Пакмана), но вам нужно вычислить только один раз, и он работает для любого дизайна уровней (включая прыжки).
Разметка узлов один раз
Когда вы впервые загружаете уровень, пометьте все узлы логова монстров 0 (представляя расстояние от логова).Выполняйте внешнюю маркировку подключенных узлов 1, подключенных к ним узлов 2 и т. Д., Пока все узлы не будут помечены.(примечание: это даже работает, если у логова есть несколько входов)
Я предполагаю, что у вас уже есть объекты, представляющие каждый узел и соединения с их соседями.Псевдокод может выглядеть примерно так:
public void fillMap(List<Node> nodes) { // call passing lairNodes
int i = 0;
while(nodes.count > 0) {
// Label with distance from lair
nodes.labelAll(i++);
// Find connected unlabelled nodes
nodes = nodes
.flatMap(n -> n.neighbours)
.filter(!n.isDistanceAssigned());
}
}
Глаза перемещаются к соседу с меткой наименьшего расстояния
Как только все узлыпомечены, маршрутизация глаз тривиальна ... просто выберите соседний узел с меткой наименьшего расстояния (примечание: если несколько узлов имеют одинаковое расстояние, не имеет значения, какой будет выбран).Псевдокод:
public Node moveEyes(final Node current) {
return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}
Пример с полной маркировкой