Открытое соревнование по программированию искусственного интеллекта

Правила

Проект

Песочница

Раунд 1

Раунд 2

Финал

Песочница (на 10 января 2021 г.)

Последние комментарии

30 мая 00:19: vedij30399 написал комментарий в посте Призы и подарки
30 мая 00:18: vedij30399 написал комментарий в посте Призы и подарки
30 мая 00:09: vedij30399 написал комментарий в посте Призы и подарки
30 мая 00:04: vedij30399 написал комментарий в посте Призы и подарки
30 мая 00:03: vedij30399 написал комментарий в посте Призы и подарки
30 мая 00:02: vedij30399 написал комментарий в посте Призы и подарки
30 мая 00:01: vedij30399 написал комментарий в посте Призы и подарки
30 мая 00:01: vedij30399 написал комментарий в посте Призы и подарки
30 мая 00:00: vedij30399 написал комментарий в посте Призы и подарки
29 мая 23:59: vedij30399 написал комментарий в посте Призы и подарки

Группа ВКонтакте

Telegram-чат

Discord

 

Вы можете либо скачать правила в формате PDF, либо прочитать их тут, либо в репозитории на GitHub. В них изложен формат проведения турнира, дано описание игрового мира и технических характеристик объектов.

Текущая версия:

  • 9 декабря: 1.2.0.

Также, чтобы проверить аспекты игровой механики, вы можете попробовать поиграть.

О CodeCraft 2020

Общие положения игры и правила проведения турнира

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

Турнир проводится в несколько этапов (**Раунд 1**, Раунд 2 и Финал), которым предшествует квалификация в Песочнице. Песочница — соревнование, которое проходит на протяжении всего чемпионата. В рамках каждого этапа игроку соответствует некоторое значение рейтинга — показателя того, насколько успешно его стратегия участвует в играх.

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

Начальное значение рейтинга на каждом основном этапе турнира равно 0. За каждую игру участник получает определённое количество единиц рейтинга в зависимости от занятого места (система, аналогичная используемой в чемпионате “Формула-1”). Если два или более участников делят какое-то место, то суммарное количество единиц рейтинга за это место и за следующие количество_таких_участников - 1 мест делится поровну между этими участниками. Например, если два участника делят первое место, то каждый из них получит половину суммы единиц рейтинга за первое и второе места. При делении округление всегда совершается в меньшую сторону. Более подробная информация об этапах турнира будет предоставлена в анонсах на сайте проекта.

Сначала все участники могут участвовать только в играх, проходящих в Песочнице. Игроки могут отправлять в Песочницу свои стратегии, и последняя принятая из них берётся системой для участия в квалификационных играх. Каждый игрок участвует примерно в одной квалификационной игре за час. Жюри оставляет за собой право изменить этот интервал, исходя из пропускной способности тестирующей системы, однако для большинства участников он остаётся постоянной величиной. Существует ряд критериев, по которым интервал участия в квалификационных играх может быть увеличен для конкретного игрока. За каждую N-ю полную неделю, прошедшую с момента отправки игроком последней стратегии, интервал участия для этого игрока увеличивается на N базовых интервалов тестирования. Учитываются только принятые системой стратегии. За каждое “падение” стратегии в 10 последних играх в Песочнице начисляется дополнительный штраф, равный 20% от базового интервала тестирования. Интервал участия игрока в Песочнице не может стать больше суток.

Игры в Песочнице проходят по набору правил, соответствующему правилам случайного прошедшего этапа турнира или же правилам следующего (текущего) этапа. При этом чем ближе значение рейтинга двух игроков в рамках Песочницы, тем больше вероятность того, что они окажутся в одной игре. Песочница стартует до начала первого этапа турнира и завершается через некоторое время после финального (смотрите расписание этапов для уточнения подробностей). Помимо этого Песочница замораживается на время проведения этапов турнира. По итогам игр в Песочнице происходит отбор для участия в Раунде 1, в который попадут не более 1080 участников (если участников меньше, пройдет максимальное количество, кратное 4) с наибольшим рейтингом на момент начала этого этапа турнира (при равенстве рейтинга приоритет отдаётся игроку, раньше отправившему последнюю версию своей стратегии), а также дополнительный набор в следующие этапы турнира, включая Финал.

Раунд 1, как и последующие этапы, состоит из двух частей, между которыми будет небольшая пауза (с возобновлением работы Песочницы), позволяющая улучшить стратегию. Последняя отосланная стратегия перед началом каждой части выбирается для игр в соответствующей части. Игры проходят волнами. В каждой волне каждый участник играет ровно одну игру. Количество волн в каждой части определено способностями тестирующей системы, но гарантируется, что их будет не меньше десяти. 300 участников с наибольшим рейтингом проходят в Раунд 2. Также в Раунд 2 проходят дополнительные 60 участников с наибольшим рейтингом в Песочнице (на момент старта Раунда 2), среди тех кто не прошел по результатам Раунда 1.

По результатам Раунда 2 50 лучших стратегий пройдут в Финал. Также в Финал проходят дополнительные 10 участников с наибольшим рейтингом в Песочнице (на момент старта Финала), среди тех кто не прошел по результатам Раунда 2.

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

Все финалисты сортируются по неубыванию рейтинга после окончания Финала. Если рейтинг одинаковый, более высокое место получает тот, чья стратегия была отправлена раньше. Призы по итогам Финала раздаются в соответствии с такой сортировкой.

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

О тестировании и ограничениях стратегии

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

“Упавшая” стратегия больше не может управлять действиями своего игрока. Стратегия считается “упавшей”, если:

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

  • Стратегия превысила одно из ограничений по времени. Существует ограничение на время ответа (выбора действия) на каждый тик - 1 секунда реального времени, а также суммарное ограничение по времени на всю игру - 40 секунд процессорного времени.

  • Стратегия превысила ограничение памяти - 256 МБ.

Описание игры

Игра CodeCraft 2020 представляет собой стратегию, в которой вам предстоит управлять набором юнитов, собирать ресурсы, строить здания и атаковать противников.

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

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

Поведение игровых сущностей определяется их свойствами.

