Танчики. Соревнование по программированию

12 марта 2017 мы проводим соревнование по программированию. Анонс уже был, а сейчас будем рассказывать подробности.

Самые главные моменты.

  1. Участвовать могут все желающие. Мы одинаково ждем студентов, школьников, админов, асушников, связистов, педагогов, программистов и так далее. Особенно приглашаются те, кто ходил на наши курсы, поскольку для вас это будет выпускным заданием.
  2. Можно участвовать самому, а можно собрать команду. Нам без разницы. Выполните задание и победите — будет вам приз.
  3. Мы придумали простую игру в «Танчики» и написали для нее сервер. Задача участников: написать максимально умного бота для этой игры.
  4. Писать бота можно на любом языке и в любой среде программирования, которые умеют работать с текстовыми файлами. Это может быть Basic, Pascal, Delphi, TCL, Python, Ruby, JavaScript, Java, Scala, C, C++, C#, D, R, VB, Haskell, в общем любые языки, включая, конечно же, и ассемблер для ценителей.  Запускать бота вы сможете прямо со своего компьютера.
  5. В соревновании участвуют боты, которые сражаются между собой. Ручного управления нет, но будет возможность модифицировать своего бота по ходу соревнования.
  6. На написание бота у участников есть неделя. В течение недели можно приходить к нам и тестировать свое творение. Или можете писать его прямо у нас. Мы открыты с 12:00 до 20:00.
  7. Пока участники пишут ботов, мы улучшаем сервер. Он уже работает и позволяет проводить битвы с любым количеством участников. Однако, предела совершенству нет, поэтому вплоть до начала соревнований мы будем что-то корректировать и выкладывать информацию об изменениях здесь, на этой странице.
  8. Соревнование начнется 12 марта 2017 в 15:00, но вы можете приходить начиная с 12:00, чтобы расчехлиться, потестироваться, потусоваться и разобраться что к чему.
  9. Призовой фонд на мероприятие — 10 тыс. рублей, который уйдет победившей команде.
  10. Уважайте других участников независимо от их возраста и компетентности.

Все вопросы вы можете задать

  1. По телефону +7 (906) 900-5726
  2. Туда же, но через WhatsApp
  3. Через Slack, наш канал fablabnorilsk.slack.com
  4. По электронной почте: info@norlab.ru
  5. В комментариях к этой заметке
  6. Прийти ногами к нам на Котульского, 15 и спросить у живых людей

Удачи! Не стесняйтесь задавать вопросы. Участвуйте с друзьями, от школы, от института, от фирмы или сами по себе. И обязательно приходите тестировать ботов в течение недели. Это позволит вам быстро пройти этапы ввода/вывода и перейти к самой логике. А мы, в свою очередь лишний раз проверим сервер на безглючность.

Правила и логика игры

Все значения указанные красным — произвольные, даны для получения общего представления. Поскольку баланс игры только настраивается, эти значения могут еще меняться. Все остальное скорее всего не изменится.

  1. Игра сводится к танковому сражению между несколькими (от 2 и более) командами.
  2. Сражение происходит на карте произвольного размера (999×999 клеток). На карте нет препятствий, все клетки одинаковые. Update 06.03.2017: Система координат начинается с точки (1,1). Координаты указываются в целочисленных значениях.
  3. В начале игры для каждой команды генерируется равное количество танков (20 танков). Сервер самостоятельно расставляет их группами на карте. 1 танк занимает 1 клетку. Update 09.03.2017: Количество танков в команде обязательно будет кратно 3.
  4. Танки в каждой команде разделены примерно равными долями на три вида: heavy (тяжелые), medium (средние), light (легкие). Каждый танк имеет свои характеристики.
  5. Танки могут стрелять и двигаться. Для этого вы отдаете им приказы. У каждого танка есть дальность обзора, в котором он видит другие игровые объекты и танки противника (30 клеток).
  6. Сражение идет по ходам. Алгоритм каждого хода следующий:
    • Для каждой команды сервер выгружает текстовый файл, в котором перечислены все танки команды и указано их текущее состояние. Update 07.03.2017: В перечне указаны и активные и уже подбитые танки команды.
    • Для каждой команды сервер выгружает текстовый файл, в котором перечислены все видимые танки противника и другие игровые объекты. Update 07.03.2017: В перечне объектов, которые видят ваши танки, будут и еще активные и уже подбитые танки противника. Своих танков в этом перечне нет.
    • Update 08.03.2017: Для каждой команды сервер выгружает текстовый файл, в котором можно найти полезную информацию от сервера и данные разведки.
    • Сервер создает/обновляет файл с номером хода. Update 07.03.2017: Этот файл будет общий для всех.
    • Сервер ждет 3 секунды.
    • Сервер загружает файлы, в которых каждый приказ описывает действия для каждого своего танка.
    • Сервер обрабатывает загруженные файлы. Все файлы неправильного формата игнорируются. Все непонятные параметры игнорируются. Если бот не успел выгрузить файл с директивами, то команда пропускает ход. Update 06.03.2017: Если вы не отдадите приказов или просто не укажете свой танк в файле приказов, то этот танк, соответственно, пропустит ход.
    • Сервер выполняет фазу стрельбы. Рассчитывается нанесенный урон. Update 06.03.2017: Заслонить один танк другим нельзя. Если два танка стрельнули друг в друга, то оба выстрела будут рассчитаны. Фаза стрельбы заканчивается подсчетом урона и определением выбывших танков. Для энтузиастов — можно расстреливать свои собственные танки. Расстояние при стрельбе на меткость не влияет.
    • Сервер выполняет фазу движения. При этом сначала двигаются танки типа light, потом medium, потом heavy. Если клетка уже занята другим танком, движение для танка отменяется. Update 07.03.2017: Подбитый танк тоже занимает клетку, на нее заехать не получится.
    • Сервер переходит к следующему ходу.
  7. Если на поле остались уцелевшие танки только одной команды — она побеждает.
  8. Если победитель не выявлен за 1000 ходов, побеждает команда, в которой осталось большее количество уцелевших танков.

