- PVSM.RU - https://www.pvsm.ru -
Геймдизайнеры регулярно сталкиваются с задачей создать интересный ИИ. Этот процесс может быть как относительно простым, так и крайне сложным, в зависимости от нужд проекта и целей, которые вы преследуете. Старший геймдизайнер Banzai Games [2] Михаил Драговаловский рассказал про опыт работы над ИИ для популярного мобильного файтинга Shadow Fight 3.
Серия Shadow Fight [3] сразу создавалась с рядом фичей, которые отличают ее от многих файтингов:
Мы уже работали над ИИ в нашем предыдущем файтинге — Shadow Fight 2, но из-за перехода в 3D, появления коллизий между игроками и добавления теневой формы мы смогли перенести только часть логики ИИ, а остальное пришлось создавать заново.
Если вы не делаете бота с помощью машинного обучения, я бы выделил два капитанских подхода:
Второй вариант звучит очень романтично: создается впечатление, что ты умнее всех и делаешь крутой ИИ, который нагибает игроков, а потом милосердно уменьшаешь сложность бота. С точки зрения разработки это может быть более удобным, т.к. можно заранее продумать все фичи поведения бота, которые понадобятся, и полностью представить себе его конечное поведение.
Разумеется, мы выбрали этот вариант, хотя потом поняли, что все не так просто: с нашим балансом анимаций, автоматическими блоками и разнообразием скиллов почти всегда можно найти нужные тактики и абузы, которые позволяют побеждать ИИ при высоком скилле. Поняли мы это не сразу, а лишь когда корректно замерили винрейт игроков на разных стадиях игры. Это при том, что для многих людей, судя по их отзывам на игру, бот действительно был непобедим.
Триггеры или правила поведения
Если выпустить такого бота против новичка, при равном уровне прокачки исход будет зависеть от оружия, которыми вооружены оппоненты. У кого быстрее анимации, тот и победит. Потому что, по сути, оба жмут на все кнопки, ну разве что бот делает это чуть более осмысленно.
Принятие решений
Логичный шаг улучшения ИИ — уменьшить рандом и добавить систему принятия решений, которая будет двигать бота к победе. Для этого нужно понять, какие решения являются правильными в каких ситуациях. Для файтинга есть две ситуации, которые случаются постоянно:
Решения тоже два:
Получается, что для победы ИИ должен прерывать вражеские удары своими контратаками, либо блокировать, если не может их прервать.
Мы сделали две группы решений, которые принимает бот: одна — если противник стоит, другая — если противник атакует. Чтобы ИИ знал, чем именно контрить, мы придумали таблицы коллизий.
Таблицы коллизий
Помните, как Доктор Стрэндж просматривал все возможные варианты исхода битвы с Таносом? Примерно так и работают таблицы коллизий: компьютер заранее просчитывает исходы для каждой атакующей анимации в игре на каждой возможной дистанции.
Если более подробно: мы запускаем удар мечом и одновременно с этим удар катаной, а затем смотрим, кто по кому попадет. Делаем эту процедуру для всех ударов в игре, на всех дистанциях и с задержками в разное количество кадров (запустил удар мечом, а противник через N кадров — удар катаной). Все результаты записываем в таблицы. Делаем мы подобную процедуру перед каждым обновлением и кладем получившиеся файлы после непростого алгоритма сжатия в готовом виде в билд, чтобы не съедать ресурсы девайса в рантайме. У игрока в клиенте уже есть список всех исходов, а значит ИИ знает, какой удар может сконтрить любой удар игрока на конкретной дистанции, либо понять, что прямо сейчас оптимальный выход — блокировать атаку.
В результате ИИ эффективно реагирует на действия игроков. То есть с контратаками разобрались. Теперь нужно научить бота самого атаковать оптимальным способом, а не рандомными ударами.
Выбор дистанции и правильного удара
Внимательный и интеллигентный читатель скажет: “Стопэ!!! Зачему вообще атаковать самому, если противник всегда в автоблоке? Надо ждать удара врага и наказывать его быстрым ударом, который прервет его атаку!”. Да, это так, но бот, который не двигается и не атакует без действий игрока, выглядит как минимум странно. ИИ должен уметь выбирать эффективные удары для начала атаки, даже если оптимальная стратегия — играть от контратак. Для этого мы разработали систему выбора выгодной дистанции и ударов.
Как мы размышляли: игрок чаще всего использует несколько любимых ударов, значит, бот специально будет делать те атаки, которые на выбранной дистанции не могут быть прерваны типичными ударами игрока. Для этого мы:
В теории звучит круто, но на практике получилось не так хорошо: игроки редко стоят без дела — они почти всегда жмут на кнопки и прессуют бота, поэтому бот чаще руководствуется системой принятия решений на основе атак игрока, вместо того чтобы проявлять инициативу. Так что выбор правильного удара работает лишь против пассивных игроков, зато выбор оптимальной дистанции улучшил контратаки — они стали более разнообразными, т.к. у бота больше вариантов выбора.
На этом этапе бот уже достаточно эффективен: знает, как лучше начать свою атаку, знает, когда контратаковать, а когда блокировать. Далее пойдет речь о системах, которые позволяют выставить необходимый уровень сложности и ослабить или усилить бота.
Обида и прощение
Это интересная концепция, которая лежит в основе нашей балансовой системы. Через нее мы создаем достаточный уровень сложности для новичков и профессионалов, а также мотивируем игрока использовать разные удары, что повышает интерес и зрелищность игры.
Суть концепции заложена в названии: бот обижается на удары игрока, которые тот повторяет из раза в раз. Обида — это счётчик, который уменьшает шанс на принятие неоптимального решения и увеличивает шанс, что ИИ проведет идеальную контратаку.
На другой чаше весов лежит прощение — бот начинает увеличивать шанс выбора неоптимальных решений и уменьшать шанс провести контратаку, если игрок перестаёт спамить и переключается на использование других ударов.
Если мы хотим сделать сложного бота, мы уменьшаем скорость прощения, а также ставим высокий уровень стартовой обиды, если хотим сделать слабого бота, все наоборот.
Задержка
У каждого бота в SF3 есть задержка при принятии решения. Это параметр, который заставляет бота делать паузу в N кадров перед выбором варианта действия. Полезная штука — позволяет создать видимость, что оппонент думает. Чем более простого бота мы хотим сделать, тем больше задержку ему выставляем.
Проверка условий
Чтобы сделать некоторые участки игры более эмоциональными, мы используем проверку состояний и отношений различных игровых переменных.
Мы можем заставить некоторых ботов не использовать метательное оружие на определенных дистанциях или уменьшить скорость прощения, если у игрока больше хитпоинтов, чем у бота, или сделать ИИ более агрессивным в случае, если у него мало хитпоинтов.
В общем, это надстройка, которую мы используем, чтобы генерировать ситуации, в которых бот резко меняет поведение и эффективность. При необходимости мы ограничиваем какие-то действия бота в различных ситуациях, например, боту сложнее сделать бросок, чем игроку, иначе игрок бы никогда не смог бросить бота, т.к. расстояния, на которых можно применить бросок, были бы одинаковыми, и бот просто бы успевал запустить свою анимацию раньше.
На основе всех вышеперечисленных механизмов мы создали 9 основных пресетов ИИ, которые используем в разных ситуациях и участках игры. Такой подход позволяет менять баланс точечно и замерять изменения.
Процесс создания тактики ботов был долгим. Перечисленные фичи мы вводили постепенно, поэтому иногда наши игроки страдали, а вслед за ними страдали мы, читая их отзывы и проклятия. Когда мы загрузили последние итерации правок, поток негативных отзывов относительно поведения противников прекратился, чем мы очень гордимся.
Наш опыт показывает, что дальнейшие улучшения бота при текущем подходе не дают ощутимого прироста качества. Поэтому мы начали работать над нейросетью, которая будет имитировать действия игрока.
На это решение нас наталкивает несколько вещей:
В команду Banzai Games требуется Deep learning researcher. Подробнее о вакансии можно прочитать здесь [5].
Автор: BanzaiGames
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/iskusstvenny-j-intellekt/330644
Ссылки в тексте:
[1] Image: https://habr.com/ru/company/banzai/blog/468023/
[2] Banzai Games: https://banzai.games/
[3] Shadow Fight: http://shadowfight3.com/
[4] Cascadeur: https://habr.com/ru/company/banzai/blog/462023/
[5] здесь: https://banzai.games/deep-learningr/
[6] Источник: https://habr.com/ru/post/468023/?utm_campaign=468023&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.