欢迎光临散文网 会员登陆 & 注册

【TIS-100 攻略】TIS-NET 第 13 关:测试图 4

2022-11-07 13:50 作者:ココアお姉ちゃん  | 我要投稿

本文首发于 B 站《TIS-100》文集(https://www.bilibili.com/read/readlist/rl626023)。原创不易,转载请注明出处。

TIS-NET 第 13 关《测试图 4》(Image Pattern 4)关卡展示

本关需要画出一个比上一章第 15 关纹理更丰富的国际象棋棋盘。我们将每个像素的色号写出来,如下:

第一行是 0、1、2、3 循环,第二行是 1、0、3、2 循环,第三行是 2、3、0、1 循环,第四行是 3、2、1、0 循环。乍一看,要使用四个无限流来提供颜色。但是画图节点的下方邻居已经是 image 了,可以用的邻居只有三个。能不能省去若干个无限流呢?答案是可以的,如果我们只看偶数行:

可以看到:偶数行的颜色是按 0、1、2、3 的顺序依次出现的,只看偶数行的话,第 2 行开头的 2 其实是接在第 0 行结尾的 1 后面的,0、1、2、3 的顺序并没有被打乱。

然后我们再只看奇数行:

奇数行的颜色则是按 1、0、3、2 的顺序依次出现。这样,问题就解决了,我们提供两个无限流,其中一个用来提供偶数行的颜色,另一个用来提供奇数行的颜色。我们画第偶数行时,就从第一个流里取颜色;画第奇数行时,就从第二个流里取颜色。如此,问题解决。代码如下:

画图节点的三个邻居节点提供了三个无限流:

上方提供的是 y 坐标流,从 0 开始,每提供一个数(mov acc down)就将自身 +1(add 1),因此会依次发送 0,1,2,3,……,直到最终的 17。

左边提供的是偶数行的颜色流,按 0、1、2、3 循环(mov 0 right, mov 1 right, mov 2 right, mov 3 right)。

右边提供的是奇数行的颜色流,按 1、0、3、2 循环(mov 1 left, mov 0 left, mov 3 left, mov 2 left)。

中间的画图节点就是在跟这些流打交道:

  1. 前 7 行是用来画偶数行的,向下发送起始 x(mov 0 down)

  2. 和起始 y(mov up down)后,

  3. 从【左边】的无限流中取 30 个颜色发给下方(mov 30 acc)

  4. (mov left down)

  5. (sub 1)

  6. (jnz 4)

  7. 最后发一个 -1(mov -1 down);

  8. 后 7 行是用来画奇数行的,向下发送起始 x(mov 0 down)

  9. 和起始 y(mov up down)后,

  10. 从【右边】的无限流中取 30 个颜色发给下方(mov 30 acc)

  11. (mov right down)

  12. (sub 1)

  13. (jnz b)

  14. 最后发一个 -1(mov -1 down)。两段代码只有行号和一个方向的区别。

点击左下角的【RUN】,稍等片刻,便会弹出结算界面:


【TIS-100 攻略】TIS-NET 第 13 关:测试图 4的评论 (共 条)

分享到微博请遵守国家法律