TIS100入门向攻略

前几天某QQ群有人推荐这个游戏,百度了下找到了贴吧下载,但是攻略好像没找到,B站到是有个入门视频介绍还满有用的。

入门的话强烈推荐先看完了解个大概

http://www.bilibili.com/video/av3312630/

 

因为我也是新手没玩几天,所以程序优化什么的都没有,只能算是勉强过关,有写的中二的算法直接无视就好。

 

关卡按X行Y列为序

首先是1_1

毫无疑问这关应该没人过不了,真真正正的Hello World,左边给了IN.X到OUT.X,右边照葫芦画瓢就行

TIS100入门向攻略_第1张图片

 

1_2

这也没啥好说的,因为游戏指令只有加,减,传值和跳转,所以乘法无非就是A+A,

把数据读入寄存器,然后加自身,输出结果就完了

TIS100入门向攻略_第2张图片

 

1_3

A-B的值输出到P,B-A的值输出到N

这关主要是告诉你,一个数据可以发送到多个CPU端口。

比如IN.A先把数据

1.读入寄存器,

2.发送到右边

3.拿到右边值,用自身ACC减去拿到的值

4.把ACC结果发送到下边

右边同理,要注意的是指令的执行顺序和等待,

点击STEP单步运行可以看到A在运行到SUB RIGHT那行时在等待右边,直到右边运行到最后一行的

MOV ACC LEFT,左边才继续运行,

搞清等待非常重要,这个我刚入门时折腾了好久才搞清,那个自带的手册上好像并没有提到等待的内容,虽然我也没怎么认真看就是了......

总之等待,数据同步这个概念很重要,后面关卡会很依赖这个概念,

有时候程序明明解决思路的逻辑都想出来了,但是执行不正确,多半就是等待和执行顺序的问题

另外要注意输入,输出数量要相等,比如目前这个最简单的

A是2入(上入,右入),2出(右出,下出)

B也是2入(上入,左入),2出(下出,左出)

A输出到B数据,B一定要接收,不然程序会阻塞锁死。

同理,数据发送到没有用的CPU端口,没有处理也会锁死,

所以一定要有数据有出OUT,就必需有入IN,垃圾数据也要有接收处理的概念。

当然这是后话,就目前这关直接用直觉写就能过,总之先有这个概念,后面会用到。

TIS100入门向攻略_第3张图片

 

1_4

题目要求,G,E,L三个输出分别为数据>,=和<三种状态的真假值,

如果数据>0,那么G就为1,其他两个为0,

数据=0,那么E为1,其他两个为0

数据<0,L为1,其他两个为0

这里比较坑的是第一次你是否能读懂题,反正第一次我是没读懂这玩意,根本不是人类语言......

TIS100入门向攻略_第4张图片

 

1_5

3个IN,1个OUT

跟据S值判断

S=-1输出A

S=1输出B

S=0输出A+B

 

MOV UP ACC 	//读值到ACC
JLZ RA 		//小于0跳到RA标签处
JGZ RB 		//大于0跳到RB
MOV LEFT ACC 	//否则计算A+B并输出
ADD RIGHT
MOV ACC DOWN
JMP END
RA:MOV LEFT DOWN
MOV RIGHT ACC
JMP END
RB:MOV RIGHT DOWN
MOV LEFT ACC
END:NOP

 

因为这个代码写的比较早,后来发现,可以把第一行加个标签,

这样就不用跳到END最后一行的NOP,而是直接重头运行,可以节省一行,

不过反正目前是能过关就行,暂时不管他

 

TIS100入门向攻略_第5张图片

 

 

========================================

2_1

题目:比较A,B大小,按从小到大顺序输出,以0结尾

思路,如果A-B<0,说明B>A,先输出B,再输出A,否则先输出A,再输出B

另外在最后一个模块,用上面传递的数据符号作为先后顺序,

上面传递的是如果A-B<0,传递A,否则传-A

下面判断是,如果A>0选输出A,再输出B,然后0

否则输出B,-A,0

