Игра
Большинство из нас знает о Frogger , аркадной игре 80-х годов, цель которой - безопасно перелезть лягушке через оживленную трассу и заполненный опасными водоемами, чтобы благополучно добраться до дома.
Несколько месяцев назад была поставлена задача разработать клон Frogger. Но зачем клонировать Frogger, когда можно играть в Frogger? :)
Рассмотрим следующую упрощенную игровую сетку:
XXXXXXXXXXXXXXXXXXXXXXX North Safe Zone
-----------------------
| | <<<< Express Lane West (Lane 1)
| | > Gridlock East (Lane 2)
| | << Freeflowing Traffic West (Lane 3)
| | < Gridlock West (Lane 4)
| | >>>> Express Lane East (Lane 5)
-----------------------
XXXXXXXXXXX@XXXXXXXXXXX South Safe Zone
\__________ __________/
'
23 cells horizontally
У нас есть пять полос движения, каждая шириной 23 ячейки, и две безопасные зоны (где лягушка может безопасно перемещаться влево и вправо), также шириной 23 ячейки. Вы можете игнорировать правую и левую границы, так как они для наглядности.
Наша лягушка начинается в южной безопасной зоне, в центральной (12-й) ячейке, как показано на @
рисунке выше.
Время в игре делится на отдельные шаги, называемые кадрами. Froggy - быстрая лягушка, которая может прыгать на одну клетку в любом направлении (вверх, вниз, вправо, влево) за кадр. Он также может остаться на любом кадре. Движение по пяти полосам движения происходит с постоянной скоростью следующим образом:
- движение в экспресс-полосе на запад (полоса 1) перемещается на 2 ячейки влево на каждый кадр
- движение в безвыходном положении на восточной полосе (полоса 2) перемещается на 1 ячейку вправо каждый второй кадр
- движение в свободном потоке на западную полосу движения (полоса 3) перемещается на 1 ячейку влево на каждый кадр
- движение в тупике западная полоса (полоса 4) перемещается на 1 ячейку влево каждый второй кадр
- движение на экспресс-полосе на восток (полоса 5) перемещается на 2 ячейки вправо каждый кадр
Сам трафик однозначно определен для ок. 3000 шагов в этом текстовом файле . «Движение» состоит из транспортных средств и пространства между транспортными средствами. Любой персонаж, который не является пробелом, является частью транспортного средства. Текстовый файл содержит пять строк, соответствующих пяти полосам трафика (в том же порядке).
Для западных полос движения в начале кадра 0 (начало игры) мы считаем, что первое транспортное средство на полосе движения находится прямо за правым краем игровой сетки.
Для полос движения в восточном направлении дорожную полосу следует считать «задом наперед» в том смысле, что транспортные средства появляются в конце строки. В начале кадра 0 мы считаем, что первый автомобиль на этих дорожках находится чуть дальше левого края игрового поля.
Рассмотрим в качестве примера:
Traffic Lane 1: [|==| =
Traffic Lane 2: |) = o
Traffic Lane 3: (|[]-[]:
Traffic Lane 4: <| (oo|
Traffic Lane 5: |==|] :=)
Тогда игровая сетка будет выглядеть следующим образом:
Start of Frame 0 XXXXXXXXXXXXXXXXXXXXXXX
[|==| =
|) = o
(|[]-[]:
<| (oo|
|==|] :=)
XXXXXXXXXXXXXXXXXXXXXXX
Start of Frame 1 XXXXXXXXXXXXXXXXXXXXXXX
[|==| =
|) = o
(|[]-[]:
<| (oo|
|==|] :=)
XXXXXXXXXXXXXXXXXXXXXXX
Start of Frame 2 XXXXXXXXXXXXXXXXXXXXXXX
[|==| =
|) = o
(|[]-[]:
<| (oo|
|==|] :=)
XXXXXXXXXXXXXXXXXXXXXXX
Start of Frame 3 XXXXXXXXXXXXXXXXXXXXXXX
[|==| =
|) = o
(|[]-[]:
<| (oo|
|==|] :=)
XXXXXXXXXXXXXXXXXXXXXXX
После того, как весь трафик на линии «исчерпан» (т. Е. Заканчивается строка), мы считаем все символы в строке пробелами.
Наша лягушка сплющивается, если происходит любое из следующего:
- лягушка занимает клетку, занятую транспортным средством, на любом кадре
- лягушка остается неподвижной в экспресс-полосе, и транспортное средство шириной 1 ячейка проезжает над ним в этой раме
- лягушка прыгает на восток "через" транспортное средство, направляющееся на запад, или прыгает на запад через транспортное средство, направляющееся на восток
- лягушка выпрыгивает за пределы игровой сетки 7 (линия) на 23 (клетка) в любом кадре
Обратите внимание, что это единственные условия, при которых лягушка сплющивается. В частности, допускается прыгание лягушки по трафику «с», равно как лягушка прыгает в или из ячейки на экспресс-полосе, которую проезжает транспортное средство шириной 1 в той же раме.
Цель и оценка
Цель задачи программирования - перевести лягушку через дорогу как можно больше раз, прежде чем последний автомобиль покинет игровую сетку . То есть программа завершается сразу после завершения кадра X , где кадр X - это первый кадр, который переводит сетку в состояние, когда больше нет транспортных средств.
Вывод вашей программы должен быть строкой (или текстовым файлом), содержащей последовательность ходов лягушки с использованием следующей кодировки:
< frog moves left
> frog moves right
^ frog moves up
v frog moves down
. frog remains stationary
Например, строка <<^.^
указывает, что лягушка дважды перемещается влево, затем вверх, затем делает паузу на один кадр, а затем снова поднимается вверх.
Один балл оценивается, когда лягушка пересекает южную безопасную зону в северную безопасную зону, а один балл - когда лягушка пересекает северную безопасную зону в южную безопасную зону.
Некоторые важные правила:
- Лягушка не должна быть раздавлена.
- Пожалуйста, опубликуйте свое решение (последовательность шагов) вместе с программным кодом, встроенным или в виде текстового файла (например, с использованием pastebin.com).
- Наша лягушка является дальновидной и предвидящей, поэтому ваша программа может использовать любые данные о трафике в любом кадре, находя решения. Сюда входят данные о трафике, который еще не достиг игровой сетки.
- Сетка не оборачивается. Выход из сетки вызовет сплющивание лягушки и, следовательно, не допускается.
- Ни в коем случае трафик не «сбрасывается» или лягушка «телепортируется». Симуляция непрерывная.
- Лягушка может вернуться в южную безопасную зону после выхода из нее, но это не считается точкой. Аналогично для северной безопасной зоны.
- Победителем конкурса является программа, которая генерирует последовательность ходов, дающую наибольшее количество пересечений.
- Любые дополнительные вопросы или проблемы, пожалуйста, не стесняйтесь задавать в разделе комментариев.
Для некоторого дополнительного стимула я добавлю награду +100 повторений к победившей программе, когда смогу это сделать.
Бонусы
+ 2,5% к базовому счету * (до + 10%) за каждый угол игровой сетки, к которой прикоснулась лягушка. Четыре угла сетки являются самыми левыми и правыми ячейками двух безопасных зон.
+ 25% к базовому счету *, если ваша последовательность движений удерживает лягушку в пределах +/- 4 клетки слева или справа от его начальной клетки в течение всего моделирования (он, конечно, может свободно перемещаться по вертикали).
Бонус за выигрыш отсутствует, но специальные реквизиты в ОП будут доступны всем, кто публикует быстрый и грязный валидатор решений, так что мне не нужно его программировать. ;) Валидатор просто примет последовательность ходов, обеспечит ее законность (согласно правилам и файлу трафика) и сообщит свою оценку (т. Е. Общее количество пересечений).
* Общая оценка равна базовой оценке плюс бонус, округленный до ближайшего целого числа.