(Начало в №17)
AI (ИИ) в поперечном разрезе
В прошлый раз мы немного поговорили уже об искусственном интеллекте, но это были достаточно общие вещи, которые полезно знать не только game developer'у, но и любому ИТ-специалисту. Сейчас немного углубимся в вопросы создания искусственного интеллекта (ИИ) для игр, при этом вы убедитесь, насколько далеки в этом вопросе друг от друга теория и практика.
То, что принято называть ИИ в играх (особенно в красивых, в требованиях к которым говорится "не меньше 2 Гб оперативной памяти и 40 Гб на жёстком диске"), на самом деле серьёзно отличается от того, что понимают под этим термином учёные и разработчики экспертных систем. ИИ должен быть человекоподобен в игровом мире, и ему совершенно не обязательно иметь гибкость человеческого ума. На его стороне и так все преимущества - скорость расчётов, "знание" правил, а иногда даже и симпатии разработчика. Поэтому главное - научить ИИ вести себя так, чтобы человек мог с ним соперничать и бороться. В противном случае играть будет попросту неинтересно, и о коммерческом успехе, как и о всемирной славе команды разработчиков (или одного-единственного разработчика), придётся забыть до следующей игры.
Одной из ключевых особенностей интеллекта (любого, в том числе и человеческого, и искусственного) является способность к самообучению. Но как раз таки именно она в большинстве компьютерных игр не шибко востребована. Хотя, конечно, игра, в которой боты или юниты умеют самообучаться, и будет смотреться шикарно, но прежде нужно подумать, стоит ли оно того? Если вы создаёте аркаду, шутер, стратегию, РПГ, симулятор или ещё что-то из популярных игровых жанров, то вполне достаточно создать не полноценный ИИ, который будет играть как настоящий человек, а его иллюзию, которой для более-менее полноценной игры можно даже позволить несколько мухлевать.
Сейчас один не очень приятный момент. Дело в том, что алгоритмы создания ИИ для различных игровых жанров, скажем так, несколько отличаются друг от друга. Это, в общем-то, логично, поскольку и действия живого игрока в разных играх значительно отличаются. Поскольку рассказать обо всех тонкостях реализации ИИ для разных игр в одной статье совершенно нереально, будем ориентироваться на один жанр. Естественно, на тот, который больше всего люблю я сам - на стратегии.
Для искусственного интеллекта нет принципиального различия, какую стратегию вы задумали создать - пошаговую, реального времени (RTS) или какую-то ещё, например, доселе невиданную. Просто в случае RTS его придётся оптимизировать так, чтобы затраты времени на "обдумывание" действий были не слишком заметны для игрока. В стратегии реализация ИИ отличается от большинства других игр тем, что мы не создаём интеллект у отдельных юнитов (как это было бы в случае шутера или даже RPG), вместо этого создаётся некий виртуальный противник, стратег. Может, конечно, это и очевидно, но, судя по вопросам на форумах, посвящённых созданию игр, немало начинающих Game Developer'ов пишут стратегии, стараясь снабдить собственными "мозгами" каждого отдельного юнита. Хотя юниты тоже должны действовать "обдуманно"... но об этом чуть позже.
Поведение ИИ состоит из двух частей. Если не употреблять специальные психологические термины, то этими частями будут анализ ситуации и принятие решения. Поскольку все стратегии удобно программировать на основе матриц (двухмерных массивов), которые моделируют карту игрового уровня, то и ИИ будет иметь дело именно с ними при анализе сложившейся вокруг него ситуации. Для того, чтобы ИИ вёл себя правдоподобно, нужно ограничить область карты, которую он "видит". Причём можно сделать даже несколько более ограниченную область, чем та, которую видит игрок, так как человек не может обращать своё внимание сразу на такое же количество юнитов, как компьютер.
Для анализа ситуации нужно ввести несколько параметров. В зависимости от типа стратегии и фантазии разработчика, их количество, само собой, может варьироваться. Давайте рассчитывать, например, такие факторы, как внешняя угроза и экономическая безопасность. Это, так сказать, необходимый минимум. Для расчёта угрозы создаётся матрица (как я уже говорил, программно это реализуется наиболее просто с помощью двухмерных массивов), в которую заносятся значения силы для каждого из видимых на карте вражеских и своих юнитов. Для самого простого случая, когда сила задаётся одним-единственным параметром, можно сделать её для вражеских положительной, для своих - отрицательной. Для анализа возможных перемещений врага можно построить экстраполяцию траектории их движения за некоторый период и по ней уже вычислять матрицу угроз. Экстраполировать можно полиномиальными графиками, сплайнами, кривыми Безье, для особо "одарённых" случаев ИИ - даже прямыми. Далее по матрице угроз компьютер определит, куда нужно двинуть войска, сколько и откуда это будет ближе всего сделать. Желательно при этом использовать не только матрицу с угрозами, но и карту местности, чтобы учитывать различные препятствия, через которые в норме юниты перемещаться, по идее, не должны. При этом нужно не забывать, что по мере продвижения войск компьютерного игрока вглубь закрытой территории карты ему должны открываться новые виды, практически так же, как и живому игроку.
Теперь немного об игровой экономике. Очень малое число стратегий обходится без необходимости для игрока поиска на карте каких-то источников ресурсов и их захвата. Поэтому матрица экономической безопасности как раз и содержит на себе все источники ресурсов. С ресурсами, правда, несколько сложнее, так как их обычно несколько разных видов (но, конечно, если вам лень делать несколько, можно сделать и один). Одних видов у игрока будет избыток, других - напротив, дефицит. И ценность у ресурсов не равновелика, и может варьироваться даже в зависимости от количества источников ресурсов на данной карте, и, само собой, от применимости ресурса для строительства и обучения юнитов. Ко всему прочему, ИИ должен уметь определять, что именно для него на данный момент важнее - экономическое развитие или оборона. Реализовать это, используя матрицу угроз, будет совсем не сложно: достаточно посчитать общую угрозу на некоторой, достаточно близкой "безопасной" территории (её для каждой игры нужно определять экспериментально), а после сравнить её с собственными способностями к обороне. Ну и дальше, следуя нормальной человеческой логике, если угроза велика, или защищаемся, или строим войска. Ну а если невелика, то строим города и добываем ресурсы. Или просто сидим и курим, глядя на всех свысока.
Важной компонентой игры является расчёт оптимального баланса военного и экономического развития, чтобы компьютер мог действительно конкурировать с человеком, играющим в игру. Ну, что сказать на эту тему... Сказать, к сожалению, особенно нечего, потому что это целиком и полностью зависит от законов игрового мира, которые придумают сами разработчики. Соответственно, и законы стратегического развития ИИ в долговременной (для игры) перспективе должны определяться ими экспериментально.
ИИ у самих юнитов может полностью отсутствовать, поскольку вполне достаточно ИИ виртуального "игрока". Правда, в большинстве стратегий сами юниты тоже не обделены мозгами: когда их кто-то атакует, они перестают крушить здания и дают сдачи, а юниты-добытчики убегают, когда их начинают рубить или обстреливать. Самые основы ИИ юнитов состоят в том, что они должны обходить препятствия и выбирать оптимальные маршруты для своих перемещений. Алгоритмы поиска оптимального маршрута могут быть достаточно разными, начиная с простого перебора в случае, когда область невелика. Желательно, чтобы при обходе препятствий юнит ещё не подставлялся под опасные участки, на которых его могут заметить враги. Для этого имеет смысл построить матрицу проходимости для региона, в котором необходимо осуществить переход. Дальше ищется оптимальный путь (например, при помощи алгоритма А-Star - часто сокращённо пишут A*, - популярного в современном GameDev'е). Если путь для данной матрицы отсутствует, можно её расширить, пока не упрёмся в границы видимой области или в границы игровой карты.
Для каждого вида юнитов нужно продумать своё поведение. Например, крестьянин, добывающий в вашей стратегии лес, не должен идти в бой наравне с рыцарем или боевым роботом, а катапульты с танками не должны стрелять по близким целям, поэтому в случае прямой атаки должны отъезжать туда, откуда уже смогут разнести противника в щепки. Так что, как видите, в более-менее серьёзных стратегиях без искусственного интеллекта у юнитов не обойтись.
Что ж, вот такие пироги с реализацией искусственного интеллекта. Вы уж извините великодушно, что слов было много, а кода не было вообще, но дело в том, что довольно сложно проиллюстрировать изложенные принципы таким кодом, который был бы применим в каждой игре - тем более, и говорили мы только о стратегиях. Но на самом деле похожий на интеллект юнитов из стратегий ИИ присутствует и в RPG. Правда, что касается RPG, разработчики рекомендуют не начинать карьеру в GameDev'е, потому что этот жанр традиционно считается одним из самых сложных. В шутерах ИИ существенно отличается от описанного из-за того, что объекты так движутся в трёхмере и имеют не такие маленькие, как в стратегиях, размеры. Но рассказать об этом я сегодня уже не успеваю - возможно, потом.
А на сегодня всё, уважаемые читатели. Я помню, что с меня ещё продолжение рассказа о DirectX.
Вадим СТАНКЕВИЧ
![Версия для печати Версия для печати](https://www.kv.by/sites/all/modules/print/icons/print_icon.png)
Горячие темы