这关主要是告诉你,每个CPU模块只能写15条指令,

想在一个模块解决所有算法是不行的,有时必需要把算法拆成多个模块运行

TIS100入门向攻略_第6张图片

 

 

2_2

序列以0为结尾,序列的总和(SUM)输出到S,序列长度(LENGTH)输出到L

明显是一边求SUM,另一边求LENGTH的问题

左边求SUM

用ACC读取发来的数据,用BAK存放总和

不为0就累积右边的数据,为0就先接收右边垃圾数据,再把SUM值传到下面的模块,

然后SUB ACC清0,你也可以写成MOV 0 ACC

这关就要注意数据的匹配了,IN向左边发送2次数据,

然后左边模块最上面一句MOV RIGHT ACC,处理了一次,

下面SUM:中的ADD RIGHT又处理一次,这样2次就匹配了

但是RSUM:也就是返回所有和,向下一个模块传递的时候一定别忘了处理一次右边数据,

不然数据不匹配,会变成下一次处理,造成数据错位

右边处理同左边,只不过不用求和,改为每次加1而已

TIS100入门向攻略_第7张图片

 

2_3

比较两次数据差,当前数据与上一次数据差值,

差值>=10返回1,否则返回0,首次IN数据恒为0,

很明显,这要求每次发送2个数据到下一个CPU,并且顺序是类似12,23,34,45这种,

从所给IN数据看0和32差值怎么也超过10了,但是输出还是要求为0,其他到是都是正常的,所以可以肯定还要用到1个记录首次运行状态的变量

高级语言就是写个bool变量,说到底这游戏也就是用简单的汇编实现高级语言一些函数功能的游戏。

搞清问题后开始写,ACC寄存器初始化为0,用JGZ大于0比较,大于0就跳到G0处,首次是0,所以不跳继续运行

首次运行取2个数据,发2个数据,并SAV保存第2个数据,做为下次使用,

结尾时把ACC恒写为1,也就是大于0,那么下次就会跳到G0处运行

G0:是取1个数据,发2个数据,这2个数据,一个是上次的数据,一个是当前的数据

然后依然保存当前数据留做下次使用,并且ACC恒为1,使下次循环可以跳到G0处,

这里要说下,通过实验不难发现,游戏变量没有溢出的问题,不像8086汇编,

这游戏只有简单的边缘处理,变量只有整数,范围-999至999,超出的取最大值,

考虑IN还有负值,所以开始这里我用的MOV 1 ACC

最后一个CPU模块没有读数据到ACC中,只是把数据从上传到下面,所以ACC值只有自加1,所以用的ADD 1,其实写成MOV 1 ACC也可以

 

再看第二个模块,读取一次左值到ACC,再取一次左值,与ACC相减,然后求个绝对值,因为有负数

大于等于10就是减9后大于0,然后按要求,>=10输出1,否则输出0

最后一个模块是首次输出恒为0,其他按所求输出

TIS100入门向攻略_第8张图片

 

2_4

这关很有意思,4个序列,只有0和1两种状态,如果某个序列从0变为1,就输出那个序列的序号,也就是1,2,3,4,

也就相当于脉冲了一次,但是从1变为0是不记的,相当于键盘按下时记录一次,松开再按才再记录一次,

每轮数据只有1个序列会变化

也就是说只有上次数据是0,这次数据是1的情况才会输出序列ID号,其他情况输出0

于是用ACC作为输入当前数据存储,BAK作为上次数据存储

首先判断上次是否为0,不为0就取一次数据,保存到BAK,并且传0说明自身状态

如果为0,取本次数据再判断是否大于0,大于0就返ID,否则返0

4个IN处理相同

 

然后结果再两两判断,谁不为0就先传谁的值,注意传完要接收一次另一个值,匹配数据输入输出数量

都为0就传0,传ACC也可以,反正都是0

因为每一轮只有一个序列可能变化,所以12,23,34两两比较完的结果会输出到右下角,

再把结果传到OUT

TIS100入门向攻略_第9张图片

 

========================================

