18 марта 2002
Обновлено 17.05.2023

Боты — от и... до. Виртуальные болванчики для 3D войн

Боты — от и... до. Виртуальные болванчики для 3D войн - изображение обложка

В одиннадцатом номере “Мании” за 2001 год мы рассматривали тему создания модификаций для популярных игр. Отзывов на тот материал пришло много. Мы все детально изучили и вычленили наиболее популярные вопросы. Оказалось, что вас больше всего интересует проблема программирования ботов для трехмерных шутеров. Тупоголовых болванчиков, создаваемых другими (пускай и профессионалами), зачастую “не хватает” для обеспечения должного комфорта игры. Да и научить ботов играть на собственной карте — задача не из простых. Так что тема сегодняшней статьи — боты. Мы не будем изобретать велосипед, описывая программирование скриптов конкретных видов ботов (читайте мануалы, написанные создателями). Мы опишем основные принципы, из которых нужно исходить, “кодируя” поведение компьютерного оппонента (бота, но не монстра) на уровне. Усвоив урок, вы — освоив сам процесс кодинга — без труда создадите вполне приличного болванчика. Artificial Intelligence или Artificial Idiot? Прежде всего вы должны решить, что из себя будет представлять ваш бот. Возможные варианты: пушечное мясо для зарядки по утрам ( Artificial Idiot ), коварный DM-оппонент, грамотный CTF/Teamplay партнер или… что-то еще. Подобные мысли просто обязаны возникнуть у любого творца ботов. Ведь не станете же вы создавать болванчика, а потом перекраивать готовый код? Итак, из вышесказанного можно сформулировать важный постулат. Никогда не делайте бота для незаконченной игры. Если ваша модификация находится на ранних стадиях развития и вы только приступили к дизайну уровней, за ботов браться рановато. Вот когда задумка оформится, куколка прорвется и на свет появится симпатичная бабочка… Значит, настало время подумать о ботах. Не раньше! Вариации на тему Давайте рассмотрим, чем основные виды ботов отличаются друг от друга. Ведь исходя из этого знания и стоит подходить к вопросу программирования AI. Artificial Idiot Как правило, поддерживает все режимы игры, но непроходимо туп. Двигаться правильно не может, стенки обходить не умеет, стоит себе и стреляет… Можно использовать вместо тира. DM-оппонент Вот тут при программировании придется попотеть. Прежде всего, такому боту необходимо хорошее знание уровня, умение использовать все оружие, устраивать засады. Он должен уметь кемперить и, как это ни странно, отказываться от некоторых предметов, чтобы

Боты — от и... до. Виртуальные болванчики для 3D войн - фото 1

самому не наткнуться на засаду, которую по вашей воле устроил другой бот или игрок. Причем выглядеть это должно по-честному. Скажем, если вполне логичным выглядит то, куда побежал бот после своего респавна (к ближайшему хорошему оружию или другому полезному предмету), то умение “чуять” противника, который стоит за углом, и обходить все засады вызывает противоречивые эмоции. Представляете дуэль двух “идеальных” ботов: один бегает, другой его ждет за ящиком (и так всю дорогу). С одной стороны, хорошо, что бот такой умница (на самом деле ничего особенно умного тут нет), а с другой — явно проглядывает читерство со стороны бота. В процессе создания DM-бота вам придется столкнуться с таким понятием, как приоритет. В данном случае под этим термином следует понимать желание бота взять тот или иной предмет или напасть на того или иного игрока. Создание кода, оптимального с точки зрения приоритетов бота по отношению к предметам, выглядит примерно следующим образом. Каждый тип предмета (причем не только по виду оружие-броня-здровье, но и по тому, какое это оружие, броня и т.д.) индексируется (т.е. ему присваивается порядковый номер), а затем создается числовая таблица приоритетов, где каждому значению индекса предмета соответствует значение приоритета. Это наиболее удобный способ кодинга. Можно, конечно, отдельно прописывать приоритеты для каждого “операбельного” предмета на уровне, но это более трудоемко, а сам метод — менее гибок. Алгоритм может выглядеть приблизительно так: Пример 1: Если никого не видно — И — Если хочется взять предмет — И — Если идти за предметом не более N числа шагов — Итог — ВЗЯТЬ ПРЕДМЕТ.Пример 2: Если видно игрока — И — Если здоровья больше половины — И — Если у бота неплохое оружие (перечень такого оружия) — Итог —НАПАСТЬ НА ИГРОКА. Как видите, все довольно просто. Но неплохо бы вставить в эти условия некоторый элемент неожиданности. Скажем, во втором примере была бы уместна такая строка: “если случайное число имеет значение от 0 до 0.9”. Во всех случаях, когда некое случайное число больше или равно 0.9, бот будет игнорировать игрока (или любого другого потенциального оппонента). После того как бот либо выполнил поставленную задачу (взял предмет или убил кого-то), либо решение этой задачи становится невыполнимым (предмет взял кто-то еще или враг скрылся), следует переназначить цель для бота. Далее программа выбирает путь до цели, если она есть (об этом ниже), или же бот начинает просто бродить в каком-то случайном направлении, пока не наткнется на что-то интересное. CTF/Teamplay Все вышеописанное для DM-ботов подходит и для CTF/Teamplay ботов. За исключением того, что бот должен узнать понятие “команда”. Мало просто бродить по уровню и гасить подряд всех врагов и не гасить “друзей”. Вот пример для наглядной

