Надо написать своего бота для змейки, который обыграет других ботов по очкам. Все играют на одном поле. Змейка может передвигаться по свободным ячейкам во все четыре стороны, но не может возвращаться в предыдущую клетку. Ваша задача – заставить вашу змейку следовать придуманному алгоритму. Алгоритм змейки должен блокировать (и тем самым уничтожать) змей соперников, используя бонусы.
Игра пошаговая, каждую секунду сервер посылает твоему клиенту (боту) состояние обновленного поля на текущий момент и ожидает ответа команды герою. За следующую секунду игрок должен успеть дать команду герою. Если не успел — змейка продолжает движение в прежнем направлении(изначальное направление - направо). На своем пути змейка может повстречать камень, стенку, золото, таблетку ярости, яблоко или другую змейку. Единоразово на поле присутствует по 5 змеек.
Побеждает игрок с большим числом очков (до условленного времени). Мертвая змейка тут же появляется на одном из свободных стартовых полей и ждёт начала следующего раунда (события старта).
Если змейка нарвётся на камень
- уменьшается.Если змейка меньше двух клеток
- погибнет.За золото, яблоки, в случае убийства других змеек
- змейка получит бонусные очки.За свою смерть и за камни
- штрафные.- Очки суммируются.
Негативные воздействия:
- Змейка, врезавшаяся в стену, погибает.
- Змейка, врезавшаяся в другую змейку, погибает.
- Змейка должна быть не менее 2х клеток длиной, иначе она погибает.
- Змейка, съевшая камень, укорачивается на 3 единицы (если становится меньше 2 - погибает).
Позитивные воздействия:
- Змейка, съевшая яблоко, увеличивается на 1.
- Змейка, съевшая таблетку ярости, в течении 10 ходов может откусывать куски от других змей, а так же поедать камни без уменьшения длины.
- Змейка, съевшая золото, просто получает дополнительные очки.
Особые случаи:
- Змеям разрешено откусывать свой собственный хвост. При этом длина змеи уменьшается, больше никаких последствий.
- При столкновении змей лоб в лоб, меньшая змея погибает. Большая змея при этом укорачивается на длину меньшей. (если становится меньше 2, тоже погибает)
- При столкновении двух змей, всегда побеждает змея, находящаяся под воздействием таблетки ярости.
- При столкновении двух змей, когда обе под воздействием таблетки ярости, действуют обычные правила столкновений.
- Если первой была передана команда ACT - то оставляется камень на поле, если имеется таковая возможность. Камень будет оставлен на той клетке, где на данный момент времени находится хвост змейки.
- Происходит обработка перемещения змеек.
- Происходит обработка драки змеек.
- Происходит обработка поедания змейками объектов на новой точке.
- Снова происходит обработка драки змеек.
- Воссоздаются новые объекты взамен тех, что были съедены змейками.
- Если команда ACT была передана после команды на передвижение змейки - то оставляется камень на поле, если имеется таковая возможность. Камень будет оставлен на той клетке, где на данный момент времени находится хвост змейки.
- Вычисляется направление движения для каждой змейки. Если от пользователя не поступило никакой команды, то змейка продолжит двигаться в предыдущем направлении. Сразу после старта движение по умолчанию - направо. Если поступила команда змейке на разворот на 180 градусов (то есть если змейка смотрела вверх, а пришла команда двигаться вниз), то такая команда будет проигнорирована, змейка продолжит двигаться в прежнем направлении.
- Для каждой змейки проходит проверка на то, должна ли её длина быть сокращена. Если да – то проверяется, не погибает ли змейка от такого сокращения, после чего длина змейки сокращается.
- Сокращается количество оставшихся тиков для действия таблетки ярости, если таковая была активна.
- Производится проверка, что если змейка сама с собой пересекается на новой точке – тогда откусывается всё её тело от кончика хвоста до точки пересечения. Змейка при этом не погибает, так как минимальная длина - 2 единицы, а перекусить саму себя и оставить при этом длину меньше 2 единиц не представляется возможным.
- Происходит перемещение змейки на новую клетку. То есть голова змейки передвигается на новую клетку, её шея передвигается на ту клетку, где ранее была голова и т.д.
- Для каждой змейки находим, есть ли змейки, на голову которых зашла головой текущая змейка. Под головой понимается непосредственно голова змейки + её шея, то есть клетка сразу за головой змейки.
- Если таковая имеется, то дальше обрабатываем ситуации с таблетками ярости. 2.1. Если текущая змейка в ярости, а вражеская нет - то убиваем вражескую змейку. 2.2. Если текущая змейка не в ярости, а вражеская в ярости - то текущая змейка умирает. 2.3. Если обе змейки в ярости или обе не в ярости - то от каждой отрезаем длину другой змейки. То есть, если столкнулись две змейки длиной в 5 и в 7 единиц, то змейка длиной в пять погибает, так как 5-7<2, а змейка длиной в 7 принимает длину 2 единицы.
- Если не было змейки, на голову которой зашла головой текущая змейка - то ищем змейку, на тело которой зашла текущая змейка.
- Если таковые имеются, то тогда проверяем, а текущая змейка находится под таблеткой ярости или нет: 4.1. Если да - тогда от вражеской змейки отгрызаем всё от хвоста до места куся. 4.2. Если нет - то текущая змейка погибает.
Проверяется позиция головы змейки:
- Если там находится яблоко - то увеличивается длина змейку на 1 и засчитываем очки за поедание яблока.
- Если там находится камень - то увеличивается количество съеденных камней на 1 и сокращаем текущую длину змейки, если змейка не находится в состоянии ярости. Если находится - тогда змейка спокойно проглатывает камень без негативных последствий для себя.
- Если там находится таблетка ярости - тогда она съедаются, то есть эта таблетка становится активна уже на этом тике.
- Если там находится стена - тогда змейка погибает.
- Если там находится монетка – тогда она съедается и за неё начисляются бонусные очки.
- За монетку даётся +10 очков.
- За яблоко даётся +1 очко.
- За камень даётся +5 очков.
- За уничтожение соперника +10 умножить на длина соперника очков.
- За победу в раунде даётся +110 очков.
- Регистрируетесь на сервере.
- Скачиваете шаблоны клиентов и выбираете тот, который будете модифицировать для себя.
- После входа в игру копируете URL из адресной строки браузера полностью, как есть.
- Вставляете URL в строку подключения в клиенте.
После подключения, клиент через вебсокет будет регулярно (каждую секунду) получать строку символов с закодированным состоянием игрового поля. Само игровое поле извлекается из ответа сервера регулярным выражением:
^board=(.*)$
Длинна строки равна площади поля. Если вставить символ переноса строки каждые sqrt(length(string)) символов, то получится читабельное изображение поля. Пример ответа сервера с игровым полем:
☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼
☼☼ ☼
☼☼ $ ☼
☼☼ @☼
☼# ▲☼
☼☼ ║☼
☼☼ ○ ║☼
☼# ║☼
☼☼ ╘═╝☼
☼☼ % ☼
☼☼ ×—> ☼
☼☼ ☼
☼☼ ● ☼
☼☼ ☼
☼☼☼☼☼☼☼☼☼☼☼☼☼☼☼
- Первый символ строки соответствует ячейке, расположенной в левом верхнем углу и имеет координату
[0, 0]
. Последний символ, соответственно, соответствует правому нижнему углу игрового поля[n, n]
- Максимальное количество игроков определяется количеством стартовых точек на карте.
Расшифровка символов игрового поля:
NONE(' ')
Пустое место – по которому может двигаться геройWALL('☼')
Cтена, через которую нельзя пройтиSTART_FLOOR('#')
Стартовая точка. Отсюда начинает движение змейкаAPPLE('○')
ЯблокоSTONE('●')
Гиря (Камень)FURY_PILL('®')
Маска дьявола (Таблетка ярости)GOLD('$')
ЗолотоHEAD_DOWN('▼')
Голова змейки игрока в направлении внизHEAD_LEFT('◄')
Голова змейки игрока в направлении влевоHEAD_RIGHT('►')
Голова змейки игрока в направлении вправоHEAD_UP('▲')
Голова змейки игрока в направлении вверхHEAD_DEAD('☻')
Голова мёртвой змейки игрокаHEAD_EVIL('♥')
Голова змейки игрока со сверхспособностью "ярость"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('˅')
Голова змейки соперника в направлении внизNEMY_HEAD_LEFT('<')
Голова змейки соперника в направлении влевоENEMY_HEAD_RIGHT('>')
Голова змейки соперника в направлении вправоENEMY_HEAD_UP('˄')
Голова змейки соперника в направлении вверхENEMY_HEAD_DEAD('☺')
Голова мёртвой змейки соперникаENEMY_HEAD_EVIL('♣')
Голова змейки соперника со сверхспособностью "ярость"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('└')
Вариант расположения тела активной змейки игрока
Команд несколько:
UP
DOWN
LEFT
RIGHT
– приводят к движению героя в заданном направлении на 1 клетку;ACT
- оставить камень (если есть съеденные камни).
Камень остаётся на месте хвоста змейки. При помощи камней можно строить препядствия и блокировать соперников. Команды движения можно комбинировать с командой ACT, разделяя их через запятую – это значит что за один такт игры будет оставлен камень, а потом движение LEFT, ACT
или наоборот ACT, LEFT
. Если передать команду ACT(0)
, то змейка тут же погибнет.
Удачи! И пусть победит хитрейший! =)
Если не знаете что написать, попробуйте реализовать следующие варианты алгоритмов:
- Перемещение в случайную сторону, если соответствующая клетка свободна.
- Движение на свободную клетку в сторону ближайшего яблока.
- Движение к тому яблоку, добраться до которого можно быстрее других.
- Уклонение от более длинных соперников и от соперников в состоянии ярости.
- Блокировка собой предполагаемых маршрутов соперника.
- Нет, более 2х команд подряд в одном тике не сработают ☹
- Нет,
ACT,ACT
илиLEFT,UP
не сработают - считай, что это пропуск хода - Нет, если отправить невалидную команду, сервер не упадет