电玩圈游戏网 搜一搜

安卓手游去频道 >

角色扮演 射击枪战 棋牌卡牌 体育运动 角色扮演 赛车竞速 休闲益智 音乐舞蹈 模拟经营 战棋塔防 推理解谜 策略战争

安卓应用去频道 >

社交通讯 系统工具 影音视听 拍摄美化 效率办公 学习教育 生活服务 旅游出行 资讯阅读 金融理财 网络购物 游戏助手

游戏视频去频道 >

动作冒险 射击枪战 棋牌卡牌 体育运动 角色扮演 赛车竞速 音乐舞蹈 模拟经营 战棋塔防 推理解谜 策略战争 休闲益智

资讯攻略去频道 >

手游资讯 手游攻略 手游问答 游戏资讯 游戏杂谈 游戏攻略 软件教程 软件资讯

专题合集去频道 >

游戏专题 应用专题

排行榜单去频道 >

游戏排行 应用排行
首页 游戏 应用 视频 资讯 专题 榜单

首页>资讯>手游攻略>深圳SHENZHENIO阿瓦隆城第6关寿司机器人攻略

深圳SHENZHENIO阿瓦隆城第6关寿司机器人攻略

作者:佚名来源:百度2022/07/04

深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看阿瓦隆城第6关寿司机器人的攻略吧。

关卡展示

本关的 C2S-RF901 会不定期地发送一些长度为 2 的数据包。数据包里的第一个数字表示寿司所用的鱼类型,第二个数字表示当前这个寿司是哪个餐桌的客户点的。

收到寿司订单后,我们首先要加 100 数量的米,然后将对应类型的鱼放入寿司,最后再加 30 数量的米,做出一个 100 米 + 鱼 + 30 米的夹心寿司。

然后我们需要将做好的寿司放入传送带,并分别在延迟 3、6、9 秒后,依次触发闸门 a、b、c 的信号。触发规则参考数据手册:

我们观察一下这张图,圈 A 左边有个【←100】,右边有个【→0】,也就是说,左半部分的所有餐桌,闸门 A 信号都是 100;右半部分的所有餐桌,闸门 A 信号都是 0。

闸门 B 信号也可以用类似的方法分析出来:上半部分的所有餐桌,闸门 B 信号都是 100;下半部分的所有餐桌,闸门 B 信号都是 0。

闸门 C 则是:奇数餐桌都是 100,偶数餐桌都是 0。

将以上信息汇总,得到餐桌和三个闸门信号的映射关系表:

我们不难发现如下规律:

餐桌号 ≤ 4 时,闸门 A = 100,否则闸门 A = 0;

餐桌号除以 4 的余数为 1 或 2 时,闸门 B = 100,否则闸门 B = 0;

餐桌号除以 2 的余数为 1 时,闸门 C = 100,否则闸门 C = 0。

我们可以根据这样的规律来设计程序。电路图和代码如下:

四块 MC4000 就够了,布线也很简单。梦回龙腾。

通过接线可以看出来,位于右上角的芯片是直接和 C2S-RF901 连接的,因此它是 1 号芯片。下方从左到右的三块芯片依次和闸门 a、b、c 连接,它们是 2~4 号芯片。

首先看 1 号芯片的代码:

这块芯片的 x1 口既连接着 C2S-RF901 的 rx 口,也连接着“鱼”这个输出口。但是这并不矛盾,因为前者是只读的,后者是只写的。从 x1 口读数据时,数据只会从 rx 流入;而向 x1 口写数据时,数据只会流向“鱼”。数据既不会从错误的口流入,也不会流出到错误的口上。

首先从 C2S-RF901 中读入一个数字(mov x1 acc),检查它是正数还是负数(tcp acc 0)。如果是负数,说明队列中暂时没有新的寿司订单,直接跳到第 6 行睡觉(slp 1)。如果是正数,说明队列中有等待完成的寿司订单(且第一个数字是鱼的类型)。我们按照要求,第 1 秒里加 100 数量的米(+ gen p1 1 0),第 2 秒里加上对应类型的鱼(+ mov acc x1)和 30 数量的米(+ mov 30 p1, slp 1),第 3 秒钟将米信号归零(+ gen p1 0 1)。寿司制作完成后,我们把寿司放入传送带,并将 C2S-RF901 中表示餐桌号的第二个数字发给 2 号芯片(+ mov x1 x0)。

