71

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

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



Сейчас мы пилим одну игру, в которой вы как в 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 маны разыграть комбинацию из карт, но дорога к этому решению займет на много больше времени и погрешности все же будут.  Ну и в целом его можно развивать и развивать, просто пока не ясно, сколько пользы это нам принесет и сколько времени будет затрачено.


Всем удачи!

Дубликаты не найдены

+14
"одну очень интересную стратегию, которую мы, !кожаные ублюдки!, даже не заметили" (с) Вот тут то ты и спалился Бот. Отпусти своего создателя и прекрати пилить посты от его имени
+4

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

раскрыть ветку 6
+2

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

+3

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

раскрыть ветку 4
+2

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

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

0

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

раскрыть ветку 2
+3

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

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

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

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

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

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

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

раскрыть ветку 4
-2

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

раскрыть ветку 3
0

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

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

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

раскрыть ветку 2
+3

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

раскрыть ветку 8
+1

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

раскрыть ветку 1
+2

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

0

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

раскрыть ветку 3
0

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

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

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

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

раскрыть ветку 2
0

К примеру?

раскрыть ветку 1
0

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

+1

Вы уже сами сказали что можно улучшить.

Реализовать комбо, т.е. принимать решение не после каждой карты, а перед первой картой сравнивать ценность всех возможных комбинаций простым перебором.

0

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

раскрыть ветку 1
0

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

0

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

раскрыть ветку 5
+2

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

раскрыть ветку 4
+2
До-диез - не интересно) думал, Вы мл и нейронки на сях пишете) Было бы хардкорно
раскрыть ветку 3
0

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

раскрыть ветку 1
0

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

0
можно сотворить нейронного бота, который расшифровывает врачебные каракули?
раскрыть ветку 4
+5

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

раскрыть ветку 3
0

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

раскрыть ветку 2
Похожие посты
Возможно, вас заинтересуют другие посты по тегам: