电玩圈游戏网 搜一搜

安卓手游去频道 >

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

安卓应用去频道 >

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

游戏视频去频道 >

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

资讯攻略去频道 >

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

专题合集去频道 >

游戏专题 应用专题

排行榜单去频道 >

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

首页>资讯>游戏攻略>深圳SHENZHENIO隐藏关第2关个人三明治组装机攻略

深圳SHENZHENIO隐藏关第2关个人三明治组装机攻略

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

深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看隐藏关第2关个人三明治组装机的攻略吧。

隐藏关第2关:个人三明治组装机

点击主页上的【控制面板】,在【谜题档案】里输入数字 2241,打开隐藏关第 2 关《个人三明治组装机》。

本关是龙腾第 14 关《个人三明治制作机》的升级关卡,尚未完成龙腾第 14 关的同学建议先阅读龙腾第 14 关的攻略,完成第 14 关后再来挑战本关:【深圳 IO 攻略】第 14 关:三明治制作机

本关和龙腾第 14 关都需要根据小键盘的输入做出符合要求的三明治。但第 14 关的小键盘是一次性输入(1 标准,2 不加奶酪,3 多加芥末),本关的小键盘是组合输入:

输入 1 表示要求下一份三明治不加奶酪

输入 2 表示要求下一份三明治多加芥末

输入 -1 表示撤销之前的一切个性化定制需求

输入 3 表示完成定制,开始制作三明治

也就是说,在输入 3 之前,都处于【接收定制规格】的阶段,定制接下来要制作的三明治的类型。我们不难发现,本关一共支持制作四种类型的三明治:

加奶酪和 1 份芥末的三明治

加奶酪和 2 份芥末的三明治

不加奶酪,加 1 份芥末的三明治

不加奶酪,加 2 份芥末的三明治

相比于第 14 关,多出了【既不要奶酪,又要多加芥末】的三明治。

和第 14 关一样的地方在于,四种三明治都要加一片下层面包、一块肉和一片上层面包,仅在添加的奶酪和芥末数量上有区别。我们在这里可以使用位运算的方法来接收用户的定制:

小键盘按下 -1 时,将 acc 重置为 000;

小键盘按下 1 时,说明客户不要奶酪,将 acc 的十位置 1;

小键盘按下 2 时,说明客户要多加芥末,将 acc 的百位置 1;

小键盘按下 3 时,acc 的值可能是 000、010、100、110 四种之一,依次对应标准三明治、不加奶酪的三明治、多加芥末的三明治,以及既不加奶酪又多加芥末的三明治。根据 acc 的值制作出对应的三明治即可。

电路图和代码如下:

左边的芯片用来接收用户的定制,右边的芯片用来制作成品三明治。我们先看左边芯片的代码。

当用户按下小键盘的数字后(slx x1),将该数字放入 dat 寄存(mov x1 dat)。如果按下的数字是 3(teq dat 3),则将定制的三明治编号发给右边的芯片,委托它来制作三明治(+ mov acc x3)。这里要注意一下,芥末的份数是跟三明治编号的百位相关的。百位为 0 的两种三明治,芥末时长为 1 秒;百位为 1 的两种三明治,芥末时长为 2 秒。因此芥末时长 = 百位 +1。这里由左边芯片提前把芥末时长算好发给右边的芯片(+ dgt 2, + add 1, + mov acc x3),因为右边的芯片没有多余的代码空间来亲自计算芥末时长了。操作完成后,清除 acc,准备接收下一笔订单(+ mov 0 acc)。如果按下的数字是 -1,同样清除 acc(- teq dat -1, + mov 0 acc)。当按下的既不是 3 也不是 -1 时,视按下的数字的不同,将 acc 的对应位置 1:按下 1 时将十位置 1,按下 2 时将百位置 1(- dst dat 1)。

右边的芯片用来依照订单制作三明治。首先等待左边的芯片将订单发来(slx x1),收到订单后,依次将三明治编号和芥末时长存入 acc 和 dat 寄存器(mov x1 acc, mov x1 dat)。首先是四种三明治都一样的下层面包(gen p1 1 0)和一块肉(mov 100 x3, slp 1)。然后,仅当三明治编号的十位为 0 时,也就是 acc 的值为 000 或 100 时,才加一份奶酪。这里的测试指令用 - 串联,形成了【或】关系(teq acc 0, - teq acc 100, + mov 10 x3, + slp 1)。接着加 dat 秒的芥末(mov 1 x3, slp dat)。最后是四种三明治都一样的上层面包(gen p1 1 x3,此处读 x3 会读到 0,同时清除 DX-300 的三路输出信号,一举两得)和 3 秒国旗信号(gen p0 3 0)。

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

优化电量和代码行数

四种三明治的编号分别是 000、010、100、110,它们除以 14 的余数分别是:

0 mod 14 = 0

10 mod 14 = 10

100 mod 14 = 2

