首页>资讯>游戏攻略>深圳SHENZHENIO第5关游戏积分器攻略
深圳IO是一款硬核的编程游戏,有着严谨的游戏内容,那么一起来看看第5关游戏积分器的攻略吧。
概念MAIL:任务中心,游戏的主题都在其中,为了仿照认真工作的样子,所有的任务背景和内容都模拟邮件的形式进行
数据手册:嵌入式开发必经之路,相当于正常游戏的新手引导,哈哈,读起来很有感觉呢
控制面板:就是控制台啦,这不需要过多叙述了
纸牌游戏:这个会在游戏前期解锁,一旦解锁,这个游戏可能就变成了一款蜘蛛牌游戏。
主界面
由于游戏过分硬核,先放个手册中的图看看冰山一角:
游戏中DX300参考
像这样的器件足足有17个!!!! 哈哈,有没有已经感觉到挑战了呢?
不过这也正对应了嵌入式开发中会遇到的海量数据手册,相当程度上还原了嵌入式日常开发的情景。
游戏中设计到部分的编程有些类似于汇编语言,这里上手还是有一些些难度的,大家请做好准备,继续直接扔核弹:
游戏中主要使用的编程语言
不用害怕,在游戏过程中,会逐步引导你学会使用新的指令,对于新的器件,也是随着主线的进行逐步开放的
在游戏中,你不仅可以完成指定的基本目标,还可以挑战全网玩家,看谁能达成最佳优化目标。
鱼和熊掌不可兼得,多数情况下想要达成更好的性能就要增加成本啦,不过这正是优秀的嵌入式开发人员的意义所在——比你好,还比你的便宜。
第1关:安全摄像头
第2关:信号放大器
第3关:脉冲发生器
第4关:动画 ESPORTS 标志
第 5 关:游戏积分器
关卡展示
每当得分信号出现时就 +1 分,犯规信号出现时就 -2 分,但分数不能低于 0 分。(得分和犯规信号不会同时出现)按照上述规则随时更新显示屏上的分数。
根据以上规则,我们很容易设计出如下的算法:
得分信号出现时,令 acc +1;
犯规信号出现时,令 acc -2;
当 acc < 0 时,将 acc 置为 0;
执行完以上操作后,将 acc 的值发送给显示屏,然后休眠一秒进入下一个时钟周期。
代码如下:
点击左下角的【模拟】,稍等片刻,便会弹出结算界面:
我们可以看到,这个初版方案的耗电量惨不忍睹。这是因为我们的代码中有很多冗余操作:
得分和犯规信号不会同时为 100,所以 teq p0 100 和 teq p1 100 这两条判断至少有一条是不生效的,效率上有浪费。完全可以改为比较 p0 和 p1 的差值。
仅当触发了犯规信号时,分数才有可能低于 0。没必要每个时钟周期都判断分数是否低于 0。
仅当分数产生变化时才有必要将 acc 的值传给显示器,平时分数没有变化的时候没必要反复传同样的信号。
针对以上几点,我们重新设计一套更优的算法:
计算犯规信号(p0)和得分信号(p1)的差值;
当差值为 0 时,当前时钟周期内不做任何操作;
当差值为 -100 时,说明得分信号激活,令 acc +1,然后将 acc 的值发送到显示器;
当差值为 +100 时,说明犯规信号激活,令 acc -2。与此同时,立刻判断 acc 是否小于 0。若是,则将 acc 更新为 0。做完以上操作后,将 acc 的值发送到显示器;
休眠一秒,进入下一个时钟周期,如此循环。
改进后的代码如下:
我在第 3 关的时候说过,测试指令前也是可以带上 + - 号的。这段代码里就出现了这样的条件嵌套。这道题里,每一秒钟可能出现 4 种不同的情况,依次如下:
p0 - p1 = 0;
p0 - p1 = -100(得分);
p0 - p1 = +100, acc - 2 >= 0(犯规,但是没有扣到 0 分以下);
p0 - p1 = +100, acc - 2 < 0(犯规且扣到了 0 分以下,强制还原成 0 分)。
我们现在对所有的情况依次讨论:
p0 - p1 = 0,此时在执行了 tcp p0 p1 指令后,所有带 + - 前缀的指令都会被关闭,直接跳到最后一行【slp 1】(当前时钟周期内不做任何操作);
p0 - p1 = -100,此时在执行了 tcp p0 p1 指令后,带 - 前缀的指令会被激活,接下来会执行第 2 行的【- add 1】、第 7 行的【- mov acc x1】和第 8 行的【slp 1】指令(令 acc +1,然后将 acc 的值发送到显示器);
p0 - p1 = +100 且 acc - 2 >= 0,此时在执行了 tcp p0 p1 指令后,带 + 前缀的指令会被激活。然后会执行第 3 行的【+ sub 2】和第 4 行的【+ tlt acc 0】指令。接下来,由于 acc - 2 >= 0,所以执行完 tlt 测试指令后,带 + 前缀的指令会变为关闭状态,带 - 前缀的指令会变成激活状态。接下来直接执行第 7 行的【- mov acc x1】和第 8 行的【slp 1】指令(令 acc -2,然后将 acc 的值发送到显示器);
p0 - p1 = +100 且 acc - 2 < 0,直到第 4 行前都和上一条无异。但是此时,因为 acc - 2 < 0,所以 tlt 测试指令执行完后的结果是 + 前缀指令保持激活,- 前缀指令保持关闭。因此接下来执行的是第 5 行的【+ mov 0 acc】、第 6 行的【+ mov acc x1】和第 8 行的【slp 1】(acc -2 后发现小于 0,将 acc 强制置零,然后将 acc 的值发送到显示器)。
耗电大幅减少到 170,可喜可贺。
附:一些简单的逻辑嵌套
下面我给出一些简单的逻辑嵌套定式,读者可以尝试自行推理证明。
teq p0 x0
+ teq p0 acc
+ mov 100 p1
- mov 0 p1
# 连续 + 号表示与关系,仅当 p0 既等于 x0 也等于 acc 时才为 p1 赋值 100。p0 不等于两者中的任何一个时,为 p1 赋值 0。
teq p0 x0
- teq p0 acc
+ mov 100 p1
- mov 0 p1
# 先 - 后 + 表示或关系,当 p0 等于 x0 或 acc 两者之一时,为 p1 赋值 100。仅当 p0 不等于两者中的任何一个时,为 p1 赋值 0。
所以以上代码中:
tcp p0 p1
- add 1
+ sub 2
+ tlt acc 0
+ mov 0 acc
+ mov acc x1
- mov acc x1
两条测试指令间构成了【与】关系,“仅当 p0 - p1 > 0 且 acc - 2 < 0 时,才将 acc 置 0 并发送给 x1”,“只要以上有一条不满足,那么就执行 - 前缀的部分。其中若 p0 - p1 < 0 时还要额外执行一条 add 1 指令”。
评论 (0)分享