Параметры для  танков

firepower = огневая мощь танка
armor = защита танка, уменьшается после каждого попадания
chance to get hit = вероятность попасть в этот танк
fire range = максимальная дальность стрельбы (в клетках)
move range = максимальная дальность передвижения (в клетках)
move order = очередность движения

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

Вот начальные характеристики каждого типа:

[light]
firepower = 1
armor = 3
chance to get hit = 0.6
fire range = 75
move range = 6
move order = 1

[medium]
firepower = 2
armor = 4
chance to get hit = 0.7
fire range = 100
move range = 4
move order = 2

[heavy]
firepower = 3
armor = 6
chance to get hit = 0.8
fire range = 150
move range = 3
move order = 3

Файл описания текущего состояния для какой-то команды.

Из него вы берете всю информацию о своих танках. Формат записей с нашими комментариями (в настоящем файле их не должно быть):

[tank 0]                                      # Здесь цифра «0» — это номер/идентификатор танка
tank type = heavy                    # Тип танка
description = heavy tank       # Описание танка
alive = True                              # Жив ли танк, варианты True (да) или False (нет)
position x = 484                      # Позиция по горизонтали (x)
position y = 931                       # Позиция по вертикали (y)
armor = 6.0                              # Состояние защиты танка
firepower = 3.0                        # Огневая мощь
chance to get hit = 0.8           # Шанс попасть в этот танк
fire range = 150.0                   # Дальность стрельбы
move range = 3.0                    # Дальность передвижения
move order = 3.0                    # Порядок передвижения

[tank 1]
tank type = heavy
description = heavy tank
alive = True
position x = 536
position y = 951
armor = 6.0
firepower = 3.0
chance to get hit = 0.8
fire range = 150.0
move range = 3.0
move order = 3.0

и так далее.

Формат файла с описанием всего, что видят ваши танки:

[object 0]                              # Номер объекта, просто для удобства
position x = 526              # Координата объекта по горизонтали
position y = 88                # Координата объекта по вертикали
type = light tank                 # Тип объекта
team = small good             # Команда, которой принадлежит объект (если есть)
description = light tank    # Описание объекта
alive = True                         # Живое ли? Опасное ли?

[object 1]
position x = 523
position y = 101
type = light tank
team = small good
description = light tank
alive = True

и так далее.

Формат файла с полезной информацией и данными разведки:

[main intel]
current cycle = 2                     # номер текущего хода
game will end at cycle = 2     # номер хода, на котором игра закончится
warzone size by x = 999        # размер поля по x
warzone size by y = 999        # размер поля по y
tanks vision range = 30         # радиус поля зрения танков
bots waiting time = 5              # сколько секунд сервер ждет ответа от ботов
number of teams = 2              # количество команд

[team intel]
your team id = big bad                                    # имя вашей команды
your team is active = True                              # активна ли ваша команда
number of tanks in your team = 20              # количество танков в вашей команде
number of active tanks in your team = 20  # количество целых танков в вашей команде

[enemy intel]
number of active enemies = 1                         # количество активных противников
number of alive enemy tanks = 20                # количество действующих танков у всех противников в сумме
most powerful enemy team = small good    # наиболее сильная команда противника
most weak enemy team = small good           # наиболее слабая команда противника

[sat intel]
small good team approximate coords = 500,928    # с очень небольшой вероятностью в секции [sat intel] будут появляться приблизительные координаты команд противников