Боты — от и... до. Виртуальные болванчики для 3D войн - фото 2

демонстрации действия команд. Скажем, у вас мало здоровья, и вы бежите за аптечкой (например, “мегой”), а в это время бот из вашей команды, который находится снизу, делает рокет-джамп и забирает у вас вожделенную аптечку из-под носа. “Абыдно, да?” Научить ботов командному духу вряд ли получится (даже у профессионалов ботостроения с этим пока проблемы), но исключить такие казусы можно и даже нужно. В данном случае пример алгоритма (псевдокод) выглядит следующим образом.Пример: Если виден хороший предмет — И — Если нет врагов — И — Если рядом нет друзей, которые смотрят в сторону объекта и направляются к нему — Итог — ВЗЯТЬ ПРЕДМЕТ. Конечно, бывают и такие случаи, когда 3-я смысловая (т.е. не “И”) строчка должна игнорироваться. Например, если бот подошел ближе всех к вражескому флагу и у него нехватка здоровья. Class-based Games Как правило, class-based games ассоциируются у нас с Counter-Strike, поэтому и рассмотрим поведение бота на его примере. На самом деле, Counter-Strike недалеко ушел от CTF. Вернее, он является его усложненным вариантом. Труднее всего научить бота не лезть на рожон, а вымуштровать его прятаться в темных углах, осторожно передвигаться. Обычно авторы на эти обстоятельства на обращают внимания… Купив первый пистолет, боты бросаются в бой. Вот и получается банальность вроде “стенки на стенку”. На самом деле понятие “класс” довольно условное. То есть на игрока накладываются ограничения в оружии, броне, здоровье и скорости. В Counter-Strike важнее всего оружие, поэтому поведение бота и должно зависеть от ствола, который он прикупил. Если, скажем, у бота снайперка, то ему не следует идти в атаку в первых рядах и лезть грудью на амбразуру. Расставление путей Боты, какими бы умными они ни были, все равно полностью зависимы от человека. Одной из сторон этой зависимости является расставление путей (вейпоинтов). На карте по всему ее внутреннему периметру устанавливаются точки (узлы), которые линкуются между собой, и получается как бы связанный путь. Расставляя вейпоинты, нужно соблюдать определенные правила: 1. Следующий вейпоинт должен

Боты — от и... до. Виртуальные болванчики для 3D войн - фото 3

быть виден из текущего. 2. Расстояние между соседними вейпоинтами не должно превышать n-ного кол-во единиц. 3. Расстояние между вейпоинтами не должно быть меньше m-ного кол-ва единиц (слишком частая расстановка может привести к необоснованным затратам системных ресурсов и глюкам). 4. Старайтесь не делать один вейпоинт на краю стены, а другой — уже на полу под стеной. 5. Труднодоступные места (нычки и т.д.) нужно “обработать” особенно тщательно (побегать, попрыгать, обойти каждый уголок). Большинство из уже существующих ботов поддерживают установку вейпоинтов вручную. Запускается игра в режиме debug, и играющий бегает по всей карте, а в это время автоматом ставятся вейпоинты. Преимущество данного метода — в его экономии. Недостаток — как правило, все боты будут пытаться пробежать по заранее известному пути, чуть ли не становясь в очередь, как за колбасой. Сделать грамотные пути таким способом можно, но довольно трудно. Альтернативой такому тупому “маршу по уровню с обучением” может служить полностью автоматизированное конструирование вейпоинтов. Специальная программа загружает карту, делит ее на кубы некоторого размера, ищет в пределах каждого пол, и если он есть — устанавливает на нем вейпоинт. Тут у ботов появляются неограниченные возможности выбора пути — “хошь” прямо, “хошь” левее или правее. При этом используются другие алгоритмы выбора пути, нежели в методе, описанном выше. Впрочем, и тут приходится сталкиваться с проблемами. Например, боты из-за обилия возможностей и при неправильном кодинге AI будут бессмысленно носиться по уровню, начисто позабыв о конечной цели и методах ее достижения. *** На этой ноте мы закончим наш сегодняшний разговор о программировании ботов. Возможно — если просьб с вашей стороны будет достаточно — мы еще вернемся к проблеме ботостроения в следующих номерах “Мании”. А пока осваивайте кодинг и, исходя из принципов, изложенных выше, программируйте компьютерных болванчиков по своему усмотрению. И пускай ваши боты пореже застревают в стенах… Полезные ссылки www.gameai.com — неплохой сайт по программированию AI. Есть статьи как для новичков, так и для профессионалов.www.gamedev.net/community/forums/forum.asp?forum_id=9 — доска объявлений сайта gamedev.net, раздел AI.www.botepidemic.com— ведущий игровой сайт, посвященный ботам.http://bots.internet.com/s-game1.htm — крутейшая страница чуть ли не про всех ботов.www.flipcode.com — шикарный сайт по программированию.www.gamedev.net — тоже неплохой сайт по программированию.www.gamasutra.com — хорошие статьи, написанные хорошими программистами. Стоит почитать.http://bot.counter-strike.net — боты для Counter-Strike.

Комментарии
Чтобы оставить комментарий,Войдите или Зарегистрируйтесь