电玩圈游戏网 搜一搜

安卓手游去频道 >

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

安卓应用去频道 >

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

游戏视频去频道 >

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

资讯攻略去频道 >

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

专题合集去频道 >

游戏专题 应用专题

排行榜单去频道 >

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

首页>资讯>游戏攻略>深圳SHENZHENIO隐藏关第1关宣传片攻略

深圳SHENZHENIO隐藏关第1关宣传片攻略

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

深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看隐藏关第1关宣传片的攻略吧。

隐藏关第1关:宣传片

点击主页上的【控制面板】,在【谜题档案】栏里输入数字 0451,打开隐藏关第 1 关《深圳 IO 宣传片》。

本关需要按照时序图的要求,根据阶段 1~4 的波形信号向显示器发送相应的数字信号。

乍一看,这关有四路 p 输入,我们想当然会以为至少要两块芯片才能搞定。但其实,这四路输入中的前三路里,任何一路出现了非 0 信号时,另两路信号都一定是 0。因此我们可以将前三路信号合并成一路信号。

有多个信号同时接在同一个【只写】p 口时,大的电平信号会覆盖小的电平信号,最终输出的电平值是所有输出信号中的最大值。

这一点对于【只读】p 口也同样适用,当我们的芯片的 p 口同时连接了多个外部输入源时,我们从该 p 口读到的值为本秒内这些外部输入源中的最大值。本关我们可以利用这个特性,将阶段 1~3 的三路信号同时接在 MC6000 芯片的 p1 口上,就能成功将阶段 1~3 三路输入合并为一路输入。剩下的阶段 4,很自然地就接到了 p0 口上。如图所示:

这里我皮了一下,画了两个 SZIO(深圳 IO 的首字母)的字符画。嗯,你要认为是数字 5210 也行……接线上可以看出来,阶段 1~3 的信号最终都会流向 p1,而阶段 4 的信号最终会流向 p0。

我们来对比一下合并前和合并后的时序图:

(合并前)

(合并后,毫无 PS 痕迹)

当我们将阶段 1~3 三路输入信号合并后,我们发现了这样一条规律:合并输入出现上升沿信号时,将 acc +1 并发送给显示器;合并输入出现下降沿信号,且 acc 为 2 时,向显示器发送 -1、-2。阶段 4 比较简单,检测到 100 信号后就向显示器发送 +15、-15 的闪烁信号即可,无需检测 0 信号。

现在的思路就很明确了,我们写下这样的代码:

本芯片的 dat 寄存器用于存储上一秒钟的合并输入的值,以便和本秒的信号值做比较,进而检测上升沿和下降沿信号。首先,比较本秒和前一秒的合并信号的差值(tcp p1 dat)。差值为正时,说明出现了上升沿信号。我们首先将新的信号值存入 dat 供下一秒使用(+ mov p1 dat),然后按照计划,将 acc +1 后发送给显示器(+ add 1, + mov acc x3)。差值为负时,说明出现了下降沿信号。此时也需要将新的信号值存入 dat 供下一秒使用(- mov p1 dat)。仅当出现下降沿时 acc < 3(- tcp acc 3),才能向显示器发送 -1 和 -2(- mov -1 x3, - mov -2 x3)。阶段 2 的 100 和 0 反复横跳的过程里也会产生下降沿信号,那时候 acc ≥ 3,不可以向显示器发送 -1 和 -2。

当合并输入没有产生上升沿或下降沿信号时,我们需要检查阶段 4 的输入信号是否为 100(tcp p0 0)。当阶段 4 的信号为 0 时,我们关闭所有的 + - 号指令,直接跳到最后睡觉(slp 1);而当阶段 4 的信号为 100 时,我们需要向显示器发送一组 +15、-15 的闪烁信号(+ mov 15 x3, + slp 1, + mov -15 x3, slp 1),两秒后回到第 9 行继续判断。

点击左下角的【模拟】,运行程序,会发现我们的 SZIO 形状的导线会跟随着显示器画面的变化同步闪烁,非常漂亮:

稍等片刻,便会弹出结算界面:

优化电量

第一版方案其实是最省成本和代码行数的方案,一块芯片就把四路输出全搞定了。如果我们土豪一点,四路输出用四块芯片分别完成,那就有足够的代码空间来打磨细节,节省出不少的电量。省(tu)电(hao)版的电路图和代码如下:

阶段 1~4 的输入信号依次和右上、左上、右下、左下的芯片的 p0 口相连接,因此右上、左上、右下、左下的芯片依次是 1 号、2 号、3 号、4 号芯片。

经测试,80 个测试样例里,阶段 1 的上升沿信号最早在第 2 秒钟出现,阶段 2 的上升沿信号最早在第 15 秒钟出现,阶段 3 的上升沿信号最早在第 36 秒钟出现,阶段 4 的上升沿信号最早在第 47 秒钟出现。因此,这几个阶段的上升沿信号来临前都可以保持为睡眠状态,以节省电量。

先看右上方的 1 号芯片。

首先睡 1 秒(slp 1),然后检查是否有上升/下降沿信号出现(tcp p0 dat)。没有时,关闭一切 + - 号指令,直接跳回第一行睡觉。出现上升沿信号后,将本秒的信号值送入 dat 以便下一秒接着检测上升/下降沿信号(+ mov p0 dat),然后将 acc +1 后发送给显示器(+ add 1, + mov acc x2)。经测试,阶段 1 的两个相邻的上升/下降沿信号间至少间隔 5 秒,在此期间可以安心睡觉(+ slp 4,然后跳到开头执行 slp 1)。出现下降沿信号后,直接向显示器发送 -1 和 -2(- mov -1 x2, - mov -2 x2),然后阶段 1 就结束了,可以永久睡眠了(- slp 999)。

然后是左上方的 2 号芯片。

阶段 2 的前 14 秒内都不会出现上升沿信号,所以前 14 秒内可以安心睡觉(@ slp 14)。因为阶段 2 要给显示器发送 3~11 的数字,所以睡醒后,我们给 acc 赋上 3 的初值(@ mov 3 acc)。其后,若尚未检测到 100 信号(tcp p0 0),就关闭所有 + - 号指令,直接跳到最后一行睡觉。一旦检测到 100 信号,我们就把 acc 的值发给显示器(+ mov acc x1, + slp 1)。此时检查刚才发的数是否是 11(teq acc 11)。若不是 11,则将 acc +1,休眠 1 秒进入下一个时钟周期后继续发(- add 1, slp 1),直到 acc 加到 11 为止。当 acc 加到 11 后,阶段 2 就结束了,可以永久睡眠了(+ slp 999)。

接下来是右下方的 3 号芯片。

阶段 3 的前 35 秒内都不会出现上升沿信号,所以前 35 秒内可以安心睡觉(@ slp 35)。因为阶段 3 要给显示器发送 12~14 的数字,所以睡醒后,我们给 acc 赋上 12 的初值(@ mov 12 acc)。其后,检查本秒内是否出现了上升沿信号(tcp p0 dat)。未出现时,什么都不用做,关闭所有 + - 号指令,直接跳到最后一行睡觉。出现上升沿信号后,将本秒的信号值送入 dat 以便下一秒接着检测上升/下降沿信号(+ mov p0 dat),然后将 acc 的值发送给显示器。(+ mov acc x3)。经测试,阶段 3 的两个相邻的上升/下降沿信号间至少间隔 2 秒,在此期间可以安心睡觉(+ slp 1,最后一行还有一个 slp 1)。至此,我们检测前一个发给显示器的值是不是 14(+ teq acc 14)。当前一个发送的值不是 14 时,说明阶段 3 尚未结束,将 acc +1 后,回到第三行继续检测上升/下降沿信号(- add 1)。当前一个发送的值是 14 时,阶段 3 就结束了,可以永久睡眠了(+ slp 999)。

最后是左下方的 4 号芯片。

经测试,阶段 4 永远是在第 47 秒启动,所以前 46 秒可以安心睡觉(@ slp 46)。阶段 4 一定是在第 47 秒启动,但不一定是在第 60 秒结束。所以启动后,我们每向显示器发送一次 +15、-15 的闪烁信号(mov 15 x1, slp 1, mov -15 x1, slp 1),就要检查一下阶段 4 是不是结束了(teq p0 0)。如果阶段 4 的输入信号没有在发完闪烁信号后回到 100,就说明阶段 4 结束了,就该睡觉了,不能再向显示器发送闪烁信号了(+ slp 999)。

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

我们花了 16 块钱,在两块 MC4000、两块 MC6000 上写了多达 35 行的代码,壕无人性地将电量消耗减少到了 157。

评论 (0)

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

上拉或点击查看更多