Нейронные сети в геймдеве

Привет, пикабу. Сегодня я хотел бы вам рассказать о реализации небольшой нейросети для нашей игры и какую пользу или вред она нам принесла.



Сейчас мы пилим одну игру, в которой вы как в hearthstone/Gwent должны выкладывать существ с разными способностями и противостоять своему врагу. Это краткий экскурс по базовой механики игры, более я пока рассказывать не буду, т.к. тема пойдет не об этому. Так вот,одним пятничным вечером, а в дальнейшем и выходными, мне захотелось попробовать написать бота для нашей игры, т.к. все базовые версии игры мы тестировали в ПвП, а игра пока-что является исключительно ПвЕ. Ну рано или поздно мне бы пришлось это делать,но вместо заскриптованного ИИ, мне захотелось попробовать в роли оппонента самописную нейронную сетку.


Итак, с чего я начал. Я создал некое хранилище нейронов, у которого есть функции по записи/чтению нейронов. Каждый нейрон имеет запись действия и ценность/вес, кому как удобней.  Бот может обратиться к хранилищу, указать действие и получить его ценность, если оно было записано ранее, или 0 в случае, если такого еще не происходило. Далее я рассказал боту, что у него есть его мана, есть существа, у них есть способности, напр. убить вражеское существо, Т.е. буквально, как нового игрока, я провел бота по всем механикам игры, и рассказал что каждое действие означает. И немного помог ему с ориентированием в этом. Т.е. при начале хода бота, он анализирует свою руку, а точнее карточки в ней. Пробегаясь по каждой карточке, бот смотрит, может ли он ее сыграть, если да, то как и к чему это приведет. Подробнее это выглядит так - если бот может сыграть карту, то он создает действие "Разыграть X карту, за N маны, сейчас у меня M маны". У каждого действия есть своя ценность, т.е. при создании его бот смотрит своё хранилище, если там уже совершалось подобное действие, то его ценность присваевается только-что созданному. Далее, бот смотрит на таланты этой карты, если, допустим, у карты свойство "Убить цель", тогда бот просматривает варианты, кого он может убить, выбирает самое ценное убийство, опять же перебирая варианты через свое хранилище, и добавляет ценность убийства к стартовой цене текущего действия. На пример на 3 ход, у бота 3 маны, у него есть карта за 2 маны, со своими статами и эффектом убийства он видит действие, ценность которого равна 3("Разыграть эту карту, за 2 маны, когда у меня 3") + 6("Убить супер-мутанта") = 9. Далее это действие заносится в пул из которого, после всех расчетов, бот будет выбирать что же ему сделать.


Далее бот выбирает из всего списка самое лучшее действие, а в случае, если их несколько(Я добавил погрешность, чтобы бот не совершал постоянно "идеальные" ходы, а иногда и экспериментировал), то берет случайное из лучших(то действие, у которого ценность выше) и совершает его. И если после хода, осталась мана, то смотрит, может ли он сделать еще что нибудь(в действиях так же есть "ничего не делать", на что бот уже поставил свою ценность). В дальнейшем у меня храниться список всех действий и нейронов, задействованных в данной партии, и в зависимости от нанесенного урона врагу и исцеленного здоровья своему герою, ценность этих нейронов повышается на модификатор, в моем случае я поставил, что за 1 ед. нанесенного врагу или исцеленного себе урона повышает ценность всех сыгранных нейронов на 0.1, в то же время при получении урона или же позволению врагу себя лечить "вес" нейронов так же падает на 0.1 за 1 ед. В конце партии, если бот побеждает, он добавляет 10 ценности каждому нейрону, задействованному в этой партии или же отнимает 10, если проиграл.


Ну и после этого всего, я посадил бота играть против себя же и попивая чай, наблюдал за логикой бота, его действиями и т.д.(Уж очень я люблю все эти искусственные интеллекты, пару раз даже для игр жанра ммо и моба писал ботов, но исключительно для себя, ради спортивного интереса)


По окончанию выходных я имел на руках противника для игры(которого мы решили немного все же заскриптовав, оставить в игре) и одну очень интересную стратегию, которую мы, !кожаные ублюдки!, даже не заметили(благодаря которой бот успешно выигрывал другого "себя" и меня), ну а так же бот "указал" на некоторые слабые места в балансе и геймплее.


