@
没学过汇编,公众号看到的游戏,steam入手了,随手记录下
第一关 (模拟)安全摄像头
第一关比较简单,只需要在原来的基础上面造轮子就行。先选择右侧的器件,这里选用MC4000。(保持上下器件一致,毕竟刚接触,其他器件也不知道怎么玩,鼠标左键是连线,右键是取消)
切换到确认的选项卡,可以看到信号的输出。分析给出的活动状态的代码
mov 0 p0 //将第一个操作数复制到第二个操作数中
slp 6 //slp 6等价于sleep 6毫秒,在游戏中就是六个单位
mov 100 p0
slp 6
0电平信号走了6单位,100电平走了6单位,然后一直循环。
在来看网络输出信号的规律。
大体都一样,都是对某一部分循环。
0电平4单位,100电平2单位,0电平1单位,100电平1单位。
mov 0 p0
slp 4
mov 100 p0
slp 2
mov 0 p0
slp 1
mov 100 p0
slp 1
测试成功
这里还显示了所花费的产品成本,电量以及代码行数,同时可以看到其他玩家的消耗,鼓励玩家不断优化自己的代码,成本和电量,相当于同台竞技,挺好的。第一关通过后有个纸牌游戏
想累了,可以试着玩一下。有空做个入门的小教程,也不知道每一把是不是都有个解?
第二关 工程模型替换件
第二关可能把一部分人整蒙了(包括我),因为没有可以参考的了,所以只能自己做了。通过提示信息和邮件,我们需要放大控制信号。器件依旧是MC4000。
由于没学习过汇编语言,所以参考自带的数据手册(下载链接在末尾,分中英两版,版主英语不行,看的是中文的)
翻阅手册,在p13-p15左右找到一些头绪
R我觉得应该是寄存器(Register)吧?咋翻译成存储器,不是很清楚,参考链接:知乎
主要是两个指令,mov 和 mul。还有一个名为acc的默认寄存器
在回想下第一关中的代码,好像就明白了一些什么
mov R/I R //R:寄存器,I:整数类型
mov 0 p0 //把0(操作数)复制到p0(操作数)
mul R/I //将第一个操作数的值与acc存储器相乘,并将结果存到acc
我们要做到,是将p0端的信号,放大一倍输出到p1端。那么中间势必要经过某些过程,没学过计算机的可能对这些指令不知道怎么办。我举个例子,你有两杯饮料,分别装着牛奶和橙汁,你现在需要调换两杯子之间的饮料,先前放牛奶的杯子现在要放橙汁,放橙汁的杯子现在要放牛奶。显然,如果只有手头两个装满饮料的杯子,是没有办法将内容进行调换的。所以我们需要借一个杯子,第三个杯子。牛奶的先倒在空杯子,橙汁的倒在牛奶里面,空杯子内的牛奶在倒在橙汁里,这样就完成了饮料的互换。
mov p0 acc //将输入端的信号放到acc中
//因为需要放大一倍的信号,也就是乘以2
mul 2 // mul 2也就是 acc *= 2等价于acc = acc * 2
mov acc p1
//注意,这里需要slp 1,通过观察波形图可以得知。具体进游戏,鼠标放上去有提示
slp 1
测试成功
第三关 脉冲发生器
阅读邮件,注意到有条件执行五个字
在看一眼波形图
输入信号为100时,脉冲信号走1单位100,然后走1单位0(注意第三个,输入是100走11单位,但第12单位变0,输出也就变0)。
重点是条件这两个字,继续翻手册,p16可以得到想要的内容。
上述分析我们得知,当输入为100时,才产生脉冲。
teq R/I R/I //比较两个操作数是否相等
//相等:执行+指令,禁止-指令,不相等:执行-指令,禁止+指令
问题来了,+ - 放在哪里呢?在p13,可以得到想要的答案
teq 100 p0 //判定100 和p0相等么?相等走+指令
+ mov 100 p1 //将p1置为100,
+ slp 1 //走1单位
+ mov 0 p1 //p1置为0
slp 1 //若不相等,走1单位
注意这里的程序结构,由于程序是自上而下的,有的人可能写成这样
teq 100 p0
slp 1
+ mov 100 p1
+ slp 1
+ mov 0 p1
测试后:
还是要注意下,代码的先后顺序的。对了,可以设置断点,不断的试错。成功是建立在无数次失败上面的!
测试成功
点击模拟,没有前面两个那么丝滑了,嗯,我在想想咋改进,让它丝滑点。-----------------------------2021/3/14更
第四关 发光标志
看一眼邮件和提示信息
在看一眼波形图
好像找不到什么思绪。看了下点击0和点击1两部分,是互补的。第二关中给的图中有这么一个指令:not
acc寄存器的值默认为1,由于not不带任何操作数,所以,应该是单独的一行。注意到,点击1的波形图先是0电平,走一单位,100电平,走一单位,0到100电平靠not指令执行。
mov acc p1 //先将p1寄存器中存放acc的默认值,0
not //acc此时的值为100
mov acc p0 //将p0寄存器中存放acc为100的状态量
slp 1 //走一单位。
//第一圈:p1 = 0,p0 = 100,走一单位
//第二圈:p1 = 100, p0 = 0,走一单位,此后循环往复。
测试结果:
现在开始另外一部分,也是互补,只不过是三个部分的互补了。
没想到啥好的思路,先过关,后面来补。
//喝-0
mov 100 p0
slp 6
mov 0 p0
slp 4
//喝-1
mov 0 p0
slp 6
mov 100 p0
slp 1
mov 0 p0
slp 2
mov 100 p0
slp 1
//喝-2
mov 0 p0
slp 7
mov 100 p0
slp 2
mov 0 p0
slp 1
测试成功
-----------------------------------------------------------------2021/3/15更
PS:今天沙尘暴有点大,受不住这空气
第五关 海量男爵
第六关 垃圾音频装置
游戏成就
嘿嘿,空挡接龙成功10次了--------2021/3/15 1:41更
成功20次--------------------------------2021/3/16 0:32更
参考手册
中文
链接:https://pan.baidu.com/s/1aTiLpA44K2nXDvYemgvSTA
提取码:s5zx
英文
链接:https://pan.baidu.com/s/1Ydvd4dQtcaxluSrctIvLzg
提取码:xexp