Snake Battle — как играть?

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

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

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

Проект игры (для написания своего бота) брать ЗДЕСЬ

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

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

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

На своем пути змейка может повстречать камень, золото, таблеку ярости, таблетку полёта, яблоко или другую змейку. Если змейка нарвется на камень - уменьшается на 4 единицы. Если змейка меньше двух клеток - погибнет. За золото, яблоки, в случае смерти других змеек, змейка получит бонусные очки. За свою смерть и за камни - штрафные. Очки суммируются.

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

Итак, игрок регистрируется на сервере, указывая свой 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, его ты можешь получить из адресной строки браузера после регистрации/логина

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

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

Разбор поля в читабельный вид тоже уже выполнен.

Пример поля:

В текстовом виде

                             ☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼
                             ☼☼            ☼
                             ☼☼     $      ☼
                             ☼☼           @☼
                             ☼#           ▲☼
                             ☼☼           ║☼
                             ☼☼   ○       ║☼
                             ☼#           ║☼
                             ☼☼         ╘═╝☼
                             ☼☼      %     ☼
                             ☼☼   ×—>      ☼
                             ☼☼            ☼
                             ☼☼       ●    ☼
                             ☼☼            ☼
                             ☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼

UI из спрайтов:

Расшифровка символов в файле Elements:

Пустое место – по которому может двигаться герой
NONE(' ')
Cтена, через которую нельзя пройти
WALL('☼')
Стартовая точка. Отсюда начинает движение змейка
START_FLOOR('#')
Яблоко
APPLE('○')
Гиря (Камень)
STONE('●')
Ангельские крылья (Таблетка полёта)
FLYING_PILL('©')
Маска дьявола (Таблетка ярости)
FURY_PILL('®')
Золото
GOLD('$')
Голова змейки игрока в направлении вниз
HEAD_DOWN('▼')
Голова змейки игрока в направлении влево
HEAD_LEFT('◄')
Голова змейки игрока в направлении вправо
HEAD_RIGHT('►')
Голова змейки игрока в направлении вверх
HEAD_UP('▲')
Голова мёртвой змейки игрока
HEAD_DEAD('☻')
Голова змейки игрока со сверхспособностью "ярость"
HEAD_EVIL('♥')
Голова змейки игрока со сверхспособностью "полет"
HEAD_FLY('♠')
Голова неактивной змейки игрока
HEAD_SLEEP('&')
Хвост змейки игрока повернутый вниз
TAIL_END_DOWN('╙')
Хвост змейки игрока повернутый влево
TAIL_END_LEFT('╘')
Хвост змейки игрока повернутый вверх
TAIL_END_UP('╓')
Хвост змейки игрока повернутый вправо
TAIL_END_RIGHT('╕')
Тело неактивной змейки игрока
TAIL_INACTIVE('~')
Вариант расположения тела активной змейки игрока
BODY_HORIZONTAL('═')
Вариант расположения тела активной змейки игрока
BODY_VERTICAL('║')
Вариант расположения тела активной змейки игрока
BODY_LEFT_DOWN('╗')
Вариант расположения тела активной змейки игрока
BODY_LEFT_UP('╝')
Вариант расположения тела активной змейки игрока
BODY_RIGHT_DOWN('╔')
Вариант расположения тела активной змейки игрока
BODY_RIGHT_UP('╚')
Голова змейки соперника в направлении вниз
ENEMY_HEAD_DOWN('˅')
Голова змейки соперника в направлении влево
ENEMY_HEAD_LEFT('<')
Голова змейки соперника в направлении вправо
ENEMY_HEAD_RIGHT('>')
Голова змейки соперника в направлении вверх
ENEMY_HEAD_UP('˄')
Голова мёртвой змейки соперника
ENEMY_HEAD_DEAD('☺')
Голова змейки соперника со сверхспособностью "ярость"
ENEMY_HEAD_EVIL('♣')
Голова змейки соперника со сверхспособностью "полет"
ENEMY_HEAD_FLY('♦')
Голова неактивной змейки соперника
ENEMY_HEAD_SLEEP('ø')
Хвост змейки соперника повернутый вниз
ENEMY_TAIL_END_DOWN('¤')
Хвост змейки соперника повернутый влево
ENEMY_TAIL_END_LEFT('×')
Хвост змейки соперника повернутый вверх
ENEMY_TAIL_END_UP('æ')
Хвост змейки соперника повернутый вправо
ENEMY_TAIL_END_RIGHT('ö')
Тело неактивной змейки соперника
ENEMY_TAIL_INACTIVE('*')
Вариант расположения тела активной змейки игрока
ENEMY_BODY_HORIZONTAL('—')
Вариант расположения тела активной змейки игрока
ENEMY_BODY_VERTICAL('|')
Вариант расположения тела активной змейки игрока
ENEMY_BODY_LEFT_DOWN('┐')
Вариант расположения тела активной змейки игрока
ENEMY_BODY_LEFT_UP('┘')
Вариант расположения тела активной змейки игрока
ENEMY_BODY_RIGHT_DOWN('┌')
Вариант расположения тела активной змейки игрока
ENEMY_BODY_RIGHT_UP('└')

Элементы туловища и хвоста змеек можно посмотреть в файле Elements.

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

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

Ваша задача – заставить вашу змейку следовать придуманному алгоритму. Алгоритм змейки должен блокировать (и тем самым уничтожать) змей соперников, используя бонусы. Основная задача – вести осмысленную игру и победить.

Правила борьбы:

Негативные воздействия:
Змейка, врезавшаяся в стену, погибает.
Змейка, врезавшаяся в другую змейку, погибает.
Змейка должна быть не менее 2х клеток длиной, иначе она погибает.
Змейка, съевшая камень, укорачивается на 3 единицы (если становится меньше 2 - погибает).

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

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

Удачи! И пусть победит хитрейший! =)

Подсказки:
Для реализации своего алгоритма можно использовать уже готовый класс DeikstraFindWay и (в частности) метод getShortestWay().
Если не знаете что написать, попробуйте реализовать следующие варианты алгоритмов:
- Перемещение в случайную сторону, если соответствующая клетка свободна.
- Движение на свободную клетку в сторону ближайшего яблока.
- Движение к тому яблоку, добраться до которого можно быстрее других.
- Уклонение от более длинных соперников и от соперников в состоянии ярости.
- Блокировка собой предполагаемых маршрутов соперника.

Максимальное количество игроков определяется количеством стартовых точек на карте.(15 для текущей карты)