Одно из важнейших свойств — размер сущности. Все сущности имеют форму квадрата, с длиной стороны равной данной величине.

Некоторые сущности могут двигаться (такие сущности называются юнитами). Юниты всегда имеют размер 1. Они могут передвинуться на соседнюю клетку за один тик, если эта клетка не занята другой сущностью.

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

Также, некоторые сущности могут ремонтировать другие сущности. Ремонтировать можно только соседние сущности (находящиеся на расстоянии 1). Каждый тик действия восстанавливается определенное количество здоровья цели. Во время ремонта здоровье цели не может стать больше максимального значения, указанного в его свойствах. Ремонтировать можно только живые сущности (с положительным здоровьем).

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

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

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

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

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

Список типов сущностей

Существует фиксированный набор типов сущностей в игре, и сущности одинаковых типов имеют одинаковые свойства. Вот полный список типов:

  • Ресурс. Это единственная сущность, не управляемая никаким игроком. Ее размер 1 и она должна быть атакована юнитом-строителем, чтобы добыть ресурс.

  • Юнит-строитель. Основная цель этого юнита — добывать ресурсы и строить здания.

  • Юнит ближнего боя. Базовый юнит, наносящий урон в ближнем бою (расстояние атаки 1).

  • Юнит дальнего боя. Наносит урон на расстоянии.

  • База строителей/юнитов ближнего боя/юнитов дальнего боя. Эти здания позволят купить новых юнитов соответствующего типа. Могут быть построены строителем.

  • Стена. Маленькое здание, блокирующее проход для противника.

  • Дом. Здание, производящее еду.

  • Турель. Здание, способное атаковать врагов. Так как не может двигаться, больше подходит для защиты.

Интерфейс управления

Каждый тик вашей сратегии нужно отдавать приказы своим сущностям. Если вы не отдаете приказ, сущность продолжает выполнять предыдущее действие.

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

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

Для действия ремонта необходимо указать цель.

Для действия постройки нужно указать тип сущности, а также положение. Положение сущности — клетка с минимальными координатами.

Для перемещения нужно указать целевую клетку. Юнит попробует найти путь до нее. Вы можете контролировать поиск пути, указав, следует ли искать ближайшую точку к цели. В противном случае, юнит не будет двигаться если путь до цели не найден. Также вы можете указать, искать ли путь, “пробивающий” сквозь другие сущности, атакуя и уничтожая их на своем пути. Такой алгоритм не будет рассматривать союзные сущности.

Когда игровой сервер производит поиск пути, используется простой алгоритм A* с ограничением на количество посещенных вершин.

Каждый игровой тик, сперва срабатывает алгоритм поиска пути для движущихся сущностей для определения потенциальной следующей позиции. Если целевая позиция действия движения сущности является соседной, поиск пути не выполняется, и запоминается эта позиция. Затем выполняются все действия атаки активных сущностей в случайном порядке. Если корректная цель для атаки не найдена, но в позиции, найденной на предыдущем шаге, находится враг, сущность атакует этого врага. Если здоровье цели было положительным и стало нулевым при атаке, цель считается уничтоженной и очки добавляются нападающему (но цель не удаляется из игры пока что). Далее выполняются все действия постройки в случайном порядке (если сущность выполнила действие атаки в этот тик, то действие постройки она уже выполнять не может). Затем аналогичным образом выполняются все действия ремонта. Ремонтируются только сущности с положительным здоровьем. В конце выполняется перемещение. Перемещение выполняется в несколько шагов. На каждом шаге юниты пытаются переместится в позицию, найденную на этапе поиска пути. Если несколько юнитов пытаются попасть в одну позицию, выбирается случайный. Если ни один юнит не может переместиться, фаза движения заканчивается.

В конце тика, сущности с нулевым здоровьем удаляются из игры, а сущности с полным здоровьем становятся активными.

Специфичные правила этапов

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

В Раунде 2 вам уже необходимо освоить постройку. В начале вам будут доступны лишь строители. Будет необходимо построить базы для других типов юнитов. Также, будет включен тума войны и будет необходимо исследовать местность перед атакой. Задача осложняется тем, что после Раунда 1, часть слабых участников будет отсеяна и вам придется сражаться с более сильными соперниками.

Финал — самый важный этап. После первых двух раундов остаются только сильнейшие. Игры в финале будут 1 на 1. Кроме того, если в какой то момент в игре остался один игрок, ему добавляется достаточное количество очков для победы.

Использование приложения

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

При запуске приложения, вы увидите экран конфигурации. Тут вы можете выбирать игроков, участвующих в игре, и настроить некоторые опции игры. Если вы хотите протестировать свою стратегию, выберите игрока TCP, а затем запустите свою стратегию. По умолчанию используется порт 31001. После успешного подключения, вы сможете начать игру.

Если вы хотите поменять порт подключения, к примеру чтобы подключить несколько стратегий одновременно, при запуске языкового пакета можно передать хост и порт для подключения. К примеру, ./aicup2020 localhost 31002.

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

Управление в приложении:

  • ПКМ / Shift-ЛКМ - перемещение камеры
  • СКМ / Ctrl-ЛКМ - вращение камеры
  • V - изменить режим визуализации.
  • Ctrl-S - сохранить текущую игру в файл (позже можно пересмотреть или повторить)
  • Ctrl-E - сохранить текущее состояние игры (позже можно загрузить это состояние и начать игру с него)
  • P - пауза/продолжить
  • Left/Right - потиковая перемотка времени (на паузе)

Вы можете также сохранить конфигурацию в файл, после чего запустить приложение с опцией --config <file>, пропуская экран конфигурации. Другие опции можно увидеть с помощью запуска с аргументом --help.## Значения свойств сущностей

Здесь вы можете ознакомиться с конкретными значениями свойств сущностей:

