Из газеты Don News #21, Ростов-на-Дону, 28.04.2005
(c)SpoozE/oHg/XXL
Здрасте всем!
Сразу о главном. В этой статье я расскажу
Вам о реализации искуственного интеллекта
(далее - AI), в масштабах нашего с вами
SPECCY. Для начала в общих чертах, что же
такое AI и к чему надо стремиться при его
написании.
К разработке AI надо подходить весьма
внимательно, так как каждая задача требует
узко специализированного и "подогнанного"
алгоритма ее решения. В связи с этим, я
буду поэтапно описывать создание AI для
широко известной игры "BATTLE CITY". Итак,
самым первым нашим шагом будет оценка тре-
буемых действий от AI-объектов ( далее -
боты). В нашем случае требуется, чтобы та-
нки: ездили просто так,охраняли базу,напа-
дали на базу противника, ошибались. Хм,
возможно некоторых смутил последний пункт,
но ошибки в действиях ботов очень важны,
мы ведь хотим создать реалистичную модель
поведения. Если в игровой ситуации все
танки устремятся к вражеской базе, то это
будет выглядеть мягко говоря не очень
реалистично, да и геймплей от этого изме-
нится далеко не в лучшую сторону, так что
пока оставим полный поиск пути и поговорим
о хаотическом движении.
Самое простое - конечно же просто случай-
ным образом выбирать направление через
какие-то промежутки времени, но смотрется
это будет не совсем так, как нам нужно.
Мне на момент разработки показалось целе-
сообразным ввести для каждого танка счет-
чик смены направления и типа движения.
Про смену типа движения расскажу немного
позже, а сейчас про смену направления. Как
это работает? В счетчик ложим случайное
число - количество ходов до смены направ-
ления (диапозон зависит от масштабов кар-
ты, но можно ввести зависимость от модели
поведения ). Затем каждый тик (интервал
времени, за который обрабатывается игровая
ситуация),мы уменьшаем счетчик на единицу,
и если он равен нулю, то опять обновляем
направление и счетчик. Также счетчик сле-
дует обнулять при неудачной попытке
сделать ход (например танк столкнулся с
другим танком или со стеной).Таким образом
мы достигли достаточно реалистичного дви-
жения "наугад". Но, увы, в данном случае
вероятность достижения танком определенных
позиций зависит от пространственной конфи-
гурации блоков и может быть очень мала.
Как видно на рисунке
-вероятность того, что танк пройдет в дыру
в стене близка к нулю. В таких случаях для
экономии аппаратных ресурсов, вместо тру-
доемких рассчетов выгоднее использовать
так называемые чекпойнты ( от англ.
Checkpoint - точка проверки). В моей реа-
лизации чекпойнты представляют собой мас-
сив таких же блоков, как и уровень, только
блоки имеют значения смены направления и
еще несколько свойств. Таким образом каж-
дый тик идет проверка танков,на чекпойнты,
если танк находится на позиции с чекпойн-
том, то идет несколько дополнительных про-
верок ( чекпойнты могут быть например
только для красных танков ), и в случае
успеха танк принимает направление, которое
соответствует чекпойнту. Немного забегая
вперед, хочу отметить тот факт, что в со-
ответствии с поставленной целью у нас
должно быть несколько моделей поведения
танков. Я обозначил две - атакующие и обо-
роняющиеся. Атакующие стремятся к базе
противника, используя волновой алгоритм
поиска пути (о котором ниже), а обороняю-
щиеся просто разъезжают по карте. В связи
с этим чекпойнты различаются по модели
поведения танков, которые будут по этим
чекпойнтам ездить. Например чекпойнт может
быть только для команды красных и только
для атакующих танков (можно придумать свои
критерии дифференцирования ). Итак нам
нужно реализовать полный алгоритм поиска
пути. Самый простой способ - волновой
алгоритм. Реализуется он элементарно, по
следующему алгоритму:
1. Начальная точка - пункт назначения
бота, в нашем случае - база противника.
2. Разбиваем поле на условные квадраты,
целесообразно будет разбить на те же раз-
меры, что и блоки и чекпойнты.
3. Забиваем клетки с "непроезжими" бло-
ками например #FF
4. Присваиваем клетке с координатами
цели значение ноль.
5. Всем пустым и "проезжим" клеткам
вокруг нее присваиваем значение на единицу
больше.
6. Обрабатываем каждую из помеченных
клеток аналогично.
В случае с танками мы сформировали два
поля AI - для красной и для синей базы.
Теперь чтоб пройти по кратчайшему пути к
объекту, надо всего лишь двигаться в ту
клетку, где значение меньше.
Легче всего идентифицировать движение по
этому алгоритму, как пятое направление и
выбирать его так же как и вверх, вниз,
влево и вправо, но только для нападающих
танков. То есть при нулевом счетчике, у
нападающего танка есть возможность выбора
движения по кратчайшему пути к вражеской
базе. Но как только счетчик становится
равен нулю,танк может поехать и по обычно-
му направлению,что ведет к реалистичности.
Также стоит учесть, что движение по волно-
вому алгоритму приоритетней, чем движение
по чекпойнту и при "наступлении" на
чекпойнт проверять, не движется ли танк по
пятому направлению.
Фух. На сегодня я, пожалуй, закончу, но
даже и не надейтесь отвязаться ;)
2 b cont...