Battlecity codenjoy — how to play?

Игровой demo-сервер доступен так же в интернете 24/7 в целях ознакомления http://codenjoy.com/codenjoy-contest

Игра с открытым исходным кодом. Для реализации своей игры, исправления ошибок в текущей и внесения других правок необходимо для начала форкнуть проект. В корне репозитория есть описание в файле Readme.md - там описано, что делать дальше.

По возникающим вопросам, пиши в skype:alexander.baglay или на почту apofig@gmail.com

В чем суть игры?

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

За убийство врагов боту игрока начисляются очки. За смерть танка начисляются штрафные очки. Очки суммируются. Побеждает игрок с большим числом очков (до условленного времени). Мертвый танк тут же появляется в random месте на поле.

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

Есть несколько видов призов. Каждый из которых на время дает танку определенное преимущество. Подобраный во время игры приз PRIZE_IMMORTALITY делает танк игрока неуязвимым к вражеским снарядам. А приз PRIZE_WALKING_ON_WATER даст возможность ходить по воде. Приз PRIZE_BREAKING_WALLS позволит пробивать стены. Приз действует некоторое время. Каждый четный тик игры приз 'мерцает' символом PRIZE.

Итак, игрок регистрируется на сервере, указывая свой email

Далее необходимо подключиться из кода к серверу через вебсокеты. Это Maven проект и подойдет он для игры на JVM языках. Как его запустить смотри в корне проекта в файле README.txt

Для других языков придется написать свой клиент (а после пошарить с нами на почту: apofig@gmail.com)

Адрес для подключения к игре на сервере http://codenjoy.com:

ws://codenjoy.com:80/codenjoy-contest/ws?user=3edq63tw0bq4w4iem7nb&code=12345678901234567890

Адрес для подключения к игре на сервере, развернутом в локальной сети:

ws://server_ip:8080/codenjoy-contest/ws?user=3edq63tw0bq4w4iem7nb&code=12345678901234567890

Тут 'user' - id игрока, a 'code' - твой security token, его ты можешь получить из адресной строки браузера после регистрации/логина

После подключения клиент будет регулярно (каждую секунду) получать строку символов — с закодированным состоянием поля. Формат таков

^board=(.*)$

с помощью этого regexp можно выкусить строку доски. Вот пример строки от сервера:

board=☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼             ☼☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼☼ ╬ ╬ ╬ ╬ ╬˅╬ ☼☼ ╬ ╬˂╬ ╬ ╬ ╬ ☼☼ ╬ ╬ ╬ ╬ ╬•╬ ☼☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼☼ ╬ ╬ ╠ ╬ ╬ ╬ ☼☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼☼ ╬▲╬ ╬ ╬ ╬ ╬ ☼☼             ☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼

Длинна строки равна площади поля. Если вставить символ переноса строки каждые sqrt(length(string)) символов, то получится читабельное изображение поля.

☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼
☼             ☼
☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼
☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼
☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼
☼ ╬ ╬ ╬ ╬ ╬˅╬ ☼
☼ ╬ ╬˂╬ ╬ ╬ ╬ ☼
☼ ╬ ╬ ╬ ╬ ╬•╬ ☼
☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼
☼ ╬ ╬ ╠ ╬ ╬ ╬ ☼
☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼
☼ ╬ ╬ ╬ ╬ ╬ ╬ ☼
☼ ╬▲╬ ╬ ╬ ╬ ╬ ☼
☼             ☼
☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼

Первый символ строки соответствует ячейке расположенной в левом нижнем углу и имеет координату [0, 0]. В этом примере — позиция танка (символ ▲) — [3, 2], а снаряда (символ •) - [11, 7].

Расшифровка символов

Пустое место – по которому может двигаться танк

NONE(' ')

Неразрушаемая стена

BATTLE_WALL('☼')

Уничтоженный танк игрока (уже в следующую секунду появится новый)

BANG('Ѡ')

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

ICE('#')

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

TREE('%')

Река не позволяет через себя проезжать (без приза PRIZE_WALKING_ON_WATER), но снаряды пролетают воду без препятствий. Танк застрявший посреди воды, заехавший туда с призом PRIZE_WALKING_ON_WATER может передвигаться по воде раз в N количество тиков (штраф).

RIVER('~')

Далее следуют изображения разрушаемых стен. Цифры тут указывают на количество выстрелов, необходимых для разрушения стен полностью. Cтены со временем восстанавливаются.

WALL('╬', 3)
WALL_DESTROYED_DOWN('╩', 2)
WALL_DESTROYED_UP('╦', 2)
WALL_DESTROYED_LEFT('╠', 2)
WALL_DESTROYED_RIGHT('╣', 2),
WALL_DESTROYED_DOWN_TWICE('╨', 1)
WALL_DESTROYED_UP_TWICE('╥', 1)
WALL_DESTROYED_LEFT_TWICE('╞', 1)
WALL_DESTROYED_RIGHT_TWICE('╡', 1)
WALL_DESTROYED_LEFT_RIGHT('│', 1)
WALL_DESTROYED_UP_DOWN('─', 1)
WALL_DESTROYED_UP_LEFT('┌', 1)
WALL_DESTROYED_RIGHT_UP('┐', 1)
WALL_DESTROYED_DOWN_LEFT('└', 1)
WALL_DESTROYED_DOWN_RIGHT('┘', 1)

Это снаряд, как дружественный так и вражеский

BULLET('•')

Танк игрока

TANK_UP('▲')
TANK_RIGHT('►')
TANK_DOWN('▼')
TANK_LEFT('◄')

Вражеский танк игрока-соперника

OTHER_TANK_UP('˄')
OTHER_TANK_RIGHT('˃')
OTHER_TANK_DOWN('˅')
OTHER_TANK_LEFT('˂')

Танк-бот (AI-бот или автобот) - ездит по достаточно глупым правилам и добавляет энтропии на поле

AI_TANK_UP('?')
AI_TANK_RIGHT('»')
AI_TANK_DOWN('¿')
AI_TANK_LEFT('«')

Танк-бот так же может быть призовым, тогда он раз в несколько тиков подсвечивается этим спрайтом

AI_TANK_PRIZE('◘')

Приз выпавший после танка на поле мерцает каждый четный тик игры этим спрайтом

PRIZE('!')

Приз, временно дающий неуязвимость

PRIZE_IMMORTALITY('1')

Приз, позволяющий временно разрушать стенки 1 выстрелом (даже неразрушаемые, но только не границу поля)

PRIZE_BREAKING_WALLS('2')

Приз, позволяющий временно ездить по воде

PRIZE_WALKING_ON_WATER('3')

Игра пошаговая, каждую секунду сервер посылает твоему клиенту (боту) состояние обновленного поля на текущий момент и ожидает ответа команды танку. За следующую секунду игрок должен успеть дать команду танку. Если не успел — танк остается на месте.

Команд несколько: UP, DOWN, LEFT, RIGHT – приводят к развороту и передвижению танка в заданном направлении на 1 клетку; ACT - выстрел снаряда. Команды движения можно комбинировать с командами выстрела, разделяя их через запятую – это значит что за один такт игры будет выстрел, а потом движение (LEFT, ACT) или наоборот (ACT, LEFT)

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