电玩圈游戏网 搜一搜

安卓手游去频道 >

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

安卓应用去频道 >

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

游戏视频去频道 >

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

资讯攻略去频道 >

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

专题合集去频道 >

游戏专题 应用专题

排行榜单去频道 >

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

首页>资讯>游戏攻略>深圳SHENZHENIO第19关智能电网控制路由攻略

深圳SHENZHENIO第19关智能电网控制路由攻略

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

深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看第19关的智能电网控制路由的攻略吧。

主界面

由于游戏过分硬核,先放个手册中的图看看冰山一角:

不过这也正对应了嵌入式开发中会遇到的海量数据手册,相当程度上还原了嵌入式日常开发的情景。

游戏中设计到部分的编程有些类似于汇编语言,这里上手还是有一些些难度的,大家请做好准备,继续直接扔核弹:

不用害怕,在游戏过程中,会逐步引导你学会使用新的指令,对于新的器件,也是随着主线的进行逐步开放的

在游戏中,你不仅可以完成指定的基本目标,还可以挑战全网玩家,看谁能达成最佳优化目标。

鱼和熊掌不可兼得,多数情况下想要达成更好的性能就要增加成本啦,不过这正是优秀的嵌入式开发人员的意义所在——比你好,还比你的便宜。

第 19 关:智能电网控制路由

关卡展示

本关需要将从三个输入口发出的数据包按照以下规则转发到指定的输出口中:

首数字小于锁中的数字时,将数据包转发到【较小输出】端口;

首数字等于锁中的数字时,将数据包转发到【电表输出】端口;

首数字大于锁中的数字时,将数据包转发到【较大输出】端口。

数据包中的第二个数字是在此之后还剩余的数字数量,也就是说数据包的总长度 = 第二个数字 + 2。

这一关我们需要将首数字读入 dat,第二个数字读入 acc 并倒数,完成整个数据包的传送。现在关键的问题在于,我们似乎需要五个 X 口:三个输入合并成的一个输入口、锁子、以及三个输出口。但是锁子是只读的,而三个输出口是只写的,这两个读写模式完全不同的端口可以共用一个 X 口,互不影响。

首先我们尝试着将代码写在一块 MC6000 芯片里:

可以发现一块芯片里根本写不下,至少多了五行代码。原因在于,数据包的前两个数字要放到 acc 和 dat 寄存器里,用于指示数据传输方向和循环次数,这两个数字的发送要独立于循环之外,代码量一下就上去了。

我们现在换一种思路,用两块芯片来传输。第一块芯片判定好数据方向后,将数据方向的值写入 p 口通道,后面就只管给第二块芯片传数据了。具体往哪个方向传,由第二块芯片来操作。

我们先看左边的“判断方向并传输数据”的芯片。首先,等待 x1 口的数据包(slx x1),然后将前两个数字分别存入 dat 和 acc 中(mov x1 dat, mov x1 acc)。我们在两块芯片中用可以反复读取的 p 口来表示数据包的输出方向,0 为【较小输出】,1 为【电表输出】,2 为【较大输出】。我们首先假设首数字和锁中的数字一样,将输出方向设为【电表输出】(mov 1 p0)。然后我们判断首数字和锁中的数字的大小(tcp dat x0),若首数字比锁中的数字小,则将输出方向改为【较小输出】(- mov 0 p0);若首数字比锁中的数字大,则将输出方向改为【较大输出】(+ mov 2 p0)。方向决定好后,我们只管往右边的芯片传数据。首先是把前两个数字传过去(mov dat x3, mov acc x3),对于剩下的 acc 个数字,我们使用循环来完成。传一个(mov x1 x3),然后判断刚才传的数字是不是最后一个(tcp acc 1)。若不是最后一个,则令剩余数字数 -1(+ sub 1),并跳回到第 10 行继续传(+jmp a),直到将所有的数字都传给右边的芯片后,回到第一行,等待下一个数据包(slx x1)。

然后我们看右边的芯片。因为收到数据以后 p 口所表示的方向肯定是已经确定下来的了,所以我们只需要 tcp 三态判定,并将收到的数字发送给指定方向的输出口就行了。首先我们等待从左侧芯片发来数字(slx x1)。如果指定的方向是【电表输出】方向(teq p0 1),则将发来的数字传入【电表输出】端口(+ mov x1 x3)。如果指定的方向不是【电表输出】方向,则判定是【较小输出】还是【较大输出】(tcp p0 1),并将发来的数字送入指定方向的端口(- mov x1 x2, + mov x1 x0)。

这里要注意,我们这次的输出口是 x 口,不是 p 口,可以在同一秒内发送多组数据。所以不能像指定 p 口值那样“假设往中间发”。必须先明确地用 teq 判定,不满足后再用 tcp “两态判定”。

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

优化三项指标

我们观察到,数据包中的第一个数字一定是三位数,其余数字则一定不是三位数。所以,当我们收到一个三位数时,意味着这是一个新数据包的首数字。每当收到一个新的首数字,我们就更换一下方向。如此便可大幅优化三项指标。

我们不断等待 x1 发来新的数字(slx x1, mov x1 acc)。当发来的是三位数时(tcp acc 99),说明是数据包的首数字。将该首数字放入 dat 中,作为将来判断传送方向的依据(+ mov acc dat)。如果首数字和锁中的数字一致(teq dat x0),那么就把当前数字发往【电表输出】方向(+ mov acc x3)。如果首数字和锁中的数字不一致(tcp dat x0),那么当首数字小于锁数字时,发往【较小输出】方向(- mov acc x2);当首数字大于锁数字时,发往【较大输出】方向(+ mov acc x0)。

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

成本 ¥10→¥5,电量 391→315,代码行数 19→9。

评论 (0)

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

上拉或点击查看更多