Формат файла с приказами.

В этом файле вы говорите серверу, что делают ваши танки:

[tank 0]
shoot x = 536 # Стреляем сюда (2 строчки с координатами x и y)
shoot y = 114
move x = 223 # Едем сюда (2 строчки с координатами x и y)
move y = 226

[tank 1]
shoot x = 324
shoot y = 325
move x = 323
move y = 326

и так далее.

Все значения параметров даны для примера. На разработку сервера ушло пока примерно 17 часов.

Вот в этом архиве можно найти живые примеры файлов: conf-2.zip.

Update 06.03.2017: Будьте внимательны, все файлы обрабатываются под линуксом, т.е. формат переноса строки там линуксовый (0x0A) и в блокноте откроется коряво, все слипается в одну строку. Слава Новиков это заметил и дал рекомендацию открывать для ознакомления эти файлы в MS Word.

Update 06.03.2017: Формат разделения строк, который будет использоваться на боевом сервере для всех файлов — 0x0A, т.е. линуксовый. Учитывайте это.

Update 06.03.2017: Формат самих файлов, которыми сервер общается с ботами — это формат конфигурационных файлов Windows, хотя он используется еще много где. Существуют готовые библиотеки, которые умеют парсить такие файлы независимо от формата разделения строк и так далее. В Python, например, это https://docs.python.org/2/library/configparser.html. В других языках, думаю, сами найдете.

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

Update 08.03.2017: Появился новый файл с полезной информацией для ботов, так называемый файл разведки. Что в нем есть для вас, указано где-то выше по тексту + появится еще одна секция.

Update 09.03.2017: В файле разведке есть параметр current cycle. Для получения номера текущего хода лучше переключиться на него, хотя файл cycle.txt по-прежнему обновляется. Нюанс в том, что cycle.txt один на все боты, а файл разведки для каждого бота свой.

Update 09.03.2017: В файле разведки появилась секция [sat intel]. В этой секции с малой вероятностью будут появляться приблизительные координаты команд противников. Чем меньше команда противника, тем меньше вероятность. Координаты очень приблизительные, рекомендую их использовать исключительно для определения направления. Если в команде противника остался один танк, то команда становится незасекаемой.

Update 09.03.2017: Количество танков в команде будет кратно 3, чтобы ровно делиться на 3 типа танков.

Update 10.03.2017: Для тех, у кого сложности с написанием базовых функций бота, выкладываю код бота, который используется для тестирования сервера. Он написан на python, отличается несгибаемым оптимизмом и непробиваемой глупостью. Написан полностью без ООП и без использования хитрых библиотек. Только списки, словари и функции. Однако, на его примере вы можете посмотреть как парсить файлы, считать расстояние и другие полезные моменты. Сама игровая логика бота — никакая, расчет движения сделан самым простым и тупым способом. Бот передвигает танки случайным образом и стреляет в ближайшую цель. Наверняка есть какие-то баги. Улучшайте, дописывайте, берите те элементы, которые пригодятся и приходите на соревнование в воскресенье. Код здесь: randombot-ugly.py

Update 11.03.2017: Для всех, кто гоняет ботов дома, есть возможность протестировать на живом сервере. Выкладываю всю папку с сервером и тремя рандомными ботами. Чтобы запустить все сразу — запускайте start.bat (запускаются сначала боты, потом сервер). Все основные настройки сервера находятся в файле config.conf (размер поля боя, количество танков и так далее). Чтобы протестировать СВОЕГО бота, проще всего отключить запуск одного из рандомных ботов и подменить его своим. Чтобы подсмотреть ход битвы — запустите bmap.html. Найденные баги — присылайте. Архив тут: _tanks.zip

Все это работает под Python 2.7. Библиотеки используемые сервером  все перечислены в начале скрипта сервера. Можете установить их самостоятельно или просто поставить анаконду: https://www.continuum.io/downloads

Найденные баги сервера:

  1. Выезд за пределы карты в отрицательные дали. Исправлено.
  2. Для видимых объектов координаты выгружались числами с плавающей точкой. Исправлено: теперь выгружаются целочисленные значения.
  3. Вероятность попадания при стрельбе считалась наоборот. Исправлено.
  4. Подбитые танки продолжали собирать разведывательную информацию и видели противника. Исправлено. Подбитые танки больше не ведут активную социальную жизнь.
  5. Подбитые танки продолжали кататься по полю. Исправлено.
  6. Иногда танки генерировались за пределами поля. В этом случае они становились бессмертными, много стреляли и вели себя плохо. Исправлено.

 

Share on FacebookShare on VKShare on Google+Tweet about this on TwitterShare on RedditPin on PinterestEmail this to someone

1 комментарий

  1. 13.03.2017

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

Добавить комментарий