然后看控制闸门 A 的 2 号芯片的代码:

首先将闸门信号置为初始值 50(mov 50 p1)并待命(slx x0)。收到从上方芯片传来的餐桌编号后,我们先将该编号暂存到 acc 中(mov x0 acc),然后休眠 2 秒,准备设置闸门 A 的信号(slp 2)。当餐桌号 ≤ 4 时(tgt acc 4),闸门 A = 100(- gen p1 1 0),否则闸门 A = 0(+ gen p1 0 1)。接下来我们要准备将餐桌号传送给控制闸门 B 的 3 号芯片。由于闸门 B 的信号只跟餐桌号除以 4 的余数有关,所以在餐桌号 > 4 时,我们需要将餐桌号 - 4(+ sub 4),这样下一块芯片收到的数字只能是 1、2、3、4 中的一种,即【余 0 时视为余 4 的,餐桌号除以 4 的余数】。最后,将处理过的 acc 值发给 3 号芯片后(mov acc x1),将闸门 A 的信号重置为 50,等待下一次任务(mov 50 p1, slx x0)。

接下来看控制闸门 B 的 3 号芯片的代码:

首先将闸门信号置为初始值 50(mov 50 p1)并待命(slx x0)。收到从左边芯片传来的【餐桌编号除以 4 的余数】后,我们先将该余数暂存到 acc 中(mov x0 acc),然后休眠 2 秒,准备设置闸门 B 的信号(slp 2)。由于余数为 0 时视为 4,所以【余数为 1 或 2】等价于【余数 ≤ 2】,而【余数为 0 或 3】等价于【余数 > 2】。当余数 ≤ 2 时(tgt acc 2),闸门 B = 100(- gen p1 1 0),否则闸门 B = 0(+ gen p1 0 1)。接下来我们要准备将餐桌号传送给控制闸门 C 的 4 号芯片。由于闸门 C 的信号只跟餐桌号除以 2 的余数有关,所以在余数 > 2 时,我们需要将余数 -2(+ sub 2),这样下一块芯片收到的数字只能是 1、2 中的一种,即【余 0 时视为余 2 的,餐桌号除以 2 的余数】。最后,将处理过的 acc 值发给 4 号芯片后(mov acc x1),将闸门 B 的信号重置为 50,等待下一次任务(mov 50 p1, slx x0)。

最后看控制闸门 C 的 4 号芯片:

首先将闸门信号置为初始值 50(mov 50 p1)并待命(slx x0)。最后一块芯片由于不需要再往后面的芯片传数字,所以不需要将收到的数字放入 acc 寄存。收到从左边芯片传来的【餐桌编号除以 2 的余数】后,判断余数是否为 1,激活相应的 + - 号指令后(teq x0 1),休眠 2 秒,准备设置闸门 C 的信号(slp 2)。当余数为 1 时,闸门 C = 100(+ gen p1 1 0),否则闸门 C = 0(- gen p1 0 1)。一秒过后,将闸门 C 的信号重置为 50,等待下一次任务(mov 50 p1, slx x0)。

点击左下角的【模拟】,稍等片刻,便会弹出结算界面:

优化电量

以上代码中为了压缩行数,用了很多 gen 指令。我们可以将所有的 gen 指令展开,以达到节省电量的目的。

当 gen 指令的第一个操作数是 0 时,展开后相当于:

mov 100 P

slp 0

mov 0 P

slp I2/R2/P2

# 此时前两条指令都相当于空操作指令,可以去掉

当 gen 指令的第二个操作数是 0 时,展开后相当于:

mov 100 P

slp I1/R1/P1

mov 0 P

slp 0

# 此时最后一条指令相当于空操作指令,可以去掉

如果我们不计成本地将上一版方案中的所有 gen 指令都展开,并且去掉展开后的空操作指令的话,电量的确可以大幅节省。但是代价是有 3 块芯片不得不换成 MC6000,且这三块芯片都写了 10 行代码,也就是都仅仅比 MC4000 的最大容量多一行代码。

电路图和代码如下,其实就是将上一版方案中的 gen 指令全部展开后的样子。我不再重复解读。

最终的三项指标为:成本 ¥18(+6),代码行数 37(+5),电量 528(-144)

评论 (0)

相关阅读
网友评论0条评论

上拉或点击查看更多