Приветствую, читатели хабро, хочу рассказать об опыте написания ИИ для простой 2D игрушки еще в 2003-2004 годах.
Скажу сразу, написать эссе мне ни разу в жизни не удавалось, но я попробую.
Скорее всего, специалисты по разработке игр сочтут этот пост нубским, но я надеюсь, что и другим он будет интересен, поэтому начнем с самого начала.
Игровой мир
Игровой мир состоит из «квадратов» одинакового размера; доступны телепорты, джамперы и другие элементы, внезапно меняющие местоположение игрока.По карте разбросаны полезные элементы в виде оружия, боеприпасов, аптечек, брони и т. д. Игроку доступны длинные прыжки в космосе, позволяющие ему достаточно свободно перемещаться по игровому миру.
Задача будущего бота — свободно перемещаться абсолютно по любой новой карте, чтобы элегантно поддаться игроку, и по возможности убить как можно больше противников.
Система приоритетов
Суть ИИ-бота построена на системе приоритетов.Каждая значимая точка на карте, на которой можно стоять, заносится в массив и для каждого элемента рассчитывается вес исходя из текущей ситуации.
Важными моментами являются положения аптечек, брони, оружия и расположение врагов, если они в данный момент находятся на земле.
Вес позиции с аптечкой обратно пропорционален количеству уровня здоровья и времени, необходимому для попадания в точку, и прямо пропорционален определенному значению условного веса, выбранного для аптечек.
Если уровень здоровья полный, то понятно, что вес этой точки обнуляется.
Аналогичная ситуация и с другими важными моментами.
Позиции противника имеют более высокий приоритет, если у них мало здоровья или нет оружия.
Положения оружия увеличивают вес, когда его нет, и равны нулю, когда он присутствует. Цель пересматривается каждые несколько секунд или при достижении положения текущей цели.
Казалось бы, он рассказал все, но есть еще один момент, без которого описанный ИИ не смог бы работать — расчет времени достижения значимой точки.
Самый короткий путь
Чтобы система ИИ не замедляла игровой процесс, движения просчитываются при запуске карты.При этом каждой точке, на которой можно стоять, присваивается порядковый номер, расстояние между точками равно одному шагу игрока.
Перед началом игры был проведен полный расчет движений.
Бот последовательно размещался в каждой из этих точек и выполнял возможные действия: шаг влево, шаг вправо, слабый прыжок влево, сильный прыжок влево и т.д. После выполнения действия игровой процесс продолжался до момента остановки бота, после чего результат сохранялся в двумерном массиве вида «[начальная точка][действие] = {точка приземления, время движения}».
Этот механизм позволял боту использовать телепорты, прыгуны и любые другие элементы игрового мира, потому что бот просто знал, что если мы будем в точке X и шагнем влево, то через N секунд мы окажемся в точке Y. Имея этот массив для всего мира, был построен массив движений вида «[начальная точка][финишная точка]={минимальное время в пути}».
Для этого использовался довольно распространенный волновой алгоритм:
только с большим количеством действий:
в результате в любой момент бот может получить точное время достижения цели и список необходимых для этого последовательных действий.
Самообучение
Для выбора оптимальных весовых параметров (что важнее — аптечка, оружие или убийство слабого противника) был организован мини-турнир.В каждом участвовало по 10 ботов, весовые параметры каждого из которых отличались на некоторую случайную величину.
После 20 минут спарринга сильнейший выделялся и переходил на следующий уровень боя, где убивал более сильных противников.
В результате получается довольно неплохой противник для живого игрока — идеально умным его, конечно, не назовешь, но он способен вовремя отступить и побежать за аптечкой или патронами.
Остальные аспекты вроде прицеливания или выбора оптимального оружия довольно скучны и не стоят вашего внимания.
Надеюсь, вы дочитали до конца.
И напоследок небольшое видео этого действа: Теги: #ИИ #разработчик игр #маленький опыт #Разработка игр
-
Highscreen Zeus: Это Зевс?
19 Oct, 24 -
Howto: Ваш Бизнес В Сша Из России
19 Oct, 24 -
Проект Seamonkey Официально Просит Поддержки
19 Oct, 24 -
Изменения В Алгоритме Ранжирования Яндекса
19 Oct, 24