{
    House: (
        size: 3,
        build_score: 50,
        destroy_score: 500,
        can_move: false,
        population_provide: 5,
        population_use: 0,
        max_health: 50,
        initial_cost: 50,
        sight_range: 5,
        resource_per_health: 0,
        build: None,
        attack: None,
        repair: None,
    ),
    RangedUnit: (
        size: 1,
        build_score: 30,
        destroy_score: 300,
        can_move: true,
        population_provide: 0,
        population_use: 1,
        max_health: 10,
        initial_cost: 30,
        sight_range: 10,
        resource_per_health: 0,
        build: None,
        attack: Some((
            range: 5,
            damage: 5,
            collect_resource: false,
        )),
        repair: None,
    ),
    BuilderUnit: (
        size: 1,
        build_score: 10,
        destroy_score: 100,
        can_move: true,
        population_provide: 0,
        population_use: 1,
        max_health: 10,
        initial_cost: 10,
        sight_range: 10,
        resource_per_health: 0,
        build: Some((
            options: [
                House,
                Wall,
                BuilderBase,
                MeleeBase,
                RangedBase,
                Turret,
            ],
            init_health: Some(5),
        )),
        attack: Some((
            range: 1,
            damage: 1,
            collect_resource: true,
        )),
        repair: Some((
            valid_targets: [
                House,
                Wall,
                BuilderUnit,
                MeleeUnit,
                RangedUnit,
                BuilderBase,
                MeleeBase,
                RangedBase,
                Turret,
            ],
            power: 1,
        )),
    ),
    MeleeUnit: (
        size: 1,
        build_score: 20,
        destroy_score: 200,
        can_move: true,
        population_provide: 0,
        population_use: 1,
        max_health: 50,
        initial_cost: 20,
        sight_range: 10,
        resource_per_health: 0,
        build: None,
        attack: Some((
            range: 1,
            damage: 5,
            collect_resource: false,
        )),
        repair: None,
    ),
    Wall: (
        size: 1,
        build_score: 10,
        destroy_score: 10,
        can_move: false,
        population_provide: 0,
        population_use: 0,
        max_health: 50,
        initial_cost: 10,
        sight_range: 2,
        resource_per_health: 0,
        build: None,
        attack: None,
        repair: None,
    ),
    Resource: (
        size: 1,
        build_score: 0,
        destroy_score: 0,
        can_move: false,
        population_provide: 0,
        population_use: 0,
        max_health: 30,
        initial_cost: 0,
        sight_range: 0,
        resource_per_health: 1,
        build: None,
        attack: None,
        repair: None,
    ),
    Turret: (
        size: 2,
        build_score: 50,
        destroy_score: 500,
        can_move: false,
        population_provide: 0,
        population_use: 0,
        max_health: 100,
        initial_cost: 50,
        sight_range: 10,
        resource_per_health: 0,
        build: None,
        attack: Some((
            range: 5,
            damage: 5,
            collect_resource: false,
        )),
        repair: None,
    ),
    BuilderBase: (
        size: 5,
        build_score: 500,
        destroy_score: 5000,
        can_move: false,
        population_provide: 5,
        population_use: 0,
        max_health: 300,
        initial_cost: 500,
        sight_range: 5,
        resource_per_health: 0,
        build: Some((
            options: [
                BuilderUnit,
            ],
            init_health: None,
        )),
        attack: None,
        repair: None,
    ),
    RangedBase: (
        size: 5,
        build_score: 500,
        destroy_score: 5000,
        can_move: false,
        population_provide: 5,
        population_use: 0,
        max_health: 300,
        initial_cost: 500,
        sight_range: 5,
        resource_per_health: 0,
        build: Some((
            options: [
                RangedUnit,
            ],
            init_health: None,
        )),
        attack: None,
        repair: None,
    ),
    MeleeBase: (
        size: 5,
        build_score: 500,
        destroy_score: 5000,
        can_move: false,
        population_provide: 5,
        population_use: 0,
        max_health: 300,
        initial_cost: 500,
        sight_range: 5,
        resource_per_health: 0,
        build: Some((
            options: [
                MeleeUnit,
            ],
            init_health: None,
        )),
        attack: None,
        repair: None,
    ),
}

Описание API

В пакете для вашего языка программирования вы можете найти файл MyStrategy.<ext>/my_strategy.<ext>. Этот файл содержит класс MyStrategy с методом get_action, где должна быть реализована логика вашей стратегии.

Этот метод будет вызываться каждый тик.

Метод принимает следующие аргументы:

  • Доступная информация о текущем состоянии игры,
  • Отладочный интерфейс — этот объект позволяет отправлять отладочные команды и запрашивать отладочное состояние приложения прямо из кода вашей стратегии. Заметьте, что этот объект недоступен при тестировании на сервере, а также использовании приложения в консольном режиме (batch mode). Он предназначен только для локальной отладки.

Метод должен вернуть действие, которое вы хотите выполнить в данный тик.

Для отладки существует еще один метод — debug_update, принимающий такие же параметры. Он вызывается постоянно во время работы приложения (но не в консольном режиме), если клиент находится в ожидании следующего тика. Метод будет вызван хотя бы раз между тиками.

Описание объектов

В этой секции, некоторые поля могут быть опциональными (обозначается как Option<type>). Способ реализации зависит от языка. При возможности используется специальный опциональный (nullable) тип, иначе другие методы могут быть использованы (например nullable указатели).

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

Vec2Float32

Двумерный вектор

Поля:

  • x: float32 - Координата x вектора
  • y: float32 - Координата y вектора

Color

Цвет в формате RGBA

Поля:

  • r: float32 - Компонента красного цвета
  • g: float32 - Компонента зеленого цвета
  • b: float32 - Компонента синего цвета
  • a: float32 - Комнонента видимости (непрозрачности)

ColoredVertex

Вершина для отладочной отрисовки

Поля:

  • world_pos: Option<Vec2Float32> - Позиция в мировых координатах (если отсутствует, используются координаты (0, 0) экрана)
  • screen_offset: Vec2Float32 - Дополнительное смещение в экранных координатах
  • color: Color - Цвет

PrimitiveType

Тип примитивов для отладочной отрисовки

Варианты:

  • Lines - Линии, количество вершин должно делиться на 2
  • Triangles - Треугольники, количество вершин должно делиться на 3

DebugData

