千嶂夹城
发布于 2025-08-09 / 5 阅读
0
0

【游戏解法分享】深圳 IO - 阿瓦隆城第 4 关:电子射击练习靶

最近在玩“深圳 IO”,一款教你写汇编的游戏。

(也可以是纸牌游戏https://uqzjc.cn/archives/you-xi-jie-fa-fen-xiang-shen-zhen-io---zhi-pai-you-xi

就是在一边自己玩,一边在看大佬攻略:(这个攻略 https://www.bilibili.com/read/readlist/rl569860 写得很好),很多思路在看攻略前我确实想不到。所有情况下,这攻略给出的解法远比我的解法简洁优秀。

在这里记录一个我自己的解法吧

阿瓦隆城第 4 关:电子射击练习靶

两名学员学习射击,你要设计一个用于练习打靶的机器……(更多内容可以看大佬的文章)

https://www.bilibili.com/read/cv17310903/

他的思路是放四块MC6000。其中有两块分别用于控制两个得分板输出,还有一块总控,用于广播当前轮数并传达分数变化,最后一块根据打靶落点计算得分。

我合并了两块控制得分板的芯片,用一块(下图中中间那个)MC6000的acc和dat记录并传递当前场上双方得分,用一块芯片(下图中最右边那个)记录当前轮数并进行输出,最后一块(左边那个)同样根据打靶落点计算得分。

中间那块芯片的 acc 寄存器记录当前正在打靶的那个人的得分,当第一个人打完靶后,dat 寄存器记录打完靶的那个人的得分。

当检测到打靶的时候,中间的芯片等待左边的芯片输出新的打靶结果,等到后加给 acc 更新正在打靶的那个人的得分。如果当打完靶,而且此时的轮数到达四轮了,就把 acc 存到 dat 里并清空 acc 以备记录下一个人的得分。这里中间的芯片的等待左边输出,使得在每轮刚打完靶的时候,从 p0 引脚收到的当前轮数,都是右边更新过的最新当前轮数。之后中间芯片依次输出两个人的得分。

特别地,当当前轮数为零时,中间芯片直接 sleep,不输出。还会重置 acc 计数。

右边芯片用于控制轮数,先检测是否到达第八轮了,如果是这样的话要完成既定的闪烁功能,也就是重复三次把中间芯片的输出丢掉,然后把轮数设置为 0(倒数第五六行,mov p0 acc 可以同时清空 p0 引脚上的数和 acc 寄存器里的数,毕竟中间的芯片没往 p0 引脚输出)。否则,根据是否有人打靶更新打靶轮数,并将中间芯片的输出正常传达给得分输出。

左边的芯片功能和大佬文章里的类似。

用以上方案,这关的布线有些捉襟见肘,三块 MC6000 一共用了 8 个引脚…… 这个游戏判断引脚和电线有没有连接当且仅当电线穿过引脚口的那一小段竖线,因此可以将右边两个芯片的位置极致压缩,如图所示的布线方案可以让最右边芯片的 x3 正常输出给得分 1,x2 正常输出给得分 2。

左边的芯片由于要完成检测到射击计算分数的任务,需要同时连接三个输入(为什么一定要连检测输入呢,因为中间芯片的代码行数不够用了,没法检测到射击后通过 x0 通知左边的芯片 QaQ),所以必须使用一个 DX300 来转换检测射击的简单输入到 XBUS 输入。同时为了快速计算得分,需要ROM内存会占掉两个 XBUS 口,右边与中间芯片通信也要占掉一个 XBUS 口。一通规划下来,刚好比塞得下多一点。

点击模拟,获得 18/973/42 的成绩,虽然不是很极致,电量使用也比大佬的方案要多,但成本和代码行比大佬文章里的要低。所以放到博文里分享一下。


评论