游戏
我们大多数人都知道Frogger,这是80年代的街机游戏,其目标是让青蛙安全地越过繁忙的高速公路和充满危险的池塘,安全地到达家中。
一个挑战是发行几个月前制定一个青蛙的克隆。但是,为什么可以在玩 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
我们有5条车道,每条车道宽23个,还有两个安全区(青蛙可以左右安全移动),也有23个车宽。您可能会忽略左右边框,因为它们是为了图形清晰。
我们的青蛙始于南部安全区的中心(第12个单元格),如@
上图中的a 所示。
游戏中的时间分为称为帧的离散步骤。Froggy是一种快速青蛙,可以每帧在任何方向(上,下,右,左)跳一个单元格。他还可以选择对任何帧保持静止。五个车道上的交通以恒定速度移动,如下所示:
- 快速车道西(车道1)的交通量每帧向左移动2个像元
- 死锁东车道(车道2)中的交通每第二帧向右移动1个像元
- 自由流动的西行车道(3道)上的交通每帧向左移动1个像元
- 死锁西车道(第4车道)的交通每第二帧向左移动1个像元
- 快速车道东(车道5)的交通量每帧移动2个像元
流量本身被唯一定义为大约。此文本文件中有 3,000个时间步。“交通”由车辆和车辆之间的空间组成。任何非空格的字符都是车辆的一部分。文本文件包含五行,分别对应于五个车道(顺序相同)。
对于西行车道,在第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 rep的赏金。
奖金
青蛙触碰到的游戏网格的每个角点时,其基本得分为+ 2.5%(最高+ 10%)。网格的四个角是两个安全区域的最左侧和最右侧的单元。
如果您的移动顺序使青蛙在整个模拟过程中都保持在青蛙起始格的左侧或右侧+/- 4个单元之内,则+ 25%的基本得分(当然,他可以自由地垂直移动)。
没有计分奖励,但是OP中的特殊道具将发给发布快速n'n脏解决方案验证程序的任何人,因此我不必编写程序。;)验证者只需接受一系列举动,确保其合法性(根据规则和交通量文件),并报告其得分(即过境总数)。
*总分数等于基本分数加奖金,四舍五入至最接近的整数。