Вспомнил вот, решил написать...
Когда в 2000 г. я начал писать для Спектрума RTS (надеюсь, напишу ее), то алгоритм поиска пути делал тоже без полного просчитывания пути, чтобы максимально сэкономить время просчета и память. Он еще быстрее медноноговского, но маршрут может быть хуже, если препятствия протяженные. Тем не менее, в итоге юнит придет в нужную точку. Вот такой он:
1. Идем по прямой к цели (обе координаты горизонтальная и вертикальная сближаются с целью), запоминаем последние 6 клеток, через которые прошли, в буфер.
2. Если наткнулись на препятствие, то идем на клетку, чтобы хотя бы одна координата - горизонтальная или вертикальная сближались с целью. При этом не заходя ни на одну из 6 последних запомненных клеток в буфере. Продолжаем запоминать 6 последних клеток в буфер.
3. Если невозможно идти в условии п.2, то идем на любую соседнюю случайную клетку, которой нет в буфере. Продолжаем запоминать 6 последних клеток в буфер.
4. Если невозможно идти в условии п.3, то идем на любую соседнюю случайную клетку, которая есть в буфере, кроме той, где были на прошлом ходу. При этом в буфере запомненных клеток удаляем клетки, из которых пришли на текущую клетку в прошлый раз.
5. Переходим на п.1, пока не достигли цели.
Проверял, работает. Правда, приходится для каждого юнита хранить буфер 6 клеток (можно не сами координаты клеток, а смещение до них от текущей в 2-3 битах). Буфер можно увеличить/уменьшить в зависимости от размера и изрезанности предполагаемых препятствий.





Ответить с цитированием