电玩圈游戏网 搜一搜

安卓手游去频道 >

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

安卓应用去频道 >

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

游戏视频去频道 >

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

资讯攻略去频道 >

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

专题合集去频道 >

游戏专题 应用专题

排行榜单去频道 >

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

首页>资讯>游戏攻略>深圳SHENZHENIO第5关游戏积分器攻略

深圳SHENZHENIO第5关游戏积分器攻略

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

深圳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)

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

上拉或点击查看更多