Данные для отладки, которые могут быть отображены при помощи приложения

Варианты:

  • Log - Добавить запись в лог

    Поля:

    • text: string - Текст лога
  • Primitives - Отрисовка примитивов

    Поля:

    • vertices: [ColoredVertex] - Вершины
    • primitive_type: PrimitiveType - Тип примитивов
  • PlacedText - Отрисовка текста

    Поля:

    • vertex: ColoredVertex - Вершина для определения положения и цвета текста
    • text: string - Текст
    • alignment: float32 - Выравнивание (0 - по левому краю, 0.5 - по центру, 1 - по правому краю)
    • size: float32 - Размер шрифта в пикселях

DebugCommand

Команды, которые могут быть отправлены приложению для помощи в отладке

Варианты:

  • Add - Добавить отладочные данные в текущий тик

    Поля:

    • data: DebugData - Данные для добавления
  • Clear - Очистить отладочные данные текущего тика

    Нет полей

  • SetAutoFlush - Включить/выключить автоматическое выполнение команд

    Поля:

    • enable: boolean - Включить/выключить автоматическое выполнение
  • Flush - Выполнить все присланные ранее команды

    Нет полей

Vec2Int32

Двумерный вектор

Поля:

  • x: int32 - Координата x вектора
  • y: int32 - Координата y вектора

MoveAction

Действие перемещения

Поля:

  • target: Vec2Int32 - Целевая позиция
  • find_closest_position: boolean - Находить ли ближайшее положение, если до цели путь не найден
  • break_through: boolean - Уничтожать ли враждебные сущности на пути

EntityType

Тип сущности

Варианты:

  • Wall - Стена, может использоваться для блокировки пути противнику
  • House - Дом, производит еду
  • BuilderBase - База для покупки юнитов-строителей
  • BuilderUnit - Юнит-строитель может строить здания
  • MeleeBase - База для покупки юнитов ближнего боя
  • MeleeUnit - Юнит ближнего боя
  • RangedBase - База для покупки юнитов дальнего боя
  • RangedUnit - Юнит дальнего боя
  • Resource - Ресурс, может быть собран
  • Turret - Здание способное атаковать на расстоянии

BuildAction

Действие постройки

Поля:

  • entity_type: EntityType - Тип сущности для постройки
  • position: Vec2Int32 - Желаемая позиция новой сущности

AutoAttack

Настройки автоматической атаки

Поля:

  • pathfind_range: int32 - Максимальное расстояние для поиска пути
  • valid_targets: [EntityType] - Список типов сущностей, которые следует атаковать. Если пусто, все типы кроме ресурса будут рассмотрены

AttackAction

Действие атаки

Поля:

  • target: Option<int32> - ID цели, если применимо
  • auto_attack: Option<AutoAttack> - Настройки автоматической атаки, если необходимо

RepairAction

Действие починки

Поля:

  • target: int32 - ID цели

EntityAction

Действие сущности

Поля:

  • move_action: Option<MoveAction> - Действие перемещения
  • build_action: Option<BuildAction> - Действие постройки
  • attack_action: Option<AttackAction> - Действие атаки
  • repair_action: Option<RepairAction> - Действие починки

Action

Действие игрока

Поля:

  • entity_actions: Map<int32 -> EntityAction> - Новые действия для сущностей. Если сущность не получила новое действие, она будет продолжать выполнять предыдущее

ClientMessage

Сообщение отправляемое клиентом

Варианты:

  • DebugMessage - Отправить отладочную команду приложению

    Поля:

    • command: DebugCommand - Команда для исполнения
  • ActionMessage - Ответ на ServerMessage::GetAction

    Поля:

    • action: Action - Действие игрока
  • DebugUpdateDone - Сигнализирует окончание отладочного обновления

    Нет полей

  • RequestDebugState - Запросить отладочное состояние приложения

    Нет полей

BuildProperties

Свойства строительства сущности

Поля:

  • options: [EntityType] - Возможные типы новой сущности
  • init_health: Option<int32> - Изначальное здоровье новой сущности. Если отсутствует, новая сущность будет имет полное здоровье

AttackProperties

Свойства атаки сущности

Поля:

  • attack_range: int32 - Максимальное расстояние атаки
  • damage: int32 - Урон наносимый за один тик
  • collect_resource: boolean - Собираются ли ресурсы с цели при атаке

RepairProperties

Свойства ремонта сущности

Поля:

  • valid_targets: [EntityType] - Типы сущностей, которые возможно ремонтировать
  • power: int32 - Здоровье восстанавливаемое за один тик

EntityProperties

Свойства сущности

Поля:

  • size: int32 - Размер. Сущности имеют форму квадрата со стороной заданной длины
  • build_score: int32 - Количество очков за постройку данной сущности
  • destroy_score: int32 - Количество очков за уничтожение данной сущности
  • can_move: boolean - Может ли данная сущность перемещаться
  • population_provide: int32 - Количество производимой еды, если сущность активна
  • population_use: int32 - Количество потребляемой еды
  • max_health: int32 - Максимальное количество очков здоровья
  • initial_cost: int32 - Стоимость постройки первой сущности данного типа. Если это юнит (сущность может перемещаться), стоимость увеличивается на 1 за каждого существующего юнита этого типа
  • sight_range: int32 - Если включен туман войны, расстояние на котором другие сущности считаются видимыми
  • resource_per_health: int32 - Количество ресурса добавляемое нападающему, способному собирать русурсы, за каждую единицу урона
  • build: Option<BuildProperties> - Свойства строительства, если сущность способна строить
  • attack: Option<AttackProperties> - Свойства атаки, если сущность способна атаковать
  • repair: Option<RepairProperties> - Свойства ремонта, если сущность способна ремонтировать

Player

Игрок (стратегия, клиент)

Поля:

  • id: int32 - ID игрока
  • score: int32 - Текущий счет
  • resource: int32 - Текущее количество ресурса

Entity

Игровая сущность

