Яндекс.Метрика

Поиск пути - алгоритм А*.

23.10.09.    Astar     Astar_exe

Нашёл простой пример поиска пути основанный на алгоритме Астар. Для начала просчёта пути нажмите "Enter". Теоретически он должен быть быстрее волнового алгоритма.


Бродить, преследовать, убегать, атаковать.

19.05.05.    game012-ai     имитация разума

Возможно понять весь листинг вам будет затруднительно, но некоторые элементы весьма просты. В конце концов примеры приведеные на этом сайте имеют цель научить вас (новичков) мыслить самостоятельно. К тому же в них есть вещи которые вы не найдете в книгах, их там попросту нет, даже если и есть то они вырваны из контекста программы и новичкам трудно понять в каком месте они должны стоять. Работующий пример лишен этого недостатка, но это всё же не книга и его трудно читать. Так что это занятие не для ленивых.

Я сам часто скачивал множество примеров из интернета, но до их разбора так и не доходили руки. Поэтому советую вам искать решение только для задачи поставленной на данный момент времени, это будет продуктивней.

Что касается самого примера, в нём два юнита имеют одинаковые "мыслительные" возможности выраженные в процентном отношении. Есть способ изменить агрессивность юнитов, вынудив их чаще атаковать или наоборот чаще убегать, предварительно внеся некоторые изменения в программу. Вы можете заставить пехотинца перейти в заданную точку, но на этом ваша власть заканчивается, так что он почти полностью самостоятелен.


Видеть

05.05.05.    game011-search     искать противника

Здесь показан пример того как персонаж может видеть. Функция простматривает по спирали соседние клетки и возваращает номер первого найденного врага на растоянии взгляда.

Хотелось бы обратить внимание на то, что в примере уже два персонажа, но управлять можно только одним. В растрах на диске эти персонажи имеют один флаг - синий, в игре же у них другие цвета. Растры 8 - битные и имеют родительскую палитру игры WarCraft2.

Программисты Blizzard создавали графику и утилиты работы с ней, направленные на экономию памяти. Они проделали колосальную работу, персонажи создавались буквально по пикселам. Особенность их графики я и использовал для замены цвета флага войнов. Для этого я написал маленькую процедуру на ассемблере и добавил дополнительный загрузчик имиджей под именем load_change_color_image(). Возможных цветов 8. Они зарезервированы под именами: bluePal, redPal, greenPal, violetPal, orangePal, blackPal, whitePal, yellowPal. Изменение цвета флага происходит до записи растра в поверхность так как она 16 - битная, а растр 8 - битный.

В примере вы найдёте значительные изменения. И мы все ближе подбираемся к настоящей игре.


Герой

26.04.05.    game009-path     управление героем

Теперь мы создадим героя. Для начала он будет просто идти туда куда вы его направите. Нам понадобится: структура для его описания, анимация и функция названная мной "менеджер пути" - в программе её имя Move().
На деле это превращение алгоритмов и функций в некий зародыш игры. Впервые заставив персонаж двигаться я поверил, что смогу писать игры. Правда это только семечко, которое должно превратиться в дерево, вырасший в во много раз код программы.
Есть одно "но" - герой обходит препятствия только если они не двигаются.

27.04.05.    game010-path     обход подвижных препятсвий

После просчёта маршрута ситуация может измениться и мы должны проверять место куда хотим шагнуть, исходя из результата идти дальше или найти новый путь.

На этом я закончу примеры поиска пути, но в последующих программах менеджер пути будет эволюционировать и подстраиваться к новым условиям.


Поиск пути

21.04.05.    game008-path     поиск пути

Первое, что мы сделаем с нашим персонажем для придания ему разумности поведения, это научим его ходить. Но прежде чем идти - надо знать куда... Для определения маршрута я использовал волновой алгоритм. Он очень медленный. Забегая вперед скажу, что мы обойдем медлительность позволяя персонажу просчитывать путь не чаще одно раза за 30-40 циклов.


Долгое время я пользовался программой скаченной из интернета, для этого было достаточно знать точки ввода данных и точки выхода результата. Я не задумывался как всё это работает пока мне не потребовалось адаптировать её к юнитам дальнего боя. В результате мне пришлось изучить принципы работы волнового алгоритма, прочитав не одну статью на эту тему в интернете и одновременно штудируя листинг программы. После чего от программы остался только алгоритм. Но самое главное я смог приспособить свою функцию к дальнобойному персонажу. Это огромный плюс, так как это очень сложный момент в программировании, а моя процедура в корне упрощает ситуацию, так что разница между юнитами ближнего и дальнего боя почти стирается (в смысле поиска пути).


Выше приведённая программка наглядно показывает работу алгоритма. Правда виден только результат, если же вы хотите понять принцип работы вам скорее всего придётся повторить мой пройденный путь, но возможно вам будет легче чем мне - это скорее пожелание нежели реальность. Человек создавший этот алгоритм должно быть гений, ведь даже просто чтобы понять его нужно очень много потрудиться.