[游戏攻略]《图灵完备》“迷宫”关卡

关卡描述

写一个程序,使得机器人能够抵达迷宫的终点。

架构说明

指令长度为8位。高2位为模式选择。

00:立即数模式,把0~63的数立即写入r0。

01:计算模式,这关卡没用到。

10:复制模式,其余就是寄存器的数字。前三位110代表输入,后三位110代表输出。111备用。

10 000 001 把r0复制给r1。10 110 011把输入复制给r3。

11:条件模式,检查r3,满足规定的条件就把r0的内容复制给程序计数器PC。

接下来是自定义的汇编别名:

imm:00 000 000

copy:10 000 000

jump:11 000 100(always总是跳转)

equal_0:如果r3=0,跳转。

not_equal_0:如果r3!=0,跳转。

r1:00 001 000

r2:00 010 000

to_r3:00 000 011

我个人认为“copy+r1+to_r3”的形式相当高超

10 000 000(copy)

00 001 000(r1)

00 000 011(to_r3)

他一共三个部分都是*正交的*。

过关思路

一种较为朴素的思路是:我们可以一直沿着墙壁的右侧走。换句话说,深度优先搜索。

这里我以右手紧贴墙壁做出说明。

计算机采用游戏前置关卡引导搭建的OVERTURE架构计算机。

机器人的面前有一格视野。每一刻会把视野的代码发送至系统的输入。

我们得通过把“机器人控制指令”的代码发送至系统的输出来操控机器人。

0:空气

1:墙

3:出口

8:金币。

非常幸运的是,金币只会呆在一个死胡同的末端。而不会位于一个十字路口。因此我们可以稍微地简略一下我们的代码。我将会展示它。

每当机器人处于一个位置时。我们检测其正前方的格子与其右侧的格子。然后我们就能得到一张行为表:

前面右边行为
0空气0空气右转
0空气1墙直行
1墙0空气右转
1墙1墙左转

这里不判断左边如何的解释:如果我这一步应该向前或者向右走,那么我根本不需要考虑左手边的是什么。当遇到左转通道(左转)或者死胡同(掉头)的时候。选择左转就会把情况变成前空右墙(直行)和前墙右墙(左转)

只要再经过1~2个循环就能自己出来。

综合行为表可以得到:只要右侧空了就右转,右侧没空前面是空气就直行,前面是墙就左转。

写完伪代码一看很简单啊!就是一个while里两层if嵌套就好了。但是这不是高级语言(死亡微笑)

这个代码的位置我想了半天,主要是但是没理解循环该放在哪里。后来猛然醒悟。

程序上面写满足条件执行的内容。下面写循环体。需要跳转的时候跳上来执行完了就跳下去。

下面是代码的基本流程

如果L33,L38,L39的满足了条件。他就会对应的跳入上方的代码区间内。在执行完对应的逻辑会回到end_if标记。这样就是一个变相的if语句判断。太伟大了jump

随后再执行41~55行。这一部会让机器人会看四个方向。而且不做判断直接尝试一下交互。如果交互成功了游戏会判定我们完成了(
会自己把程序停掉的

因为架构的缺陷程序必须被限制在63行以内。

缺陷与反思

1,幸好金币全是在死胡同里。如果出现在十字路口那么这个程序还要再加东西。

2,代码结尾的四个方向交互其实是一件非常浪费性能的事情。但是本文只作记录。而且这关过都过了暂时就先不优化了。

高亮代码

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值