Поля:

  • id: int32 - ID сущности. Уникально для каждой сущности
  • player_id: Option<int32> - ID игрока, владеющего сущностью, если применимо
  • entity_type: EntityType - Тип сущности
  • position: Vec2Int32 - Позиция сущности (угол с минимальными координатами)
  • health: int32 - Текущее здоровье
  • active: boolean - Если сущность активна, она может выполнять действия

PlayerView

Доступная игроку информация

Поля:

  • my_id: int32 - ID вашего игрока
  • map_size: int32 - Размер карты
  • fog_of_war: boolean - Включен ли туман войны
  • entity_properties: Map<EntityType -> EntityProperties> - Свойства сущностей для каждого типа
  • max_tick_count: int32 - Максимальная длительность игры в тиках
  • max_pathfind_nodes: int32 - Максимальное количество вершин для поиска пути в игровом симуляторе
  • current_tick: int32 - Текущий тик
  • players: [Player] - Список игроков
  • entities: [Entity] - Список сущностей

ServerMessage

Сообщение отправляемое сервером

Варианты:

  • GetAction - Получить действие для следующего тика

    Поля:

    • player_view: PlayerView - Информация доступная игроку
    • debug_available: boolean - Доступен ли отладочный интерфейс приложения
  • Finish - Сигнализирует конец игры

    Нет полей

  • DebugUpdate - Отладочное обновление

    Поля:

    • player_view: PlayerView - Информация доступная игроку

Camera

Камера используемая для отрисовки

Поля:

  • center: Vec2Float32 - Точка на которую смотрит камера
  • rotation: float32 - Угол поворота
  • attack: float32 - Угол атаки
  • distance: float32 - Расстояние до цели
  • perspective: boolean - Применяется ли перспектива

DebugState

Состояние для отладки, получаемое из приложения

Поля:

  • window_size: Vec2Int32 - Размер окна для отрисовки
  • mouse_pos_window: Vec2Float32 - Положение курсора в оконных координатах
  • mouse_pos_world: Vec2Float32 - Положение курсора в мировых координатах
  • pressed_keys: [string] - Кнопки, нажатые в данный момент
  • camera: Camera - Текущая камера используемая для отрисовки
  • player_index: int32 - Индекс вашего игрока


modemaizer

modemaizer

VMedia

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

28.11.2020 2:24:27
modemaizer

modemaizer

VMedia

modemaizer

modemaizer

VMedia

Слегка позанудствую. * При деление делении округление всегда совершается в меньшую сторону. * Также, некоторые сущности могут ремонтировать другие сущность сущности . * Некоторые атакующие сущности так же также могут собирать ресурсы с цели. * Некоторые сущности обладают способность способностью …

Блт А Markdown где?

28.11.2020 2:25:15
sergileon

sergileon

Сбербанк

“Для действия постройки нужно указать тип сущности, а так же положение. Положение сущности — клетка с минимальными координатами. entity_actions: Map EntityAction> - Новые действия для сущностей. Если сущность не получила новое действие, она будет продолжать выполнять предыдущее. Действие состоит из действий атаки, постройки, ремонта и перемещения, которые имеют приоритет в данном порядке. То есть, если вы укажете несколько действий, только первое из возможных будет выполнено.” Как остановить проблему с бесконечной постройкой юнитов или я набажил? Судя из описания, в каждом тике берётся предыдущее доступное действие и выполняется, пока не будет передано другое. Для зданий юнитов, единственное действие - постройка.

28.11.2020 8:39:08
sergileon

sergileon

Сбербанк

sergileon

sergileon

Сбербанк

“Для действия постройки нужно указать тип сущности, а так же положение. Положение сущности — клетка с минимальными координатами. entity_actions: Map EntityAction> - Новые действия для сущностей. Если сущность не получила новое действие, она будет продолжать выполнять предыдущее. Действие состоит из действий атаки, постройки, ремонта и перемещения, которые имеют приоритет в данном порядке. То есть, если вы укажете несколько действий, только первое из возможных будет выполнено.” Как остановить проблему с бесконечной постройкой юнитов или я набажил? Судя из описания, в каждом тике берётся предыдущее доступное действие и выполняется, пока не будет передано другое. Для зданий юнитов, единственное действие - постройка.

Нужно сущности передать пустое действие)

28.11.2020 9:35:10
planB

planB

Реутов

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

28.11.2020 17:09:44
Roout

Roout

Луганск

planB

planB

Реутов

На всю стратеги: ~40 секунд процессорного времени + 256МБ оперативки Используй как хочешь, только не превышай 1сек на 1 тик.

28.11.2020 21:04:44
Okke

Okke

Санкт-Петербург

Кто нибудь пробовал использовать DebugCommand? Можно пример? Что вот тут не так? DebugCommand debugCommand = new Add(new PlacedText(new ColoredVertex(new Vec2Float(), new Vec2Float(10, 10), new Color(1, 1, 1, 1)), “Hello!”, 0, 20)); debugInterface.send(debugCommand);

28.11.2020 23:05:53
Okke

Okke

Санкт-Петербург

Okke

Okke

Санкт-Петербург

Кто нибудь пробовал использовать DebugCommand? Можно пример? Что вот тут не так? DebugCommand debugCommand = new Add(new PlacedText(new ColoredVertex(new Vec2Float(), new Vec2Float(10, 10), new Color(1, 1, 1, 1)), “Hello!”, 0, 20)); debugInterface.send(debugCommand);

Вопрос снят

29.11.2020 0:38:52
daiver19

Будут ли меняться значения параметров в следующих раундах? При текущих значениях параметров игры с одним строителем выглядят слишком медленными - из 1000 тиков на игру минимум 500 тиков надо на постройку первой базы, не говоря уже о том, что почти любую игру можно будет свести к ничьей путем атаки вражеского строителя (от чего можно спастись только застройкой стенами, что тоже не выглядит как хорошая стратегия). В общем, с текущими параметрами стратегия вряд ли получится - время до первой постройки должно быть сопоставимо со временем пересечения карты, или же база строителей должна даваться изначально.

29.11.2020 1:22:18
SilentNox

SilentNox

Миасс

Два вопроса на засыпку: 1) Где правила начисления очков? 2) Где статы юнитов?

29.11.2020 1:31:38
HoberMellow

