Шесть лет подряд мы (Mail.Ru Group) совместно с СГУ проводим Russian Ai Cup (соревнование по написанию игровых ботов). Придумываем игровой мир, пишем к нему API и сталкиваем лбами стратегии, написанные участниками. Выходит каждый раз довольно интересно, самобытно и вообще это крупнейший в СНГ ежегодный конкурс по ИИ!
Под этим же соусом мы осенью 2017-го года написали, запустили и провели первый контест на еще одной площадке, MiniAiCups, получился мини-клон Russian Ai Cup со своей странной атмосферой, правилами и механикой. Очень многим понравилось, и, после раздачи призов, мы, под шумок, обещали еще один конкурс. И наконец-то рады пригласить всех в нём поучаствовать.
Механика площадки
Существует игровой мир, живущий по определенным законам. Наружу из этого мира торчит API (просто текстовый протокол). В соответствии с этим API стратегия игрока, написанная на любимом языке, в цикле читает (просто из STDIN) изменения в состоянии мира и отправляет (просто в STDOUT) свои действия. Таким образом и происходит сама игра. Технические подробности — в конце поста.
Расписание
Все игры чемпионата будут проводиться в формате 4x1 (4 игрока в игре, каждый сам за себя). Игра может быть рейтинговой (влияет на расстановку игроков в рейтинговой таблице) и нерейтинговой (просто "дуэль", присмотреться к сопернику, потестировать стратегию, этакая песочница).
28 марта — открываем контест, начинаются нерейтинговые игры по 7500 тиков (тик — это одна неделимая единица времени в игровом мире)
2 апреля — старт рейтинговых игр по 7500 тиков (раз в несколько минут система будет стартовать несколько игр, выбирая участников по системе trueskill и начисляя очки по результатам)
19 апреля — TOP участников из песочницы проходят в финал, рейтинговые игры мы останавливаем и даем возможность создавать нерейтинговые игры по 25000 тиков
23 апреля — полностью останавливаем песочницу и проводим финал. Это будет множество игр по 40000 тиков, подбирать их мы будем так, чтобы в рамках игр 4x1 каждый сыграл с каждым. Потом дарим призы (о них ниже), все участники финала по традиции получают майки на память
26 апреля мы включим обратно песочницу с нерейтинговыми играми, и эта задача станет второй (вместе с осенней задачкой), которая останется работать вечно.
Вот так это будет. Мы постарались сделать так, чтобы между важными событиями конкурса было как можно больше выходных. Всё для вас.
Задача вкратце
А всё просто. Мы взяли agar.io, восхитились и решили сделать конкурс по механике сей замечательной игры. Сделали. Потом нам стало казаться, что слишком просто. Добавили инерцию при движении, немного физики… Всё ещё простовато. Окей, подумали и решили выставлять на каждую игру собственный набор коэффициентов инерции, ускорения, роста массы и всего того, что и составляет физику этого странного мира. На этом мы и остановились.
Таким образом, задача игрока сводится к тому, чтобы сначала разобраться с текущими физическими законами (либо всё на игровом поле летает пулей, мгновенно останавливаясь и разворачиваясь, либо ползает на инерции, норовя выйти куда-нибудь на орбиту). Ну а уже потом наступает такое милое сердцу "сожри-их-всех". Более подробные правила — ниже, после призов (да, есть призы).
Призы
За первое место дарим новый MacBook Air (или эквивалент по стоимости, у участника будет возможность выразить собственные пожелания).
Второе и третье места — Apple iPad
С четвертого по шестое место — Samsung Gear S3. Но, честно говоря, мы сами не знаем, что подарить, набросайте вариантов в комментариях. Мы ж сообщество.
По традиции, все, прошедшие в финал, получат майки с нашей символикой.
Правила чуть более подробно
Здесь я постараюсь неофициально описать правила так, чтобы донести суть механики чемпионата. Итак:
Игровой мир
Начнем с шок-контента — игровое поле у нас прямоугольное! Никто никогда так не делал, и вот опять :)
Отсчет координат начинается из левого верхнего угла. Каждый объект на поле обладает двумя координатами, массой и вектором скорости. Каждый объект — круг.
Коэффициенты
Перед стартом стратегия игрока вычитывает у игрового мира серию физических коэффициентов, в соответствии с которыми игровой мир будет жить. Это мера инерции, мера роста массы, максимальные скорости, и так далее. На каждую игру генерируем случайные величины (в определенных пределах).
Объект игрока, движение
В начале игры в мире рандомно (но симметрично от центральных осей) располагаются четыре игрока, представленные каждый своей выбранной стратегией. Масса у каждого пока небольшая, скорость нулевая. Пора двигаться, отжираться и расти, в этом и состоит суть победы. Указываем себе вектор движения (по сути, две координаты) и начинаем набирать скорость в соответствии с определенным в данной игре коэффициентом инерции, массы итп (всё это будет подробно описано в полных правилах на старте чемпионата). Вкратце, чем больше масса объекта, тем менее отзывчиво он реагирует на попытки придать ему импульс, кроме того, ограничивается максимальная скорость, которую он может развить.
Еда
Есть два способа увеличить собственную массу (а это нужно делать, так как игрок со временем эту массу теряет):
Во-первых, по игровому полю рассыпано некоторое количество "еды" — это небольшие неподвижные объекты, обладающие определенной массой. При перекрытии такого объекта, игрок добавляет массу такого объекта себе, а объект уничтожается. Время от времени на игровое поле добавляется еда (в рандомном месте, но равнозначно для четырех сторон поля).
Во-вторых, можно жрать друг друга. Если полностью перекрываются два игрока, то тот, который больше, добавляет себе массу того, который меньше. Съеденный же выносится с поля. Насовсем, до конца игры.
Звезды смерти
По факту, это вирус в терминологии agar.io. На карте случайным образом расположено некоторое количество "звезд смерти". Если игрок, уже превышающий массу звезды смерти, сталкивается с ней, то звезда смерти уничтожается. Игрока же разбрасывает взрывом на несколько более мелких частей (их количество, массы и импульсы зависят от многих параметров). После этого игрок управляет уже всеми этими объектами скопом (давая им вектор импульса в одну и ту же точку). В таком виде игрока легче сожрать, но скорость и отклик у более мелких объектов выше. При соприкосновении друг с другом части целого сливаются, так что можно и собраться обратно в нечто большое.
Деление, выброс массы
Кроме движения, стратегии игрока доступно еще два действия:
Деление. Каждая из подконтрольных игроку частей делится ровно на 2 части.
Выброс массы. Каждая из подконтрольных игроку частей выбрасывает небольшое количество собственной неуправляемой массы, направление которой считается по вектору скорости игрока. Получается этакий "выстрел едой". Если такая штуковина попадает в звезду смерти, то становится её (звезды) частью. "Перекормленная" звезда смерти выбрасывает свою часть в сторону, противоположную последнему выстрелу. Таким образом можно посплитить на части чужую слишком отожравшуюся стратегию.
Fog of war
Да, он есть. Видим не всё. Считается эллипсом, с учетом направления движения, зависит от множества параметров (размер группы, массы частей в группе, скорость). В целом, fog of war получился эм… весёлым.
Выбор победителя
В течение всей игры игроки так или иначе набирают игровые очки (начисляющиеся по игровым событиям). По этим очкам и присуждается победа в конце игры.
Если трое из четырех стратегий погибают, то игра может досрочно остановиться в тот момент, когда оставшийся выберется в top1 по очкам.
Технические подробности
В данный момент мы работаем с Go 1.10, Java 1.8, C# Mono 4.3, NodeJS 6, C++11, Python 2.7/3.5, php7. Кроме того, мы постарались максимально упростить добавление новых языков — нам понадобится лишь dockerfile по определенному шаблону, если вы захотите, чтобы ваш любимый язык XXX появился в списке поддерживаемых.
Максимальный объем исходного кода для одной стратегии — 20 мегабайт в архивированном виде в данный момент.
Если вы хотите, чтобы в списке уже поддерживаемых языков появились какие-либо библиотеки, нужные вам (мало ли, кто-то решит упороться в ML) — пишите в каментах, поставим всё, что успеем до 25 марта (впрочем, в ходе чемпионата будем по возможности продолжать наполнять docker-образы для ЯП).
Полные правила на старте чемпионата откроются в этом репозитории.
Изменения с прошлого чемпионата
Конечно же, мы не сидим на месте. С прошлого чемпионата:
- Был разработан правильный
localrunner
(написали на C). - Симуляция тоже на C, обсчет стал быстрее по сравнению с python-ом, который был в первом конкурсе
- Были добавлены debug-виджеты для дебага игр на сайте (начнется конкурс — увидите)
- Переработана схема запуска решений, теперь отдельное решение просто общается с STDIN и STDOUT, без необходимости держать локальный tcp-сервер. Мы делаем это за вас.
- Добавились всякие мелочи вроде оценок рейтингом и комментариями отдельных игр, правильного шаринга игр и рейтинга в соцсети… кнопочки, ссылочки, короче, вот этот вот весь вебчик
- Новые языки стало добавлять значительно проще, как для участников, так и для нас
Дизайн, меж тем, тот же. Мы решили окончательно притвориться, что мы так видим… :)
Погнали?
Регистрироваться можно уже сейчас на сайте aicups.ru, официальная группа чемпионата — @aicups, официальный канал для тех, кто не хочет в группу — @mrgchamps. Ждем вас, будет весело!