projectrtsunitygame developmentdevlogaibotsneural networksreinforcement learninggame designdifficulty

Дневник разработки #5: боты

5 октября 2026 г.
5 мин чтения

Когда я устроил ботам первый турнир, выяснилось, что три уровня сложности почти не отличаются по силе, а «лёгкий» бот нападал волнами в полтора раза крупнее, чем «сложный». Я сам этого не замечал: уровни просто гасили друг друга. Эта часть про ботов: как они менялись от скриптов до нейросетей и как игра теперь подбирает противника под игрока.

Дневник разработки #5: боты — 1

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

Первые боты

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

Командир с памятью

Поэтому я сделал командира, устроенного как игрок. Он видит только то, что видно игроку, туман войны действует и на него. Всё, что он заметил, он запоминает: где стоят здания врага, сколько там было юнитов и насколько он в этом уверен. Со временем уверенность падает, а если прежнее место видно и там пусто, оно помечается как проверенное. Свою армию он делит на группы, и у каждой группы есть план: миссия, цель, причина и срок. Группы не перетасовываются на каждом шаге, поэтому армия ведёт себя осмысленно. Между матчами он ещё и запоминает соперника, чтобы учитывать это в следующей партии.

Дневник разработки #5: боты — 2

Чтобы понимать, что бот делает, я сделал панель «ход мыслей». На скриншоте видно, что он сейчас видит и помнит, что учитывает, какие приказы отдал и какие у него планы групп. Когда что-то идёт не так, по ней понятно не только что бот сделал, но и почему.

Дневник разработки #5: боты — 3

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

Дневник разработки #5: боты — 4

На крупном плане видны линии и кольца: это цель одной из групп, куда она идёт.

Нейросети

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

Сначала сеть вообще не росла, и я долго думал, что дело в обучении. Оказалось, что в основном виноваты были правила, по которым играл сам командир. Партии между ботами в 70-80 процентах случаев заканчивались ничьей, потому что армии замирали. Все группы «присоединялись к атаке» на место уже разрушенного здания: каждая помогала другой, а цель у обеих была пуста. Армия не искала то, чего не видела, и здание, построенное после ухода разведчика, никто не находил. А самолёт, стоявший на аэродроме, сдвигал центр группы в угол базы, и тактик каждые восемь секунд командовал «собраться в центре»: армия десять минут ходила туда-обратно у себя на базе. После исправлений решённых партий стало около половины вместо двадцати-тридцати процентов.

В итоге лучшая сеть выиграла у бота на правилах 31 партию и проиграла 3, а у классического бота выиграла 44 партии и проиграла одну, остальные закончились ничьей. Интересно, чему она научилась: экономист стал чаще заказывать строителей, их доля в решениях выросла с 6,5 до 15 процентов, и здания у неё встают быстрее.

Турнир и лестница сложности

Когда настроек и сетей стало много, мне понадобилось понять, насколько сильны боты на самом деле. Первый турнир показал, что три прежних уровня почти не отличаются: «лёгкий» около 1360, «обычный» 1500, «сложный» 1572. Причина нашлась быстро: «лёгкий» нападал волнами в полтора раза крупнее обычных, а «сложный» только в три четверти от обычных, и они гасили друг друга.

Тогда я замерил, как на силу бота влияет каждая настройка: менял по одной и играл 36 партий против неизменного бота. Сильнее всего влияют число сборщиков ресурсов и размер волны атаки. Если сборщиков вдвое меньше, бот слабее на 263 пункта, а если волны крупнее в полтора-два раза, сильнее на 280. А суперoружие, апгрейды и потолок армии почти ничего не меняют, в пределах шума.

Дневник разработки #5: боты — 5

Поэтому лестницу я построил на трёх рычагах: доля сборщиков, размер волны и то, как часто командир смотрит на поле. Получилось двенадцать ступеней, и силу каждой я измерил турниром на 2304 партии: от 846 до 2071 по Эло. Тест проверяет, что сила растёт строго от ступени к ступени.

Бот под вас

Дальше самое интересное. Игра оценивает силу игрока по его матчам против ботов и подбирает бота такой же силы. Первые десять матчей идут на калибровку: по доходу и темпу производства игрока игра прикидывает его уровень, а потом уточняет по результатам. После этого сложность «Под меня» подстраивается по последним пяти матчам: растёт, когда вы побеждаете, и падает, когда проигрываете. Идея в том, чтобы бот выигрывал примерно в половине партий. В комнате с несколькими людьми сервер берёт среднюю силу людей. Бот при этом не видит сквозь туман и не получает бесплатных денег: его просто ослабляют или усиливают теми же тремя рычагами.

Что дальше

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