Loderunner codenjoy — как играть?

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

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

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

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

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

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

На своем пути герой может повстречать золото и врага. За золото герой получит бонусные очки. За врага - штрафные :).

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

Каждый игрок может просверлить ямку в разрушаемой стене (есть еще неразрушаемые). Ямка со временем зарастает. Так можно спастись от охотника.

Штрафные очки так же предусмотрены за падение самого героя в свою или чужую ямку из которой он не сможет выбраться. Если ямка чужая - конкурент-участник получит очки.

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

Очки зарабатываются во время собирания золота и устранение конкурентов в ямках.

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

Итак, игрок регистрируется на сервере, указывая свой 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=☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼          $                 ☼☼###########################H☼☼   $              $        H☼☼H☼☼#☼☼H    H#########H $   H☼☼H $   H    H         H#####H☼☼H#☼#☼#H    H         H      ☼☼H     H~~~~H~~~~~~   H      ☼☼H     H    H  $  H###☼☼☼☼☼☼H☼☼H     H $  H#####H         H☼☼☼###☼##☼##☼H         H###H##☼☼☼###☼      H         H   H  ☼☼☼$  ☼      H   ~~~}~~H   H $☼☼########H###☼☼☼☼     H  ####☼☼        H     $      H      ☼☼###########################H☼☼    $                      H☼☼#######H#######            H☼☼       H~~~~~~~~~~     $   H☼☼       H    ##H   #######H##☼☼       H    ##H          H  ☼☼##H#####    ########H#######☼☼  H     ►   $       H       ☼☼#########H##########H       ☼☼         H          H       ☼☼       $ H~~~~~~~~~~H   $   ☼☼    H######         #######H☼☼    H           $          H☼☼###########################H☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼

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

☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼
☼          $                 ☼
☼###########################H☼
☼   $              $        H☼
☼H☼☼#☼☼H    H#########H $   H☼
☼H $   H    H         H#####H☼
☼H#☼#☼#H    H         H      ☼
☼H     H~~~~H~~~~~~   H      ☼
☼H     H    H  $  H###☼☼☼☼☼☼H☼
☼H     H $  H#####H         H☼
☼☼###☼##☼##☼H         H###H##☼
☼☼###☼      H         H   H  ☼
☼☼$  ☼      H   ~~~}~~H   H $☼
☼########H###☼☼☼☼     H  ####☼
☼        H     $      H      ☼
☼###########################H☼
☼    $                      H☼
☼#######H#######            H☼
☼       H~~~~~~~~~~     $   H☼
☼       H    ##H   #######H##☼
☼       H    ##H          H  ☼
☼##H#####    ########H#######☼
☼  H     ►   $       H       ☼
☼#########H##########H       ☼
☼         H          H       ☼
☼       $ H~~~~~~~~~~H   $   ☼
☼    H######         #######H☼
☼    H           $          H☼
☼###########################H☼
☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼

Первый символ строки соответствует ячейке расположенной в левом верхнем углу и имеет координату [0, 0]. В этом примере — позиция героя (символ ►) — [9, 22].

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

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

NONE(' ')

Cтена в которой можно просверлить дырочку слева или справа от героя (в зависимости от того, куда он сейчас смотрит)

BRICK('#')

Стена со временем зарастает. Когда процес начинается - мы видим таймер

PIT_FILL("1234")

Неразрушаемая стена - в ней ничего просверлить не получится

UNDESTROYABLE_WALL('☼')

В момент сверления мы видим процесс так

DRILL_PIT('*')

Золото - его надо собирать

GOLD('$')

Лестница и труба - по ним можно перемещаться по уровню

LADDER('H')
PIPE('~')

Твой герой в зависимости от того, чем он сейчас занят отображается следующими символами

HERO_DIE('Ѡ')
HERO_DRILL_LEFT('Я')
HERO_DRILL_RIGHT('R')
HERO_LADDER('Y')
HERO_LEFT('◄')
HERO_RIGHT('►')
HERO_FALL_LEFT(']')
HERO_FALL_RIGHT('[')
HERO_PIPE_LEFT('{')
HERO_PIPE_RIGHT('}')

Герои других игроков, соответственно

OTHER_HERO_DIE('Z')
OTHER_HERO_LEFT(')')
OTHER_HERO_RIGHT('(')
OTHER_HERO_LADDER('U')
OTHER_HERO_PIPE_LEFT('Э')
OTHER_HERO_PIPE_RIGHT('Є')

Так же и враг-охотник

ENEMY_LADDER('Q')
ENEMY_LEFT('«')
ENEMY_RIGHT('»')
ENEMY_PIPE_LEFT('<')
ENEMY_PIPE_RIGHT('>')
ENEMY_PIT('X')

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

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

Если вдруг герой попал в ловушкуц и выбраться оттуда он не может - вызови команду ACT(0) и герой совершит акт суицида, после чего он появится в новом месте.

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