Введение
Примечание. Текст, выделенный курсивом, будет реализован в следующих версиях
- Битва — сражение между одинаковыми роботами, управляемыми программами участников (далее именуются роботами)
- Битва проходит на прямоугольной карте заранее неизвестных размеров, которая состоит из полей. Все объекты в игре размером с поле. Битва происходит в пошаговом режиме
- Поля бывают следующих видов:
- обычное поле — обычное поле. По нему робот может проходить, может простреливать.
- преграда — не проходимое, не простреливаемое поле
- вода — не проходимое, но простреливаемое поле
- (?)«кусты» — проходимое, но не простреливаемое поле
- «зарядка» — поле с «зарядкой». Становясь на такое поле, робот получает боеприпас/энергию
- Роботы обладают следующими параметрами (у всех роботов на старте равными):
- Уровень жизни — заранее неизвестен. При каждом попадании в робота уменьшается на единицу. Не восстанавливается. При достижении нуля — робот погибает
- Боезапас — заранее неизвестен. При каждом выстреле робота уменьшается на единицу. Восстанавливается на полях «зарядки» боезапаса.
- Уровень энергии — заранее неизвестен. Каждый ход уменьшается на единицу. От уровня энергии зависит «меткость» робота (возможно в обратной геометрической прогрессии? тут надо подумать). Может восстанавливаться дружественными роботами, находящимися в соседнем поле, путем перекачивания своей энергии, в количестве (?) 10% от первоначальной энергии за ход
- Роботы управляются программами игроков, программам доступны следующие операции (одна за ход) над роботами:
- Операции перемещения:поворот влево, поворот вправо, шаг вперед
- Операция обзора: применив эту операцию (и соответственно постояв на месте), к началу следующего хода робот получает информацию о полях в радиусе 4 клеток от себя (тут опять же надо подумать, может лучше о квадрате вокруг себя, и размер тоже обдумать надо)
- Операция выстрела: выстрелить в противника в зоне видимости. Чем дальше до противника и меньше энергия стреляющего, тем меньше шансов попасть.
- Операция «Idle»: стоять, ничего не делать
- Операция «поделиться энергией»: В коммандной игре перекачать дружественному роботу, находящемуся в соседнем поле, свою энергию
- Операция сообщения: отослать дружественному роботу, находящемуся недалеко (или в зоне видимости) сообщение. Содержание и смысл сообщений должны заранее обсуждаться с союзниками
Кроме того, в начале хода роботу доступна информация о видимом впереди него секторе. (о его форме и размерах нужно подумать). В коммандной игре также роботу сообщаются сообщения дружеских роботов и их координаты, если в предыдущем ходе они были на достаточно близком расстоянии (или в зоне видимости, надо подумать)
Формат ввода - вывода для игровых скриптов
Вначале каждого хода программа получает по STDIN:
- Свое имя:
darvin_ROBOTHECH0066
После имени посылается
EON
- Карту:
#....#..#..........#....
........................
......####........##....
.###.........#.#........
........................
........................
#.......................
........................
..E....____$$$$$$$....A.
Все понятно:
WALL = "#"
GROUND = '.'
AMMO = "A"
ENERGY = "E"
FOREST = "$"
WATER = "_"
После карты посылается
EOM
- Параметры всех роботов (в json):
{
"ammo": 92,
"coord": [
5,
0
],
"energy": 100,
"live": 94,
"name": "darvin_ROBOTHECH0066",
"position": "^"
}
{
"ammo": 92,
"coord": [
0,
6
],
"energy": 100,
"live": 87,
"name": "P_r_i_m_a",
"position": "<"
}- ammo - боезапас
- coord - координаты x,y
- energy - уровень энергии
- live - уровень жизни
- name - имя робота, по нему можно узнать кто ты
- energy - куда смотрит робот (восток - >, запад - <, север - ^, юг - \/)
После списка роботов посылается
EOR
В python-sdk все это уже распарсено в удобный (относительно) вид
Потом программа должна выдать в STDOUT одну из комманд (только одну за ход):
Left
Right
Go
Idle
KillMe
Fire ИмяРобота
- Left - поворот налево
- Right - поворот направо
- Go - шаг вперед
- Idle - простой
- KillMe - самоубийство
- Fire ИмяРобота - выстрелить в ИмяРобота. Стрелять можно в любого робота, на любом расстоянии, но вероятность попадания сильно уменьшается с расстоянием, в любом направлении (это пока)
Далее идет следующий ход.