Из газеты 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...