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

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

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

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

关卡按X行Y列为序

首先是1_1

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

1_2

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

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

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,垃圾数据也要有接收处理的概念。

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

1_4

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

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

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

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

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

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,而是直接重头运行,可以节省一行,

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

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

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条指令,

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

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而已

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,其他按所求输出

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

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

3_1

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

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

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

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

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

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

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给的数据

3_3

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

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

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

左边就是个记数功能

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

3_4

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

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

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

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

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

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

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变量输出白色像素块

4_2

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

TIS100入门向攻略的更多相关文章

  1. 逗塔战争TD新人入门图文攻略

    逗塔战争TD新人入门图文攻略   <逗塔战争TD>是一张基于DOTA改编的塔防TD,很多玩家都很喜欢这张图,新手玩家怎么快速上手这张图呢?这张图的玩法和基本规则并不难,下面就为大家带来新人 ...

  2. SpringCloud之Hystrix服务降级入门全攻略

    理论知识 Hystrix是什么? Hystrix是由Netflix开源的一个服务隔离组件,通过服务隔离来避免由于依赖延迟.异常,引起资源耗尽导致系统不可用的解决方案.这说的有点儿太官方了,它的功能主要 ...

  3. git小白入门全攻略

    git是什么(写在前边的叨叨,就是给一点不懂的小白打个比喻,大佬请自行跳过) git在平时的开发中用的太频繁了,以至于我都不知道如何去形容它.囧. 假设我们开发的工作类似于图书整理,写的代码就是很多人 ...

  4. linux shell 脚本攻略学习20--awk命令入门详解

    awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...

  5. Linux shell 脚本攻略之正则表达式入门

    摘自:<Linux shell 脚本攻略> 下面是类似的解释:

  6. Java快速入门-05-数组循环条件 实例《延禧攻略》

    <延禧攻略>如此火爆,蹭蹭热度,用 JAVA 最基础的数组,循环,条件,输入/输出,做了一个简单的小游戏,帮助初学者巩固 JAVA 基础,注释非常详细 动态图展示: xuanfei.jav ...

  7. 【转】轻松搞定FTP之FlashFxp全攻略

    转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融 ...

  8. 《VIM-Adventures攻略》前言

    本文已转至http://cn.abnerchou.me/2014/03/02/bfdaadb0/ 自从有了计算机,人们就想向其灌输自己的想法. 要想对其输入,自然离不开文本编辑器. 公告:<VI ...

  9. Android使用XML全攻略(1)

    Android使用XML全攻略(1)    Android 是针对移动设备的一种新兴的开源操作系统和 SDK.借助它,您可以创建功能强大的移动应用程序.当您的应用程序可以访问 Web 服务时,其吸引力 ...

随机推荐

  1. lua 代码风格

    参考  http://www.kancloud.cn/kancloud/lua_style_guide/66327 1.命名 1.命名法:小驼峰命名法,大驼峰命名法(Pascal命名法),小下划线命名 ...

  2. sql中修改多表关联的字段

    表1:USERID USERNAME USERREMARK 表2:ROLEID USERID ROLENAME 其中表1的USERID与表2的USERID为关联字段. 若现在只知道ROLEID,要修改 ...

  3. java.sql.SQLException: ORA-00911: invalid character 解决方法

    java.sql.SQLException: ORA-00911: invalid character 控制台抛出这个异常:java.sql.SQLException: ORA-00911: inva ...

  4. C#获取本机公网IP

    /// <summary> /// 获取本机公网IP /// </summary> /// <returns></returns> public sta ...

  5. zabbix微信告警实践

    首先你得有个企业号!!!具体操作步骤可以参考http://itnihao.blog.51cto.com/1741976/1733245,里面写的很详细就不重复了. 微信公众号注册并配置完成后,还需要让 ...

  6. KVM 虚拟化 初体验

    KVM 是 Kernel-based Virtual Machine 的简称,是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案: 使用 KVM ,可允许运行多个虚拟机,包括 Linux 和 ...

  7. jquery 清空 iframe 的内容,,iframe自适应高度

    $(iframe).contents().find("body").html(""); iframe自适应高度 $("#AllDescription& ...

  8. textarea格式显示问题

    在 textarea 表单标签中, 当保存有换行的样式时,一般的方法有: 注:这里的info 为要显示的内容: 一.保存后在textarea 表单标签中显示时: info.replace(/\n/g, ...

  9. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  10. python获取命令行变量

    python获取命令行参数的方法是,开头使用import sys, 后面用sys.argv[0]表示文件名,sys.argv[1],sys.argv[2]...表示后续命令行参数. 注意,sys.ar ...