HoberMellow

Freelancer

SilentNox

SilentNox

Миасс

Два вопроса на засыпку: 1) Где правила начисления очков? 2) Где статы юнитов?

Статы юнитов передают в программу в поле EntityProperties.

29.11.2020 2:02:52
mi5

mi5

РА "Очень Хорошо"

Наверно, чтобы устранить дисбаланс - “бесполезность” мечника, урон от лучника нужно уменьшить с 5 до 1.

29.11.2020 7:30:32
prospero78su

prospero78su

Берлин

“ Эти здания позполят купить новых юнитов соответствующего типа. ” Исправьте ошибку.

29.11.2020 9:46:17
prospero78su

prospero78su

Берлин

aicup2020$ go run main.go
# command-line-arguments
./main.go:37:16: undefined: NewMyStrategy
./main.go:38:20: undefined: DebugInterface

Приплыли.

29.11.2020 10:15:40
prospero78su

prospero78su

Берлин

prospero78su

prospero78su

Берлин

aicup2020$ go run main.go

command-line-arguments

./main.go:37:16: undefined: NewMyStrategy ./main.go:38:20: undefined: DebugInterface Приплыли.

Уважаемые гошники! Сборка у вас работать не будет, только если вы не будете делать просто:

go build

Тогда, что-то можно сообразить.

29.11.2020 11:06:03
xocks

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

29.11.2020 16:12:22
qubit

qubit

Киров

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

Поверь, плохо написаны практически все языковые пакеты. Это же традиция раика первым делом полностью переписать пакет под себя :)

В С++ вон даже память под созданные объекты не удаляется :)

29.11.2020 18:23:32
qubit

qubit

Киров

qubit

qubit

Киров

Поверь, плохо написаны практически все языковые пакеты. Это же традиция раика первым делом полностью переписать пакет под себя :) В С++ вон даже память под созданные объекты не удаляется :)

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

29.11.2020 18:46:17
Okke

Okke

Санкт-Петербург

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

29.11.2020 18:58:32
TRANSNIGGER

TRANSNIGGER

Москва

Возможно я что-то не понимаю, но у меня у одного автоатака работает не более чем на примерно 1/4 часть поля, независимо от переданного в аргумент числа pathfind_range ?

29.11.2020 19:06:05
DolfWolkov

DolfWolkov

Москва

Okke

Okke

Санкт-Петербург

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

Дом после постройки надо “починить” до полного здоровья.

29.11.2020 19:06:35
TRANSNIGGER

TRANSNIGGER

Москва

Okke

Okke

Санкт-Петербург

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

там после постройки дома у него 5хп из 20, проверь, его сразу надо починить и все будет круто

29.11.2020 19:06:48
Okke

Okke

Санкт-Петербург

DolfWolkov

DolfWolkov

Москва

Дом после постройки надо “починить” до полного здоровья.

Спасибо!

29.11.2020 19:08:23
Okke

Okke

Санкт-Петербург

TRANSNIGGER

TRANSNIGGER

Москва

там после постройки дома у него 5хп из 20, проверь, его сразу надо починить и все будет круто

Спасибо!

29.11.2020 19:08:32
Jeen99
mi5

mi5

РА "Очень Хорошо"

Наверно, чтобы устранить дисбаланс - “бесполезность” мечника, урон от лучника нужно уменьшить с 5 до 1.

+1

29.11.2020 23:11:23
Polifem

Существует ли возможность сохранять информацию между “тиками” ? С целью как оптимизации работы, так и “наследуемости” действий юнитов

30.11.2020 6:44:18
F10PPY

F10PPY

Москва

mi5

mi5

РА "Очень Хорошо"

Наверно, чтобы устранить дисбаланс - “бесполезность” мечника, урон от лучника нужно уменьшить с 5 до 1.

Тогда появится ещё больше дисбаланса, турели придётся тоже уменьшать дамаг, и вообще её нереально будет убить как и любое здание, если её чинит в этот момент работник. Мечника надо править, а не всё остальное, если цель именно его сбалансить.

30.11.2020 6:46:15
kuviman

kuviman

Codeforces

Существует ли возможность сохранять информацию между “тиками” ? С целью как оптимизации работы, так и “наследуемости” действий юнитов

Да, класс MyStrategy создается один раз, в нем можно хранить необходимую информацию

30.11.2020 7:50:33
Hamster

Hamster

SOFTPOINT

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

30.11.2020 8:47:27
mi5

mi5

РА "Очень Хорошо"

F10PPY

F10PPY

Москва

Тогда появится ещё больше дисбаланса, турели придётся тоже уменьшать дамаг, и вообще её нереально будет убить как и любое здание, если её чинит в этот момент работник. Мечника надо править, а не всё остальное, если цель именно его сбалансить.

Наоборот, еще один дисбаланс выравнивается. А то единственное укрепленное здание берется штурмом силами 3-х лучников.

30.11.2020 12:34:29
F10PPY

F10PPY

Москва

mi5

mi5

РА "Очень Хорошо"

Наоборот, еще один дисбаланс выравнивается. А то единственное укрепленное здание берется штурмом силами 3-х лучников.

Ну где же он выравнивается, если у турели будет 5 дамаг а у лучников и мили по 1?

30.11.2020 13:07:30
F10PPY

F10PPY

Москва

F10PPY

F10PPY

Москва

Ну где же он выравнивается, если у турели будет 5 дамаг а у лучников и мили по 1?

И починка как бы 5хп, пара турелей+ремонтники за ними, и хоть тонну лучников подавай, ничего они не сделают с 1дамагом.

30.11.2020 13:09:26
sergileon

sergileon

Сбербанк

Карта ресурсов рандомно генерируется?)

30.11.2020 14:40:24
Sardukar

Sardukar

Артем

Okke

Okke

Санкт-Петербург

Вопрос снят

Как у тебя получилось? Как надо правильно писать, чтобы текст выводило?

30.11.2020 17:09:30
xocks

Тут много обсуждения по поводу фикса дальников, мое мнение, что стоит повысить им потребляемую еду до 2. Тогда тактика “закидать противника мясом из милишников” тоже будет рабочая

