Shenzhen IO图文攻略
前些天看到有好友在玩一个叫《深圳IO》的单片机工程师模拟游戏,作为程序员背景的单片机爱好者兼老年游戏玩家第一时间就找了一份游戏搞起,怎么也比刷个leecode好玩哈~
包含剧透预警!强烈不建议在没摸过游戏之前阅读攻略部分的内容!!
前期准备
- 游戏对电脑要求不高,建议1080分辨率就好,太高反而不舒服。
- 作为一个Boss rush游戏,尽管已经简化了很多,但是至少需要一点程序开发背景。
- 作为每个Boss的击杀要求,至少要求你能看明白示波器/协议分析仪的波形图。你实现的电路满足需求即可过关,但实现成本、代码行数、耗电都可以作为挑战指标。二周目提供了更多元器件,挑战更高评价。其实二周目更好玩!
- 游戏提供了一份PDF版本的道具手册,有条件的话建议打印一下,不然像我在中后期来回切换窗口,上下翻页真的影响思路。我的版本是英语,不太清楚有没有对应的中文版。同样照进现实的是文档的质量和需求描述很一般,有几个重要信息需要翻阅来往邮件,阅读理解很重要。
尼玛!边看文档边敲键盘,明明玩个游戏却偏偏班味儿十足。
好吧,吐槽一下有些的数值设置有点草率,定价方面单片机的定价对于逻辑电路来说太低而且面积上看也太小,稍微复杂点的逻辑门组合成本过高,稍复杂一点的逻辑不如直接用单片机实现,成本方向的优化的驱动力有点低。另一个槽点就是二进制位运算的玩法没有很好的体现出来,这很大程度上是单片机最好玩的部分。
阅读理解后的额外收获
游戏手册提供了一部分信息,另一部分需要从邮件列表中读取,放在这里统一一下。
gen指令
后期会收到一封邮件,告诉你有条隐藏指令(Undocumented instruction)可以简单直接生成脉冲波,可以极大的简化实现,减少代码行数。
gen P X Y
# 等效于
mov 100 P
slp X
mov 0 P
slp Y
特殊前导符
“#”没什么可多说的,就是注释
“@”只在单片机初始化时执行一次(还是在上一个邮件thread里)
关于寄存器
按照文档的描述,寄存器分为3类
- acc寄存器,即算术寄存器,所有的计算(加减乘位移)都只能通过操作acc寄存器来实现,计算结束后寄存器被更新。
- dat寄存器,暂存器,只能读写两种操作,不能通过外部命令改变值。只在MC6000单片机上存在。
- null寄存器,清空寄存器使用的伪寄存器。它存在的意义仿佛就是为了丢弃xbus的无用信包防止堵塞。
文档没有描述的是其实引脚本身也具备寄存器的特性,这个是中后期必备的技能。不要急着把引脚的读数mov到捉襟见肘的acc/dat,直接引脚之间相互mov就可以。尤其要指出的是xbus口子一旦写入数值就必须被远程的一个且只有一个芯片接收,否则bus会被堵塞。实在需要废弃的情况就可以在远端直接mov数据到null寄存器。
关于跳转代码
算不上是特殊收获,算是汇编的特点之一,在if判断中可以嵌入jmp,并不是函数的概念早期开发语言的代码块概念更贴合这个逻辑。
关于FPGA - PGA33X6
游戏提供了一款PGA33X6 FPGA,也是文档里唯一一大段中文内容,但是质量之低令人发指!这款FPGA主要为了解决三路以上电路的逻辑关系,好在至少在我的挑战中FPGA没有找到上场的机会。从实现难度和成本角度这个器件很鸡肋,也就是拿上来当成优化方案简化走线而已。
游戏攻略
fake摄像头 - Security camera (fake)
实际上就是一个经典的LED blink,blink的地位相当于hello world。拉高引脚电位亮灯,拉低引脚关灯。一周目只提供3块钱的单片机,P等于GPIO/pwm口,x只能用于xbus跨片通讯,相当于I2C/SPI/UART协议端口组合。没什么难度且提供了示例代码,属于新手保护期范畴。
有了gen指令就能优化,减少了4行代码,不过增加了功耗……
what, how hard can it b?
工厂模块替换件 - Replacement factory module
还算在新手保护期内,这次考验的是计算。数据要先mov到acc寄存器再做乘2操作,换做真实场景乘法太重,左移一位(<<1)可以替换或者用一次加法代替乘法,但好像对这个游戏来说没有位移操作且加乘同权,优化就此作罢。
脉冲发生器 - Pulse generator
主要是学习if逻辑(teq指令),一个方波生成器,结合一个开关信号。
换上gen命令也一样,省了代码和功耗,但算不上优化
What, how hard can it be?
霓虹灯牌 - Light-up signs
各种方波的组合,第一关的进阶版,要求不高的话实现起来没什么难度。一周目只能用单片机实现,每个单片机2路模拟输出,5路波形就必须用3个单片机。
这个问题好玩在二周目如何优化上,首先是省钱向,右边的drink 1可以用异或门LC70G86实现
放一个反向器(看符号我以为是二极管)多一块钱但省电省代码的实现
再就是用DX300多路复用器,和上一个方案完全一样的代码量、成本、功耗。
And so, how hard can it b?
游戏记分牌 - BRING OUT THE BARON!!
高电平+1和高电平-2两路模拟输入,一路跨片输出计分到液晶屏。
肯定要维护一个寄存器,元器件就离不开单片机,但MC4000就足够所有逻辑了,我暂时也看不出更优的逻辑,简单粗暴的按需实现就行,只不过增加一个过0保护而已。
so, how hard can it be?
首先,tcp指令A>B时也就是说P0引脚的foul被触发才会执行+部分(sub 2),另一种情况则是point触发时执行-部分的(add 1)操作。两个引脚不存在同时触发的可能(按钮不会同时按下),在没有任何引脚触发的情况下事实上P0=P1,按照指令引导,什么都不操作。另外只有在系统出现减法的时候才会出现过0问题,那就只在减法分区里做。这种方法极大的节约的指令空间和能耗。
算上打印手册花费的时间的话,到这里应该过了退款保护了吧
音频优化 - Rubbish audio thing
一个开关电平配合一个算法 ,查手册得知out = (in - 50) * 4 + 50 = 4 * in - 150,六年级代数内容,节省指令启蒙。
牵扯两路模拟输入和一路模拟输出,没有办法在一个单片机内实现,一周目就老老实实的堆两张片子。
二周目就可以用一个dx300端口复用器把开关电路转换成xbus通讯。话说这个器件有点超现实了,从来没见过反正可逆的多路复用器,好比74595 74165混用的意思。
红外传感器 - Infrared sensor
2路xbus输入:读取两个设定值确定传感器的打开和关闭时间;一个模拟量实时时钟输入;一个传感器模拟量输入当时钟处于两组设定值之间且传感器读数大于20时,触发警报。感觉主要是适应一下xbus通讯
4进1出,原来的MC4000单片机明显不行,只能用5块钱的MC6000,还有个单片机判断阈值。
时间区间判断上应该有指令优化空间,利用省出来的空间做阈值判断,还可以用dx300数模转换替换MC4000,有空再更新一个二周目优化吧。
VR蜂鸣器 - Virtual reality buzzer
用xbus从天线接受信号,过滤掉无效信号-999,保留有效信号0,1当开关输出方波。
换上gen指令之后,省下一个MC4000
无线手柄 - Little help?
从这里开始难度显著提升了。
xbus非阻塞读信号间隙-1后,发送数据包。数据包来自两组模拟量x,y;两个按键之和a = 1,b=2;用不上位运算挺扯。固定包结构送回到天线模块。一周目4组输入铁定一个单片机搞不定的,xbus互联是基操。
一周目的实现没难度,但板子走线画的有点丑,好在过桥不算钱。
二周目端口复用成了套路
光枪游戏装备 - TAG YOU’RE IT
活着的时候alive指示灯亮,可以射击。hit信号之后死亡,alive灯灭,不能射击。reload按键之后xbus读取一个设定值装弹,之后每按一次扳机扣一发子弹,发送fire信号直到耗尽后不能射击。
老实说我刚开始没完全理清思路,弄了半个小时没搞定。好吧,我的思路重点是alive状态全局通知,一开始僵在用xbus消息广播,后来发现还是电位来的容易。
感觉我已经陷入思维定式了。端口复用器,用到没脾气……
还是dx300,居然可以做到同一时钟周期内同时支持输入输出。不算优化,算是作弊。
已经想方设法改变思路了,还是有点似曾相识。总体价格不变,节省代码和功耗,思路是用两个LC70G08与门替代if判断,一个dx300xbus信号转换,就是走线复杂了点,主打一个分离解耦。
牛刀杀鸡,FPGA强行上一把。话说别人家的单片机现在都图形化编程了,FPGA还停留在写code上,咱这儿FPGA都是图形化编程了,单片机还是要写code。
三色LED - COOL DAD!!!!
读取无线数据包向量中的4个值R,G,B,闪烁次数,其中闪烁次数可以被下一次数据包打断,尽管单元测试数据无一例外都是被打断的,但你必须实现这个功能……
涉及三路模拟输出,2个单片机跑不了,3盏灯的pwm值是独立的,加上开关2种状态,即便不考虑天线信号处理,至少需要6条指令实现LED管理和1条slp,MC400的7条指令完全不够。加上非阻塞的数据缓存和开关状态,必须有2个寄存器才能实现。所以一个MC600和一个MC400是没什么可说的。
DEVICE 2A27
本质上这个是一个leecode style的算法题,类似二维向量规则降维。对应不同的x,y分布范围计算区域,输出区域得分。
感觉对于没有编程背景的人还是有点难度的(话说没编程背景的人也大概率走不到这一步~)。do/while 0 (有梗!) 写个条件跳出实现起来不算复杂:
do {
uint8 output = 0 ;
if (x<20){
output += 30;
break;
}
if (x>= 60) output += 30;
if (!(x>=40 && x < 80 && y >=40 && y < 80)) break;
output += 50;
}while(0);
// printf(output);
光if操作就要用6条指令,MC400就不要想了,然后两路模拟进一路模拟出,又是一个MC600和MC400的组合。貌似不会有更优解。
好吧,我上手很快,但后续调各种边界bug搞了半个多小时,前前后后翻文档看的指令区别,被各种逻辑判断绕死……
不敢说有没有更优,一周目的话应该差不多够how hard了。
通关后补充:这一关是新手任务的分水岭,前边的大部内容算是教你怎么用好元器件,后边开始对编程的难度特别是代码复用有了很高的要求。
三国硬币 - THREE KINGDOMS TOKENS
投入12,5,1三种面值的硬币,扣除一个xbus设定的手续费之后转换成5,1两种面额的硬币。投币面值超过手续费之后输出一路4clk的高电平到bell。
投币口需要的3路输入可以用DX3000复用,但3个条件判断,每个两条指令,加上一个xbus读取已经占用了7条指令,MC6000是必须的。11条指令hold住上边的逻辑,同时还要负责打铃。这个时候gen命令已经不是隐藏指令了,可以光明正大的在一周目用。
出币口同样也需要一个算术寄存器。找零算法中每个硬币需要一条判断,一条减法,一条gpio,乘上2种硬币,又是6条指令打底,别烦了直接上MC6000。
三明治机 - PERSONAL SANDWICH MAKER
接收到keypad的信号之后三明治按照固定的流程制作:面包-肉-奶酪-芥末-面包,每个流程需要拉高对应设备的电平1clk,之后升旗设备的电平拉高3clk。难度在于keypad的xbus信号2号三明治不含奶酪,3号三明治双份芥末。
由于xbus只能由一个单片机读取,只能通过主从两个单片机实现。主机负责获取并转发需求,负责面包和升旗实际4个任务,需要根据需求计算两片面包的时间间隔。从机负责肉、奶酪、芥末的具体3个任务的判断和操作。主机需要两个寄存器存储需求信息和两片面包之间的等待时长。从机需要2种例外状态的是非判断,乐观预测每个状态2条指令;3个步骤至少3条指令,1个读取xbus,好已经大于7条了,两个MC6000起步。
属于暴力实现,个人不是很满意,后期不知道有没有可以实现脉冲时延的器件或指令,先蹲一个回来再优化。
再更,how hard can it b?
话说业务难度上来了各种逻辑门电路的存在感更低了,到了拼代码逻辑的阶段。二周目越来越难了。
狙击枪瞄具 - CARBINE TARGET ILLUMINATOR
先看文档:雷达发送和接收各送出一个信号,通过计算两个信号之间的时钟数获得长、中、近三种模式。1-2近距离开启60% flood;中距离开启20%和50%的激光;远距离则只开100%激光。
雷达距离计算至少需要一个状态开关和一个计数器两个变量,MC6000跑不了;同时由于需要同时负责两组gpio输入,3个输出都是gpio,必然需要一个从机。从机又铁定要负责3种状态的判断,至少3x3 9条指令也跑不了MC6000了。得~实现成本几乎是一定的。
随机音乐 - CAN YOU KEEP A SECRET??
这关主要是ROM芯片200P-14的使用。一个随机数发生器(PS:只有左下角箭头指向的pin有输出,害我直接怀疑人生了)随机到1(Sinister Giggle)或2(Blood-Curdling Cry)分别放两首不同的音乐,其余就放50电平。
乐谱在手册P37,需要手工输入到ROM,11个byte,ROM 12 byte,最后一位留空做标志位,省去了通过游标判断的方法。C语音狂喜,这不就是\0放字串末尾的玩法吗?
PS:我个人惯常讨厌查表,我想看看在不用查表的情况下能走多远。这个是乐谱不是查表。
水培箱维护机器人 - AQUAPONICS MAITENANCE ROBOT
果然开始反人类了
天线获取3个值,分别是需要维护的水培箱位置,工具清理时间和工具投喂时间clk。难点:
- 机器人移动算法上需要记录当前位置和目的位置,在没有办法交换变量的前提下,整体应该压缩不到11行以内—— MC6000必须的。
- 电机控制区分前进和后退,电路部分要保持50%电平,通过步进脉冲推动电机,高电平前进,低电平后退。信号和逻辑判断至少5条指令,那最好有个单独的步进电机控制器,接收正负两组方便实现。
- 后边两个步骤如果放在两个单片机上就必须有个全局同步信号记录状态,只能用xbus,但xbus只能有一个接收人,每个单片机都要至少额外的3条指令。放在同一个单片机上的话就要两个寄存器实现。逻辑不复杂但2个寄存器必须上MC6000。
- 两个板子都要2个寄存器,那么还需要有个单独的负责信号处理和逻辑分发的单片机,一进两出,只有MC4000x才能胜任——就算三通也不是不行。
需求分析完,我是这么解的,不是很满意。
通关后回来评价:从这里开始就要开始用各种骚操作代替普通代码逻辑减少开销了。
远程开关 - REMOTE KILL SWITCH
远程电源开关,搞脑子的。
还是收发数据包那一套,仅在首个数字等于0或1时生效,分别对应电源的关和开,连续的第二个数字则是具体的开关编号。单独到这里还不难,难点在于如果连续5个clk没有任何数据则启动保护措施直接关闭所有电源。
显然收信过滤的同时还要有个计数器,就MC6000。做个下位机,负责电路状态切换,一想到状态切换的单片机就依旧需要2个寄存器。额~
实现上既然过滤了所有小于0的值,可以重用发送异常。总感觉对于下位的MC6000来说,上边的信号过滤了个寂寞。
感觉这方案设计的两个芯片之间通讯的协议有点重,还有优化空间。
智能电表路由控制 - SMART GRID CONTROL ROUTER
说起来一点也不复杂:3个信源,发送相同格式的6位结构体;从黑盒读取一个id作为阈值,与结构体的首位做对比区分大于、小于和等于3种状态,转发结构体到3个目标地址——典型路由算法。
我的思路一开始就是不对的,一看到6位结构体和最多2个寄存器的配置,按照软件思路上手就堆了ram,数据包再加一个抬头标注目标地址再写到ram,从机读取这个地址再转发。然后就抑郁了,读ram必须用两个xbus去分别实现写游标和读数据,游标是需要从机自己维护的。而这就限制了不可能出现1写多读的可能。然后白白耗费了1个多小时,走线都放不下了。
逆向思维了一把,首先源和目标都是xbus协议,杜绝了dx3000端口复用的可能,而最强单片机只有4个xbus口明显不能实现这个需求。所以xbus它是个“bus”。那bus就具备复用的可能,也就是说同一个口在一个周期内可以读写混合(又是TM一个周期内读写混合口,就算有也要有人敢用啊)。一旦接受了这个思路路子就宽了,题目很简单,不觉得有法子做到更优了。
看来之前的几关也可以有优化空间了……
口袋啊,来自大清的神谕 - POCKET I CHING ORACLE
就是一随机生成的八卦(错,六卦),一个高电平代表信号开始,剩下的6个clk接收6个bit组合成六褂。
程序员狂喜,这就是送分题啊!唯一的难度就是利用行号排列小技巧复用代码,裁剪长度。
之所以用六褂还不就是送你两个dx300?随机数是模拟量直接反用dx300 得到bit位,手写三次位运算连同sleep 总共5条指令。2条发送,2条写寄存器,剩下5条指令应该够了。
精密食品秤 - PRECISION FOOD SCALE
一个按钮和一个模拟量输入,一个显示屏输出。初始化时显示器关机,模拟量输出0则显示器开机并显示实时数值。数值非零时按钮信号表示去皮净重,当前读数归零,之后的读数则是两者之差。模拟量为0时再按按钮则关闭显示器(写入-999关机)。
之前那个记分牌的强化版本,实现难度不大,难的是理清需求(对于拥有同款秤的客户没难度)。读懂需求了也就把逻辑理清了,就是一个反向思路,每一次都跟dat寄存器做减法,只不过任何数-0都是本身罢了。
加密货币存款机 - CRYPTOCURRENCY DEPOSIT TERMINAL
硬币找零机的翻版。
一个读卡器作为触发起点,xbus先过滤出>=-1的值,共计8位,-1表示拔卡结束交易。插卡期间会输入20/50/100面额的现金,交易完成后组装一个信报通过xbus发给网络,其实就是在原有的信包后加个总额。
刚开始我的思路是8位卡号直接转发网络,下位机收到信号把金额追加一下就好,然后发现测试要求在交易完成之后发送才合格。
那就别烦了,RAM缓存转发走起,读卡器上放个MC4000x,4个口子读卡x1,写内存x2,还有一个负责消息传递。下位机mc6000收到信号之后去读内存,另一个MC6000负责记录收款金额发给下位机,有了前边错误的屎山实现,最后实现效果是这样的
乖乖,就剩不下什么走线空间了,应该可以进一步优化。
带污染传感器的窗 - POLLUTION SENSING WINDOW
从一个sensor获取模拟量空气污染指数,满足连续8个周期平均值超过50就拉低电平关窗,否则高电平。
绝对是个算法题,而且碰到我属于是6块钱挂号看咳嗽,对面坐着钟南山了 ,算术平均也好移动平均也好实现方式差不多。反正单片机上没有除法器,把这个移动算术平均固定分母的话实际上是一个滑窗加法。拿出ram,实现一个Ringbuffer(它本身就是round robin的),开两个游标前边一个写游标每cycle写当前数据到ram,后一个读游标落后8个位置读取8个游标前的值回来减一下,再加一下当前值。8 * 50 = 400 只要保证这个值在400以内就可以了。CPU uncore的去抖判定阈值公库,Ghz级别调用的leakybucket也就这么玩的。
一周目我就准备直接撂下这句了:So, How hard can it b?
交通信号灯 - TRAFFIC SIGNAL
六角形路口的交通控制,3个方向各有一盏红绿灯各自按照3个xbus的设定值控制放行时长。紧急信号发起之后emergency高电平,路口全部红灯,等待紧急车辆通过后信号低电平。
走到这一步了,什么妖孽没见过?变种的光枪游戏而已。不要想的太复杂emergency就是一个光枪游戏的反向alive信号而已,直接放全局通讯。之前被可以同周期双向通讯的xbus给忽悠了,这次我就光明正大的用这种协议(设置了ack信号就嚣张的放个666!)。急着推进度,pass之后了就先不优化了。
肉品挤出机 - MEAT-BASED PRINTER
keypad输入3种肉品需求,系统要拉高一路模拟信号表示开机,然后按照手册P39的配方合成肉馅,完成后关机。
开发需求过于简单,一看配方为啥所有制作过程花费7秒?嗨!RAM/ROM不都是14位的吗?明晃晃的提示信息放着呢!其中3#配方就是连续7秒的value1-2,这个不用查表,剩下两个放两列查表就好了,拿到数据直接*7操作当成位移读表,裁剪一下代码就好了。
作为一个不屑于查表算法的人,这道题不查表也不是不会做。
3台单片机各控制一个配方,3#配方过于简单,于是就同时负责读指令、下发指令和开关机。
1#和2#配方还有个对称的特点,即它的材料需求中value0和value2的下料频率是完全一样的所以value 0 - 2 用一个控制器slave 1,另一个负责value1的两种配方。问题转换成了之前霓虹灯和脉冲发生器的变种了。
你这都吃上肉了,FPGA也应该买得起吧?
电子门锁 - ELECTRONIC DOOR LOCK
一个刷卡机xbus输入10位卡号,起先9999999999的卡号是高权限可以直接解锁(拉高电平6clk),长按按钮后刷卡也可以获得解锁权限。解锁之后按下按钮再刷其他的卡则后刷的卡号可以解锁。也就是说高权限的卡时钟可以解锁,低权限卡要长按键注册。测试样本中启示就会做一次解锁权限申请,所以不要担心其实状态问题。
读卡器10位,直接上RAM保存卡号,只要learn按钮按下,当前卡号就会存再ram里。再次刷卡的时候一个整数666初始化数据库,然后就是通过十进制整数模拟位运算的问题了:当卡号中出现任何一个9的时候第二位将被置0;当卡号中有一位数字没有匹配上缓存中的数据,返回码的第二位将被置0。那只要我确保最终返回值大于605就能验证通过了,(其实任何一个1以上的两位数字都行,但拦不住我喜欢666~)如下表:
返回码 | 含义 |
---|---|
666 | 初始状态,或者卡号中没有‘9’且验证通过 |
660 | 卡号包含9包含全9卡,但匹配缓存中的卡号,验证通过。 |
606 | 该卡卡号不包含9,验证不通过(亲测好像仿真数据没cover到这种情况) |
600 | 该卡中即包含9,但验证不通过 |
深海传感器阵列 - DEEP SEA SENSOR GRID
一个声纳和一个磁性传感器,从天线接收指令信号格式为[密钥,业务码],密钥跟黑盒输出验签之后,1,2两种业务分别发送声纳和磁性的之前6个数值。
其实这个题目画板子没什么难度,就是看你怎么做保存数据而已。6x2需要至少12byte,那肯定要RAM。之前讲过RAM是个14位 ring buffer,[sonar|seprator,magnetic]两两结对存储正好6对,剩余个byte放分隔符正好。本身是那个智能开窗的升级版本。
逻辑上划分为记录阶段和发送阶段,记录阶段就是读数据写数据的mov。收到业务码之后立刻在当前游标位置写入分隔符,开始拷贝数据到天线,写一个数据包游标要走两步:判断分隔符和读数据,那么就可以一路平A了。
题目简单的话我就吐个槽
- 我强烈认为这关玩家就是被拿捏的,首先这个关卡难度不配备这个阶段,而且原来组件的位置根本什么器件都不用动,摆放的位置就是提示。等你全连起来之后就自然落入陷阱。透过板子的缝隙,我仿佛看到了来自宫崎老贼的微笑。
- 初始画板子放个MC6000在中间,magnetic直接连P0,sonar连P1。原本的数据结构是 [magnetic, sonar],以为这样业务码的奇偶位和游标奇偶位是对齐的,程序员思维误区了属于是。恰恰跑仿真的时候只报错不会dump数据包,结果这个小问题困扰了我很久。
- 还是惯例放个\0作为分割符,结果上来的记录数据中包含0,而且偷偷摸摸地放在了后几屏,打板子写代码的阶段你根本看不到这种特例,调试的时候也要等很久快加速的时候才能到那个关键点。关卡设计师的恶意昭然若揭。我除了给你个666还能说什么呢?
通关后补充:然鹅,不像前边的关卡那样,从这里开始进入后盘,后面的每一个关卡都透露着设计师浓烈的个人气质。能看懂板子的排布就是解题的重要提示之一。
消音耳机 - SPOILER BLOCKING HEADPHONES
来自关卡设计师的吐槽 权游很黄很暴力。
喇叭两个两个接收数据包,数据包含敏感词的话就哔掉,直到解除信号之后恢复。
考验一个索引算法,先找一块MC4000做声卡,一个MC6000用来查表,出现敏感词就静默,恢复信号开启之后就直接恢复解码。
pass了测试就放结果出来了,没调优,急着去刷boss呢。关键词没找到规律,必须查表了,不过这题当我没做也不block进度。
变色鞋 - WOULD YOU BELIVE IT?
按钮按下时sensor输入波长,根据波长信息查表得到颜色,统计出现频率最高的颜色转成两种颜色K和N的模拟量。
7种色彩分类,还有x,y 2种坐标提示够明显了吧,但显然要我破戒用查表法实现,跳过我照样打BOSS。
鸡尾酒混合器 - AIRLINE COCKTAIL MIXER
琴酒、伏特加、朗姆、瓦尔莫斯……我知道这些都是鸡尾酒常用的,我就是想问问你宫野~啊不,雪莉在哪儿!嗑药叛逃了!?
这关前边那个3种肉品的强化版本,这是7种(严重提示)酒品。一定要做查表法~吗?
COCK! 我偏不!How hard can it b?
有了上面肉品的不查表解法,这个就没什么难度了,就是再次细分每个品类的成分罢了,多层传递拆分而已。应该比查表法成本更高。然后好像我从来没走过背板,眼看要最终BOSS了,这次特地不搭桥以防你们不知道可以走背板。
THE BIG BOSS!!!
众望所归的big boss来了!雷达定位+通讯(or 窃听)的badge徽章。这是柯南看多了?
额~这个角度进制,求你要不就弄361度一圈,多加上一度的热爱,要不就2pi算你学过高数,实在不行255一圈,讽刺码农一下我也认了,可哪个维度的世界里角度是一周100度的?
跟上一题差不多,我的想法是一个主芯片负责任务分发,1#业务码送到声卡芯片去转换成声音播放,2#业务码送到另一个芯片去查表计算距离。
真的板子上没什么特点,就像事先已经知道了你要做成什么了那样,coding的过程是个马拉松……
总之,后面几关拼的是耐力, 而且,
Usually, map is called map, but it isn’t a “map”, so introduce a map searching algorithm is NOT a “map” searching. — said by Litrin :)
通常,地图叫“map”但“地图”本身是“图”,不是“表”,所以~查地图本身不是查表而是查图 ——留给一直从头看到这里的人的彩蛋
结局?
前前后后高强度工作接近20个小时,写周报的话给我得报这是一个季度的工作量!
可真当字幕打出来的一瞬间索然无味,累了~
那个啥~还有 hard 模式!还Avalon,有辆丰田就开始显摆了这是?
更新完了,我的五一小长假也接近尾声了,感谢大家的关注~
虽然是个游戏,既然你都看到这儿了,1万1千字,几十张图,客官怎么也该留个赞再走吧?