У меня возникают проблемы с определением конкретного поискового запроса, но как найти возможные ходы в 2D пошаговой стратегии (например, FF: Tactics, Fire Emblem, Advance Wars).
Я не так много думаю о местности (или даже столкновении) на данный момент. Мне просто интересно, какой алгоритм я могу использовать, чтобы выяснить, что X-сущность может перемещать 5 плиток и атаковать 2 дальше плиток, чем эта.
Я знаю, что могу использовать что-то вроде Дейкстры, чтобы найти расстояние между двумя точками. Одна возможная реализация начинается с местоположения игроков и затем отходит оттуда, пока расстояние, возвращаемое Дейкстрой, не станет больше, чем количество ходов.
Просто интересно, может ли кто-нибудь указать мне правильное направление (то есть название алгоритмов, техники, статей и т. Д.).
Ответы:
Я думаю, что ограниченная Dijkstra это именно то, что вы хотите использовать. Способ, которым Дейкстра находит расстояние между двумя точками, заключается в том, что он отображает расстояние до каждого узла от исходного узла, а затем «выбирает» кратчайший путь из этой карты расстояний. Вы хотите сделать практически то же самое, за исключением того, что вам нужен график узла расстояния, который он создает в качестве выходного, а не путь к какой-либо конкретной точке.
Одна из модификаций, которую вы хотите сделать, - это пропустить расчет расстояния от узлов, которые уже превысили ваш максимальный диапазон движения. Затем у вас будет график узлов всех узлов, по которым может перемещаться юнит, плюс граница, так что просто вырежьте узлы, расстояние которых превышает допустимое значение движения.
Виола.
Другими словами, то, что вы описали в своем вопросе, - это то, что вам нужно сделать. Он также имеет преимущество, заключающееся в возможности использования выходных данных для поиска пути без необходимости каких-либо дополнительных вычислений.
источник
Самый простой (и, вероятно, самый наивный) подход, который я могу придумать прямо сейчас:
steps - 1
.steps - 1
гдеsteps
будет номер шага текущего поля, если только у нового поля нет уже более высокого номера.источник
Я думаю, что вы ищете, может быть Манхэттен Расстояние . При условии отсутствия препятствий, вы можете сказать, что квадрат достижим просто, если:
| Tox-fromX | + | toY-fromY | <maxMoveDistance
Этот алгоритм может быть неправильным направлением, если позже у вас будут препятствия; Один из возможных способов его адаптации может заключаться в том, чтобы препятствия отбрасывали «тени» и переоценивали их с ближайшей точки.
РЕДАКТИРОВАТЬ (потому что у меня есть немного больше свободного времени сейчас):
Под «тенями» я подразумеваю что-то вроде этого, если 0 - достижимый квадрат, C - символ, а X - препятствие:
Поскольку (5, 2) является препятствием, вы начинаете с предположения, что не можете ничего достичь с x> = 5 AND y <= 2. Затем вы можете пересчитать из другого квадрата; если вы хотите перейти к (5, 1), вы можете рассчитать манхэттенское расстояние от (4, 1) и посмотреть, меньше ли это + расстояние от персонажа до (4, 1), чем расстояние перемещения игрока.
Это довольно тривиальный пример, но если у вас есть несколько препятствий и / или немного больший диапазон перемещения, он должен справиться со сложностью.
Я не имею ни малейшего понятия, будет ли это на самом деле лучше, чем просто заполнение флудом, будь то сложность программирования или эффективность выполнения. Просто показалось, что это более интересный способ решения проблемы.
источник