30.11.2020 19:26:49
Okke

Okke

Санкт-Петербург

Sardukar

Sardukar

Артем

Как у тебя получилось? Как надо правильно писать, чтобы текст выводило?

Там в debugUpdate по дефолту отправляется Clear. У меня он все подтирал. Поэтому ни чего не выводилось.

30.11.2020 20:18:37
Sardukar

Sardukar

Артем

Okke

Okke

Санкт-Петербург

Там в debugUpdate по дефолту отправляется Clear. У меня он все подтирал. Поэтому ни чего не выводилось.

я закомментил сразу эту штуку. Все равно не выводит

01.12.2020 3:51:54
Okke

Okke

Санкт-Петербург

Sardukar

Sardukar

Артем

я закомментил сразу эту штуку. Все равно не выводит

И нужно быть игроком 1, как я понял

01.12.2020 4:06:03
Dyavol

Dyavol

Изюм

А турельке случайно, позже сплеш не добавят?

01.12.2020 22:23:30
Neo7k

Neo7k

Techland

Как называется формат значений свойств сущностей? Ну этот странный JSON, никогда раньше такого не видел

04.12.2020 0:05:09
MikeWazowski

MikeWazowski

Москва

а за победу над всеми противниками очки давать будут ? а то как и в прошлые годы можно всех победить, но проиrрать по очкам … russianaicup.ru/game/view/23380

04.12.2020 0:16:55
skyfox

skyfox

ЮРГТУ (НПИ)

Та же беда: https://russianaicup.ru/game/view/23470. Придется оставлять последний вражий House…

04.12.2020 1:05:11
StillSteel

StillSteel

game garden

А в финале (1 на 1) игроки будут всегда располагаться по диагонали карты? Или расположение игроков будет определяться случайно, и могут попасться любые углы карты?

05.12.2020 23:41:52
kokorins

kokorins

Берлин

Каков размер карты? Что будет если попытаться выйти за границу?

09.12.2020 2:16:22
kokorins

kokorins

Берлин

kokorins

kokorins

Берлин

Каков размер карты? Что будет если попытаться выйти за границу?

нашел первое: map_size

09.12.2020 2:17:32
mixei4

mixei4

КГУ

kokorins

kokorins

Берлин

Каков размер карты? Что будет если попытаться выйти за границу?

PlayerView.map_size, ничего хорошего.

09.12.2020 2:18:19
arum

arum

Рига

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

10.12.2020 2:19:59
mixei4

mixei4

КГУ

arum

arum

Рига

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

Хорошая идея.

10.12.2020 3:33:15
arum

arum

Рига

mixei4

mixei4

КГУ

Хорошая идея.

Простые рабочие тоже могут атаковать или я ошибаюсь?

10.12.2020 11:30:22
mixei4

mixei4

КГУ

arum

arum

Рига

Простые рабочие тоже могут атаковать или я ошибаюсь?

Могут, в частности они атакуют ресурсы.

range: 1, damage: 1,

10.12.2020 20:15:17
r41d3n7

I haven’t been able to test my strategies locally using the app. I’m getting an error when I try to run the main.cpp file while trying to connect to the app locally.

TcpStream.obj : error LNK2019: unresolved external symbol __imp__connect@12 referenced in function "public: __thiscall TcpStream::TcpStream(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" (??0TcpStream@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z)

I’m using Visual Studio 2019 on Windows x64. Has anyone else tried with VS19? If not, can you recommend a method to run strategies locally on the app?

10.12.2020 20:57:14
kuviman

kuviman

Codeforces

I haven’t been able to test my strategies locally using the app. I’m getting an error when I try to run the main.cpp file while trying to connect to the app locally. TcpStream.obj : error LNK2019: unresolved external symbol __imp__connect@12 referenced in function "public: __thiscall TcpStream::TcpStream(class std::basic_string<char,struct std::char_traits,class std::allocator > const &,int)" (??0TcpStream@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) …

If you import the cmake project included (CMakeLists.txt), everything should work fine.

10.12.2020 22:16:22
r41d3n7
kuviman

kuviman

Codeforces

If you import the cmake project included ( CMakeLists.txt ), everything should work fine.

Thanks! That helped me figure it out.

10.12.2020 22:52:19
AlexKol

AlexKol

BB

TRANSNIGGER

TRANSNIGGER

Москва

Возможно я что-то не понимаю, но у меня у одного автоатака работает не более чем на примерно 1/4 часть поля, независимо от переданного в аргумент числа pathfind_range ?

Как я понял дальность ограничена вот этим max_pathfind_nodes =1000. Это грубо говоря квадрат из 1000 ячеек где ты в центре. Получается что то типа 15 клеток в каждую сторону максимум

11.12.2020 9:20:14
AlexKol

AlexKol

BB

У меня вопрос. Допустим мой лучник стоит в координатах (0,0). Я иногда замечаю, что он зависает как будто что то делает, но ничего не делает. А он пытается атаковать цель в координатах (4, 3) или (3, 4). По сути до неё же дальность ровно 5 и всё хорошо, но не стреляет. Это мне так кажется или реально так есть?

11.12.2020 11:10:27
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

AlexKol

AlexKol

BB

У меня вопрос. Допустим мой лучник стоит в координатах (0,0). Я иногда замечаю, что он зависает как будто что то делает, но ничего не делает. А он пытается атаковать цель в координатах (4, 3) или (3, 4). По сути до неё же дальность ровно 5 и всё хорошо, но не стреляет. Это мне так кажется или реально так есть?

дальность по манхеттеновскому расстоянию. в данном случае оно 7

11.12.2020 11:11:58
AlexKol

У меня вопрос. Допустим мой лучник стоит в координатах (0,0). Я иногда замечаю, что он зависает как будто что то делает, но ничего не делает. А он пытается атаковать цель в координатах (4, 3) или (3, 4). По сути до неё же дальность ровно 5 и всё хорошо, но не стреляет. Это мне так кажется или реально так есть?

Проверил через клавиатуру, и реально он не достает и смещается ближе

