Я пытаюсь заставить вражеский узел следовать за узлом игрока на С# с помощью алгоритма A*. Я прочитал учебники и загрузил несколько примеров С#. Теперь мой алгоритм A* работает в определенной степени. Он будет следовать за игроком на открытом пространстве, но застревает при попытке обвести объект.
Поэтому, когда мой алгоритм проверяет и движется в направлении наименьшего значения F, он может зайти в тупик, и в этот момент ему нужно повторить свои шаги назад, но это невозможно, потому что мой код сообщает ему, что ранее проверенный node закрыт и не может быть перемещен, поэтому он зависает.
Как мне пересчитать закрытый узел, чтобы сообщить моему алгоритму, что можно вернуться таким образом.
Кроме того, если я скажу своему алгоритму вернуться к самому себе, что помешает ему вернуться СНОВА к лучшему узлу, из которого он только что пришел; эффективно возвращаясь между двумя узлами неоднократно.
Я вижу, что он должен иметь возможность проверить узел в закрытом списке и определить, лучше ли он находится на этом конкретном пути, но я не уверен, как это делается.
Эвристика, которую я использую.
G = Math.Abs(StartNodeX - TargetNodeX) + Math.Abs(StartNodeY - TargetNodeY)
H = Math.Abs(CurrentNodeX - TargetNodeX) + Math.Abs(CurrentNodeY - CurrentNodeY)
F = G + H
Псевдокод.
- Добавить все соседние узлы в список открытых
- Проверьте все эти узлы на наличие самой низкой оценки F и добавьте этот узел в список лучших путей.
- Добавить все проверенные узлы в закрытый список (они все проверены, не хочу проверять их снова)
- Повторяйте, пока цель не будет достигнута
- Переместите врага на 1 узел в направлении наилучшего пути
- Повторить все сначала