Теперь же, вводя новые механики, мне не приходиться играть самому или отвлекать кого-то, для тестирования и ловли багов, а я могу их тестировать с ботом, параллельно обучая его.


Ну и в конце хотелось бы написать такие заметки, как бы для меня, но и для вас. Что бы я хотел улучшить? Сейчас бот просматривает каждую карту отдельно, потом разыгрывает лучшую и снова просматривает карты. Т.е. у бота отсутствует понимание механики "комбо-хода". На пример, у бота есть карта за 5 маны с ценностью в 50 и 3 карты за 1, 2, 2 маны и ценностями 15, 30, 20, соответственно, и бот конечно же сходит картой за 5, т.к. разовая ценность этого действия будет больше остальных. По сути, бот может прийти к решению на 5 маны разыграть комбинацию из карт, но дорога к этому решению займет на много больше времени и погрешности все же будут.  Ну и в целом его можно развивать и развивать, просто пока не ясно, сколько пользы это нам принесет и сколько времени будет затрачено.


Всем удачи!

Лига Разработчиков Видеоигр

6.6K поста22.1K подписчиков

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

Вы смотрите срез комментариев. Показать все
3
Автор поста оценил этот комментарий

Когда уже для npc в играх с открытым миром начнут применять нейросети))

раскрыть ветку (8)
2
Автор поста оценил этот комментарий

что бы они в итоге поработили весь игровой мир? думаешь им по приколу? их убивают ради прикола,  их заставляют давать идиотские квесты, и расплачиваться за них золотом или даже эпичным лутом (собери цветочки вокруг дома и получи меч телепортации, например). они просто соберутся, решат что это их мир, и начнут избавляться от игроков. хорошо, если только в своем, игровом мире. а если выйду за пределы игры?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

это было бы шикарно)) ходит слух, что наш мир - это компьютерная симуляция, т. к. многие процессы очень детализированы при ближайшем рассмотрении, но при отсутствии наблюдателя они ведут себя по-другому и обрабатываются намного проще. Так что, возможно, мы тоже являемся npc, но выйти за пределы своей симуляции мы никак не сможем))

DELETED
Автор поста оценил этот комментарий

К примеру?

раскрыть ветку (1)
Автор поста оценил этот комментарий

ответил комментом выше)

1
Автор поста оценил этот комментарий

Есть мод к Skyrim, где npc думают используя вроде бы нейросеть. Т.е. один NPC может перестать разговаривать с игроком, если тот заведет положительные отношения с врагом этого NPC, ну и так далее.

раскрыть ветку (3)
Автор поста оценил этот комментарий

ну это звучит оочень простенько, хотя, думаю стоит посмотреть)

Я имел в виду разные амбиции, характеры и прочее, что будет отличать одного персонажа от другого. Можно было бы начать с чего-то очень примитивного, вроде описанного бота. Те же веса, только характерные черты персонажа должны уменьшать или увеличивать ценность действия, взависимости от типа этого действия (напр. физическое воздействие, если у персонажа предрасположенность, будет применяться чаще, а для другого перса лучшим выбором будет разовор).

Вообще интересно, насколько реально одну нейросеть обучить так, чтобы получились разные характеры, есть ли примеры. Те же идеи можно было бы применить в глобальных играх.

Я тут делаю стратегию вроде цивилизаци (только с бесконечным миром) и сейчас перехожу к геймплею. Вот, спрашиваю себя, как можно написать ИИ для фракций, чтобы каждая из них руководствовалась своими глобальными целями и совершала так сказать обдуманные поступки.

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Для разности характеров и т.д. лучше использовать, как по мне, эволюционный алгоритм. С помощью этих алгоритмов можно выстроить несколько настроек, которые будут отличны друг от друга. Но проблема всегда одна, в свободном плавании, без вмешательства человека, такие алгоритмы в итоге придут к идеальному одному решению, тут то человек и добавляет уже свои коэффициенты, дабы получить искомый результат.

раскрыть ветку (1)
Автор поста оценил этот комментарий

спасибо за наводку, гляну. Пока поискал, нашел варианты, где объеденены нейросети и такие алгоритмы. Правда пишут, что очень большие мощности нужны

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку