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

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



Сейчас мы пилим одну игру, в которой вы как в 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.7K поста22.1K подписчиков

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

ЗАПРЕЩЕНО:

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

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

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


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

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

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

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

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

Автор поста оценил этот комментарий
можно сотворить нейронного бота, который расшифровывает врачебные каракули?
раскрыть ветку (1)
6
Автор поста оценил этот комментарий

Это однозначно интересная идея, но думаю легче создать сеть, которая сама диагнозы ставить будет и выписывать эти самые лекарства, что в принципе уже есть. Результатом сеанса будет распечатанные каракули с QR-кодом в углу листка, чтобы при показе в аптеке можно было просто считывать информацию :D

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

На Сях игруля?

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

Не понял вопроса. Но вот если бы этот вопрос звучал бы "на чем?", я бы ответил на Unity, а яп C# :D

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

Можно больше технических подробностей?
В каком виде скармливал данные боту, например?

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

Конечно, в ближайшее время постараюсь расписать подробней, как это реализовано.

показать ответы
2
Автор поста оценил этот комментарий
До-диез - не интересно) думал, Вы мл и нейронки на сях пишете) Было бы хардкорно
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

а, теперь понял :D Да чет студенческие годы прошли, где я пытался писать игры на скриптовых языках, типа AutoIT, тот еще хардкор, учитывая что окна внутриигровые, это были обычные виндовые. Сейчас как-то результат важен и скорость его "достигания" :D

PS я не сравниваю С со скриптовыми, я просто привел пример хардкора )

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

мы все еще ждем 😁

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

оу, был пост, где я чуть подробней расписал как это все работает -

https://pikabu.ru/story/podrobnyiy_razbor_neyroseti_dlya_nas...


И еще был пост, где я использовал данную "сеть" для тренировки игры в Tower Deffense - https://pikabu.ru/story/neyronnaya_set_teper_i_dlya_tower_de...

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

Сейчас занимаюсь активно дата сайенсом, и ахуеваю от того, насколько решения через приложения, написанные на сях, быстрее нативного кода на том же питоне. Например: Sed, Awk, XARGS, башевые команды в юниксовом КЛИ... Отсюда и интересно, насколько профитнее было бы нативно на сях писать машин лёрнинг и нейронки.

Тем не менее, успехов Вам)

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

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

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

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

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

ну, пока что прям оп комбинаций нет, есть мелочные, которые бот, будучи в текущем состоянии понял.  На пример, у нас бой происходит в 3 линиях и у карты есть способность "убить противника напротив себя" и вот бот часто ставит сильно существо и прикрывает его слабым, меня это слегка удивило )

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

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

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

Ну вот на подобие такой "заскриптованности" я и имел ввиду. Т.е. бот будет иметь набор правил, которые сам понял, и те, которые я ему запишу. Пока что я пробую просто в какой-то мере менять у разных ботов разные нейроны, т.е. задавая фейковую ценность.

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

Тут проблема в том, что если ты делаешь нейросеть бота для ККИ, то ты или должен обладать большим количество тестеров, которые будут обучать бота, или полностью разбиратся в ньюансах ККИ.

Основываясь на указанной выше ситуации, можно еще такой вариантец, что есть карта существа, а есть всем нанести по 3 урона, при этом у существа меньше или равно 3 хп и есть абилка, что при смерти он наносит 3 урона случайному существу врага. У вот тут выбор сначала скастовать заклинание, а потом выложить существо, т.е. оставить существо на столе,или наоборот и наснести больше урона противнику, но при этом имеется возможность на ближайшие ходы остаться без существ вообще.

Да и вообще, как по мне, так ККИ в подобном плане намного сложнее современных стратегий и возможно даже логических игр, ибо вариативность действий и их последовательностей зашкаливает.

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

Ну так-то да, в ККИ порядок выставления карт порой приводит к совершенно разным результатам, в плоть до победы/поражения. Но в моем случае, этот бот хорош для тестирования механик и в дальнейшем для доработки его, с помощью искусственных ограничителей, до противника для игрока. Вся его прелесть в том, что база создана была относительно быстро и боюсь что КПД его в дальнейшем будет размазываться очень сильно по временной шкале, я имею ввиду, что за первые 3 дня я вынесу больше полезности, чем за следующие 3 дня. И сейчас он играет любопытно, т.е. некоторые его действия выглядят очень даже интересными, а мы делаем игру, в которую будет хотеться играть, а не зайти пару раз пострадать и выйти.

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

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

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

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

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

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

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

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

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

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

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

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

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

Такая уже есть. IBM watson называется.

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

Да, я же написал, что такое уже есть, просто название не помнил.

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

Довольно странно.

По логике он должен смотреть все комбинации с учётом имеющихся карт, а не с одной карты.

К примеру будет карта урон 3 всем существам (включая своих), и ещё на руке карта существа. Допустим, что выложить существо ценнее, чем разыграть карту урона. Тогда он выложит существо, а потом к примеру разыграет карту урона и ударит своё существо, а мог бы начать с карты урона и т.д.

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

Для упрощения надо разделять карты на типы: существо, способность и т.д.

Для карт поздней игры надо искусственно снижать стоимость эффективности действия.

К примеру превращение любого существа в овцу с 1 ХП будет куда лучше на позднем этапе, а если слить на старте, то это будет не очень хорошо.

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

Ну у карты которая делает что-то с чем-то, убивает, наносит урон и т.д. помимо записи "Я использую 'урон по всем'" в действие добавятся нейроны "нанес 3 урона своему", "нанес 3 урона врагу" и соответственно он, в поздней стадии своего развития, не станет так делать. Но вот именно порядок будет сбит, это скорее всего верно, но в случае если на столе будут только существа врага, то у бота ценность нанести урон будет выше, чем поставить существо.

показать ответы