11.12.2020 11:13:34
AlexKol

AlexKol

BB

amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

дальность по манхеттеновскому расстоянию. в данном случае оно 7

Таааакккк. Объясни пожалуйста подробнее подробнее

11.12.2020 11:14:51
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

AlexKol

AlexKol

BB

Таааакккк. Объясни пожалуйста подробнее подробнее

abs(x1-x2)+abs(y1-y2)

11.12.2020 11:18:39
AlexKol

AlexKol

BB

amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

abs(x1-x2)+abs(y1-y2)

И тут стул подо мной вспыхнул….

11.12.2020 11:20:55
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

AlexKol

AlexKol

BB

И тут стул подо мной вспыхнул….

погуглить не помешает

11.12.2020 11:24:22
AlexKol

AlexKol

BB

amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

погуглить не помешает

Я погуглил. Короче спасибо тебе. Как же это всё изменило

11.12.2020 11:30:07
Ver_Nick

Ver_Nick

КФУ им. В.И. Вернадского

arum

arum

Рига

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

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

11.12.2020 15:05:11
Ver_Nick

Ver_Nick

КФУ им. В.И. Вернадского

BTW, а где я могу получить свой текущий population? Или нужно вручную считать дома?

11.12.2020 15:32:48
qubit

qubit

Киров

Ver_Nick

Ver_Nick

КФУ им. В.И. Вернадского

BTW, а где я могу получить свой текущий population? Или нужно вручную считать дома?

Нужно вручную считать все здания.

11.12.2020 17:24:09
LittlePig

LittlePig

Саратовский ГУ

Отсылаю решение на C# в архиве (только .cs файлы и csproj), получаю ошибку компиляции на сервере:

stdout:

stderr: + ‘[‘ compile ’!=‘ base ’]’ ++ ls -1 /src/ ++ wc -l + 1 -eq 1 + cp -f /src/MyStrategy.cs MyStrategy.cs cp: cannot stat ‘/src/MyStrategy.cs’: No such file or directory

MyStrategy.cs лежит в корне архива

11.12.2020 17:56:21
mixei4

mixei4

КГУ

LittlePig

LittlePig

Саратовский ГУ

Отсылаю решение на C# в архиве (только .cs файлы и csproj), получаю ошибку компиляции на сервере: stdout: stderr: + ‘[‘ compile ’!=‘ base ’]’ ++ ls -1 /src/ ++ wc -l + 1 -eq 1 + cp -f /src/MyStrategy.cs MyStrategy.cs cp: cannot stat ‘/src/MyStrategy.cs’: No such file or directory MyStrategy.cs лежит в корне архива

Попробуй отсылать всё, что было изначально в архиве, со своими изменениями сверху.

11.12.2020 20:41:29
r41d3n7

Ranged unit. Deals less damage than melee unit, but has bigger attack range. It says here that the Ranged Unit deals less damage than a Melee Unit.

However, the damage shown here is the same as Melee Unit’s damage. Am I missing something?

RangedUnit: (
        size: 1,
        build_score: 30,
        destroy_score: 300,
        can_move: true,
        population_provide: 0,
        population_use: 1,
        max_health: 10,
        initial_cost: 30,
        sight_range: 10,
        resource_per_health: 0,
        build: None,
        attack: Some((
            range: 5,
            damage: 5,
            collect_resource: false,
        )),
        repair: None,

12.12.2020 14:08:32
j303

j303

Москва

Всем привет. Использую c#. У меня на локалке всё работает. А когда отсылаю, то много ошибок, таких как

stderr: + cd /output + dotnet ./aicup2020.dll gameserver 31002 6bda24cc2880644de3e65c1c0cb699c6f63b511f_1 Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array. at Aicup2020.Base.Update(PlayerView playerView, List1& groups, Section[,] sections, List1& log) in /project/Base.Update.cs:line 12 at Aicup2020.MyStrategy.GetAction(PlayerView playerView, DebugInterface debugInterface) in /project/MyStrategy.cs:line 112

Я понимаю, что значит “System.IndexOutOfRangeException: Index was outside the bounds of the array.”, но на понимаю, почему на локалке этого нет.

16.12.2020 10:55:31
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

j303

j303

Москва

Всем привет. Использую c#. У меня на локалке всё работает. А когда отсылаю, то много ошибок, таких как stderr: + cd /output + dotnet ./aicup2020.dll gameserver 31002 6bda24cc2880644de3e65c1c0cb699c6f63b511f_1 Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array. at Aicup2020.Base.Update(PlayerView playerView, List …

позапускай на локалке игры по правилам всех раундов против себя же

16.12.2020 12:26:28
snikes

snikes

РГППУ

Почему во втором раунде игры первого раунда?

19.12.2020 9:10:08
Savidiy

Savidiy

Псков

snikes

snikes

РГППУ

Почему во втором раунде игры первого раунда?

Есть примеры? Пока тестируется может писать формат 4х1, но по факту выходит 4х1+. Вы об этом?

19.12.2020 10:15:48
mixei4

mixei4

КГУ

snikes

snikes

РГППУ

Почему во втором раунде игры первого раунда?

Этот баг отображения непротестированных игр с начала времён.

19.12.2020 10:16:15
maxim.pr

maxim.pr

Воронеж

“По результатам Раунда 2 50 лучших стратегий пройдут в Финал. Также в Финал проходят дополнительные 10 участников с наибольшим рейтингом в Песочнице (на момент старта Финала), среди тех кто не прошел по результатам Раунда 2.” Кто не участвовал в раунде 2 может попасть в финал через дополнительные 10 мест из песочницы?

19.12.2020 12:53:39
dbf

dbf

Москва

maxim.pr

maxim.pr

Воронеж

“По результатам Раунда 2 50 лучших стратегий пройдут в Финал. Также в Финал проходят дополнительные 10 участников с наибольшим рейтингом в Песочнице (на момент старта Финала), среди тех кто не прошел по результатам Раунда 2.” Кто не участвовал в раунде 2 может попасть в финал через дополнительные 10 мест из песочницы?

Да, но это сложно.

19.12.2020 13:07:22