3_1

给出一组数据,如果有连续3个0,那么输出1,否则输出0

思路:肯定要用3条路线,关键是如何实现延时效果,

再分析其实只要首次发送数据时多发送几个非0值的垃圾数据就行了,延时1位多发1次,2位多发2次

于是就可以在最后同时处理3个数的和是否为0了,也就相当于判断3个连续的数之和是否为0

题目本身不难,难在是否能想到这样实现

TIS100入门向攻略_第10张图片

 

比较有趣的是如果把中间没用的CPU传值代码去掉,程序运行速度会变慢

TIS100入门向攻略_第11张图片

 

3_2

给出一组数据,以0结尾,最小值mIn输出到I,最大值mAx输出到A

首先肯定会暴力的先用一个CPU实现一下最大数和比较功能,发现不行,

15条指令如何都实现不了,于是考虑拆成1个CPU模块存放最值,另一个模块比较大小的结构

跟据本关的布局大概能看出需要实现一个双向通信的结构

先来看①比较,②实现最大值

①用到了2入(2左入),1出(1右出),ACC存放临时输入,BAK存放本轮IN实际数据

②的结构是始终执行1出1入,但是要注意处理发过来的负值数据,因为所有的IN数据都为非负数,所以我用负数表示了状态

-100表示继续,-10表示数据0结尾,重置ACC和BAK,最大值重置为0

总之②这样就能实现保证提供给①本轮序列最大值

再看①,首先读入值并SAV,判断看是否为0,为0就取最大值,并发送到下面模块,并接收左边1次无用数据,同时再发送1次状态到右边,

如不为0,取右值,再减左值,如果小于0说明本次序列比最大值大,应该把最大值发到右边,

否则通知右边跳过本次记录,还使用上次最大值

③④最小值同理,只不过④最小值初始化为一个很大的数,要大过IN给的数据

TIS100入门向攻略_第12张图片

 

3_3

一组序列以0结尾,反向输出序列数

这关给了一个叫作Stack的栈结构,我们知道栈是后入先出的结构,

所以只要知道以0结尾的序列长度,循环读取出来,再输出就行了

左边就是个记数功能

需要注意的是不要把0数据也入栈,不然输出的数据是错误的

TIS100入门向攻略_第13张图片

 

3_4

A,B两组IN输入,算出乘法A乘B,结果输出到OUT

算法简单粗暴①作为数据,②作为循环次数

①先读取数据并SAV,ACC作为临时存储数据,BAK作为本轮实际数据

②ACC作为循环次数,BAK作为累加总和

没考虑优化,或许是跑的最慢的算法,但是不管怎么说够简单直接,过关就好

TIS100入门向攻略_第14张图片

========================================

4_1

第4行的关卡都是图形相关,比较坑人的是这个图像明明是个渐变图,但是实际上要求输出纯白图像

这游戏作者就是变着法儿的坑人,所以我决定只玩到4_2就弃坑了,毕竟有点无聊,并且自己还有坑要填...不想在这种无聊的东西上浪费更多时间了...

图像格式是4组数据为1个像素块0,0,3,-1

前3个数表示,x,y坐标和颜色,最后的负数表示结束,通常用-1就可以,你也可以用其他负数

根据手册上说第3位颜色表示为

0黑色

1深灰

2亮灰

3白

4红

测试时你可以在Image模块写上,会在左上角输出一个白像素块

MOV 0 DOWN
MOV 0 DOWN
MOV 3 DOWN
MOV -1 DOWN

 

如图

①表示29至0循环,是列数据,也就是x方向

②把数据发往④,把状态码发往③

③表示行也就是y方向,ACC临时数据,BAK表示y,如果x为0,传y值并且自增1,否则只传y值

⑤根据x,y变量输出白色像素块

TIS100入门向攻略_第15张图片

 

4_2

没啥可说的,基本同上关,只不过把计数29改成30,在最后加个颜色轮换

TIS100入门向攻略_第16张图片

 

你可能感兴趣的:(TIS100入门向攻略)