110 mod 14 = 12

这四个余数既不相同也不相邻,那么我们完全可以把四种三明治的奶酪时长和芥末时长放入 ROM 中,实际程序中通过查表的方式获得奶酪时长和芥末时长。如此做,便可以节省下一部分电量和代码行数,而且成本也不会增加哦,可以说是完爆上一个方案了。

明明多了一个 ROM,为什么说成本没有增加呢?其实,正是因为有了这块 ROM,左边的芯片才能节约成本换成 MC4000X。ROM 多花 2 块钱,芯片降级成 MC4000X 省掉 2 块钱,一正一负正好抵消。

上一版方案里,左边的芯片写了 10 行代码,且用到了 dat 寄存器。为什么一块 ROM 就既能把 dat 去掉,又能减少代码行数呢?首先我们看为什么能减少代码行数。上一版方案中,我们向右边芯片传了三明治编号后,又计算了百位 +1 的值(芥末时长)发送了过去。这版方案里,芥末时长是写在 ROM 里的,根本不需要计算,因此这部分的 3 行代码就去掉了。

然后我们再看看为什么能去掉 dat。小键盘有 -1、1、2、3 四种输入,一个 tcp 三态判定是涵盖不了所有情况的,至少要两次判定才能涵盖所有情况。因此收到小键盘的输入后,我们必须要将输入的值暂存起来以便后续能够多次判定。存到 acc 里是肯定不行的,那里是存三明治编号的地方。MC6000 我们还有个 dat 能用,但 MC4000X 怎么办呢?其实,我们可以借用 ROM 的地址口来暂存这个值。小键盘的输入只有 -1、1、2、3 四种,映射成 ROM 地址后变成了 13、1、2、3 这四个数字,完全没有冲突。

其实,ROM/RAM 的地址口除了用来指示下一个要读取的位置之外,还有一个重要的作用:可以把它作为芯片的一个额外寄存器来使用。它是一个只能存 0~13 数字的,只有 +1 并 mod 14 这一种运算的 tinyacc。但有那么些时候,我们只是需要一个额外的寄存器而已,而且并不需要存复杂的数字。能做到这些的寄存器,往往就已经足够了。本方案里,我们借助 ROM 的这个特性,就可以成功去掉左边芯片中的 dat 寄存器,并顺带将其换成 MC4000X 以节约成本。电路图和代码如下:

四种三明治的奶酪时长、芥末时长如下:

000 号:奶酪 1,芥末 1

010 号:奶酪 0,芥末 1

100 号:奶酪 1,芥末 2

110 号:奶酪 0,芥末 2

因此,我们将 1、1 写在 ROM 的 0 号地址处,将 0、1 写在 ROM 的 10 号地址处,将 1、2 写在 ROM 的 2 号地址处(100 mod 14 = 2),将 0、2 写在 ROM 的 12 号地址处(110 mod 14 = 12)。这样,制作三明治时,我们先将 ROM 的地址置为和三明治编号一致,然后连读两格 ROM,就能快速获得当前这种三明治的奶酪时长和芥末时长了。

现在我们来看左边的芯片。收到小键盘的数字后(slx x0)后,首先将该数字寄存到 ROM 的地址口(mov x0 x3)。如果按下的数字是 3(teq x3 3),则将定制的三明治编号发给右边的芯片(无需再计算芥末时长),委托它来制作三明治(+ mov acc x2)。操作完成后,清除 acc,准备接收下一笔订单(+ mov 0 acc)。如果按下的数字是 -1,映射到 ROM 的地址口上会变成 13。如果我们从地址口读到了 13,同样清除 acc(- teq x3 13, + mov 0 acc)。当按下的既不是 3 也不是 -1 时,视按下的数字的不同,将 acc 的对应位置 1:按下 1 时将十位置 1,按下 2 时将百位置 1(- dst x3 1)。

右边的芯片收到订单后(slx x2),将三明治编号设置为 ROM 地址,会自动对 14 取模(mov x2 x1)。首先是四种三明治都一样的下层面包(gen p1 1 0)和一块肉(mov 100 x3, slp 1)。然后,读一格 ROM,获得当前三明治的奶酪时长,令机器加这么多分量的奶酪(mov 10 x3, slp x0)。接着,再读一格 ROM,获得当前三明治的芥末时长,令机器加这么多分量的芥末(mov 1 x3, slp x0)。最后是四种三明治都一样的上层面包(gen p1 1 x3)和 3 秒国旗信号(gen p0 3 0)。

右边这块芯片里一条判断指令都没写,就这样通过 ROM 查表的方式完成了一次三明治的制作。点击左下角的【模拟】,稍等片刻,便会弹出结算界面:

成本 ¥11(没有任何增加),电量 141→123(减少了 18 格电),代码行数 18(减少了 6 行代码)。完爆了上一个方案。

评论 (0)

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

上拉或点击查看更多