Седьмого ноября официально стартовала неделя бета-теста Russian Ai Cup 2017. Чемпионат ежегодный, и в этом году мы решили предложить участникам проект под названием CodeWars — конкурс по программированию ботов для игры, которую сами участники сходу окрестили «симулятором игрока в RTS». Бета-тест подошел к концу, чемпионат официально стартовал, и под катом мы хотели бы отчитаться, поделиться новостями о том, что же мы теперь можем предложить. Ну и еще раз зазвать всех поучаствовать, не без этого конечно.
Коротко о чемпионате
На всякий случай, коротко о соревновании для тех, кто не в курсе — немножко правил в свободной форме. Каждый год мы пишем игру определенного жанра, даём всем желающим написать для этой игры бота с определенной стратегией поведения внутри, и запускаем этого бота в песочницу, где он время от времени бьется с другими такими же. Правила игры постепенно усложняются, после отбора лучших стратегий среди них проводится серия раундов «каждый-с-каждым». В результате самые крутые получают призы (2 макбука, умные часы, айпад, вот это всё). Не самые крутые тоже получают довольно много ништяков — майки, толстовки с нашей символикой, почет и уважение. Сами бои можно как смотреть прямо на сайте, так и запускать в дебажном режиме локального визуализатора, который мы предоставляем.
Ну а в этом году у нас подобие RTS. Есть карта конечных размеров, на этой карте в каждом углу зеркально расположены 500 юнитов техники разного типа:
- Танк и БМП — наземные юниты, первый эффективен против наземных же, второй — против атаки с воздуха;
- Вертолет и Истребитель — воздушные юниты, первый для обстрела наземных, второй для воздушных боев;
- БРЭМ — ремонтная бригада. Иными словами, «доктор».
Конечно, юниты отличаются довольно сильно по целому ряду параметров — скорость, радиус атаки, радиус разведки, атака, защита и так далее. Карта же, помимо прочего, размечена разными типами местности и погодой (местность влияет на скорость передвижения и видимость на земле, погода — в воздухе). Задача на первый взгляд довольно проста — уничтожить всех юнитов соперника, выжить самому. Отличие управления от традиционных RTS здесь в том, что практически отсутствует микроменеджмент:
- Юниты атакуют друг друга автоматически при сближении, и каждый из них сам выбирает для себя цель. Назначить цель атаки отдельному юниту вручную нельзя.
- У стратегии игрока есть возможность отдать приказ группе юнитов каждые N тиков (всего игра длится 20000 тиков). Всё остальное время войска выполняют данные ранее приказы. Таким образом, выбирать отдельный юнит и отправлять куда-либо по сложной траектории довольно расточительно.
Все эти ограничения были введены нами специально, чтобы увидеть военно-стратегическое планирование, а не серию микробоёв. В целом, получилось отлично, об этом дальше.
Результаты тестирования, или что мы теперь умеем
Традиционно, Russian AI Cup всегда начинается неделей бета-теста: участники пробуют что-то наваять на предоставленном нами API, нахваливают или ругают как механику игры, так и это самое API. Чаще ругают, конечно, у нас свои традиции — «раньше было лучше», «сейчас так себе» и «всё слишком сложно».
Мы же, в свою очередь, спешно извиняемся за найденные баги, правим их, стараемся поменять баланс так, чтобы стало действительно интересно, и добавляем в поддержку новые языки программирования. Кроме того, зачастую на этом этапе мы, наряду с правками баланса, добавляем в механику игры какое-то количество новых фич. Этот год не стал исключением.
Увеличение количества действий в секунду
С самого начала мы слегка промахнулись с количеством CPS, разрешенным для участников. На старте бета-теста мы давали стратегиям 6 действий в секунду (изначально было три типа действий: выделение группы, движение её по вектору или поворот вокруг заданной точки). Оказалось, что этого совершенно недостаточно для построения сколько-нибудь грамотной стратегии для нападения или обороны. Всё, что участники успевали сделать до первого выстрела — это либо отправить истребители в атаку, либо тоскливо сжаться в ожидании удара. В итоге мы уменьшили кулдаун в два раза, чуть понерфили скорость истребителей, стало гораздо лучше. По крайней мере, появились осмысленные построения.
Четвертый тип действия — SCALE
Поскольку у юнитов нет своей реализации поиска пути, для первопроходцев было совершенно невозможно построить смешанный отряд из разных типов юнитов, они просто упирались друг в друга и не желали двигаться дальше. Эту проблему мы решили введением нового типа действия — SCALE. Грубо говоря, берем отряд юнитов и приказываем им «отмасштабироваться» на заданный коэффициент — либо сомкнуть ряды, либо наоборот, разомкнуть. Таким образом, у участников появилась возможность взять два любых отряда, приказать каждому из них «немного разойтись» и составить из них одну смешанную дивизию (танки + вертолеты, БМП + истребители, да всё, что угодно).
Получающиеся в результате отряды участники сходу окрестили «бутербродом».
AOE — Nuklear Strike!
Когда мы планировали будущие бои, мы представляли себе что-то вроде серии игр Total War, StarCraft, C&C и иже с ними — умную тактическую битву стройных рядов техники, отход-наступление и прочие красоты подобных игр. Реальность в самом начале бета-теста нас слегка обломала: топовой стратегией оказалось просто смешать всё, что есть у игрока, в одну большую кучу (из небольшой комбинации MOVE и ROTATE) и отправить получившийся «ком» валить всё, до чего он дотянется. Честно говоря, ни нас, ни первых участников это совершенно не устраивало — хотелось красивого ИИ и разнообразия тактик. В результате появился ядерный удар — берём одного из юнитов, назначаем наводчиком ракетного удара, и пока этот юнит жив, можем бить по площади в радиусе видимости от него.
Конечно, на это действие есть довольно большой кулдаун, да и урона оно наносит не так много. Но, тем не менее, завалить противника просто захардкоженой кучей юнитов больше нельзя — нужно обучать ИИ новым приемам — разведка, запуск наводчиков, расстредоточение в случае опасности. Короче, стало намного веселее, бои стали интереснее, а стратегии участников — разнообразнее.
Эволюция стратегий
Чтобы иметь более-менее наглядное представление, что и как у нас пишут, вот небольшая подборка того, чему ребята успели обучить свои стратегии на данный момент. В почти хронологическом порядке.
Просто бежим вперед
Это то, что писалось в самом начале, так сказать осваивание управления (ну и засылка тестовой стратегии, которую мы предоставляем сами).
Как видите, толку особо никакого.
Ком ярости
В определенный момент, еще до введения дополнительных типов действий и увеличения общего их количества, участники поняли, что можно несколько раз рандомно повернуть изначальные отряды, двинуть их друг к другу и сформировать вот такой мини-смерч:
До введения ядерного удара он неплохо рулил. В некоторых вариациях (с более умным построением и передвижением) рулит и сейчас.
Бутерброд
SCALE позволил строить более умные дивизии из замиксованных друг к другу разных типов войск. Например, вот такие:
Вариантов построения масса, на любой вкус и цвет. Эффективность таких штук, естественно, нужно считать. Зачастую она (эффективность) напрямую зависит от того, что успел построить противник.
Наводка ядерного удара
Выглядит это довольно впечатляюще:
Пока одна из стратегий строится, вторая уже формирует отряд «наводчиков» и буквально через пару секунд прилетает первый истребитель, наводящий на строящуюся формацию «ядерный удар». Тактика защиты здесь может быть самая разная, от перехвата до мгновенного разделения на несколько формаций.
Рой
Довольно красивый тип тактики, жаль gif не может в полной мере передать красоту такого построения:
По миникарте четко видно, что стратегия успешно управляет целой ордой разрозненных отрядов, путая и изматывая единственную формацию противника как обычной атакой, так и ядерными ударами. Управление таким количеством отдельных отрядов при существующих ограничениях требует неплохой алгоритмической подготовки. Впрочем, потенциал у таких тактик, кажется, неплох.
Партизанский бой
Очень остроумное использование SCALE — наводняем всю карту «партизанскими» одиночными отрядами (видно по миникарте), и каждый из них может быть наводчиком для ядерного удара.
Передвижение дивизии противника превращается в ходьбу по минному полю, с соответствующим результатом. Впрочем, кажется, что это должно элементарно перебиваться простейшей разведкой — одиночные юниты гибнут почти мгновенно.
На самом деле различных стратегий атаки и защиты намного больше, но подавляющее их большинство невозможно нормально показать гифками (да и пост и так уже довольно тяжелый). Можно просто полистать игры топов здесь.
Бета кончилась — а что теперь?
А теперь всё серьёзно!
Бета-тест чемпионата прошёл вполне успешно, рейтинг в песочнице был сброшен, теперь участникам предстоит каждому написать ИИ, способный вырваться вперёд и поучаствовать в следующих раундах.
Раунд 1
Через 9 дней 1080 лучших стратегий будут отобраны для участия в первом раунде. Победители раунда получат возможность попасть в раунд 2 и в финал. Кстати, лучшие 60 из оставшихся в песочнице, все равно попадут во второй раунд — шанс должен быть всегда.
После первого раунда в игре появятся здания. Захватывая их, можно будет либо производить технику по выбору игрока, либо увеличивать количество действий, доступных в игре.
Раунд 2
Эта серия боёв состоится 9-10 декабря, и в неё попадут лучшие 300 стратегий из первого раунда и лучшие 60 стратегий из песочницы. Битвы будут за возможность попасть в финал. Те, кто не не выйдет из второго раунда, все равно будут иметь шанс, если займут первые 10 мест в песочнице.
Все участники второго раунда получают майки с нашей символикой. После второго раунда в игре появится туман войны. Придется учить ИИ таким действиям как разведка и отлов шпионов.
Финал
16-17 декабря лучшие 50 из раунда 2 и лучшие 10 из песочницы будут биться за финальные призы — MacBook Pro, MacBook Air, Apple iPad, Samsung Gear s3, WD My Cloud 6TB, WD My Passport Ultra 4TB. Кстати, TOP-6 песочницы, не прошедшие в финал, получат WD My Passport Ultra 2TB. Кроме того, все участники финала получают толстовки с нашей символикой.
О поддерживаемых языках
Стараемся включать всё, до чего дотянемся (и всё, что нам присылают сами участники). Начинали мы с таким набором: C#, C++, Java, Python2, Python3, Pascal, Ruby.
Во время бета-теста добавили: D.
Сейчас добавлены дополнительно: Kotlin, Scala.
На очереди: Swift, Go, Rust, Nim.
Похоже, список будет пополняться. Кроме того, сегодня мы рассчитываем поддержать еще один язык — английский. В том смысле, что правила почти переведены, и скоро будут выложены на сайт в англоязычной редакции.
А я еще успею поучаствовать?
Ну а зачем бы я тут всё это писал? Официальная часть чемпионата только-только началась, она продлится вплоть до середины декабря и присоединяться можно на любом этапе. Зарегистрироваться можно здесь, там же элементарно ищутся полные правила, гайды, стартовые стратегии, форум, языковые пакеты и многое другое.
Чемпионат очень активный, в Telegram можно найти официальный чат, официальный канал и неофициальный канал, организованный самими участниками (от них же кстати есть неофициальный визуализатор и куча других инструментов, за что им огромное спасибо). В ВК есть группа по всем нашим чемпионатам.
Короче, го к нам, у нас тут интересно. Без поддержки не останетесь — всегда можно задать вопрос мне лично как организатору соревнования — sat2707 во всех официальных и неофициальных чатах/группах/где угодно.
P.S. Было бы не правильно не выразить благодарность сообществу за поддержку и помощь (и за многие картинки в этом посте). Парни, вы огонь, так держать!
Автор: sat2707