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

【TIS-100 攻略】TIS-NET 第 14 关:密闭空间路径查看器

2022-11-08 11:51 作者:ココアお姉ちゃん  | 我要投稿

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

TIS-NET 第 14 关《密闭空间路径查看器》(Spatial Path Viewer)关卡展示

本关需要从 IN 里读入一个角度值 ang 和一个长度值 len,然后根据以下规则在画布上画出水平线和垂直线:

  • 画笔初始位置在左上角 (0, 0) 点;

  • ang = 0 时,画一条以当前点起始的,方向向右的,长度为 len 的水平线;

  • ang = 90 时,画一条以当前点起始的,方向向上的,长度为 len 的垂直线;

  • ang = 180 时,画一条以当前点起始的,方向向左的,长度为 len 的水平线;

  • ang = 270 时,画一条以当前点起始的,方向向下的,长度为 len 的垂直线。

转换成具体的坐标的话,如下:

  • 画笔初始位置在左上角 (0, 0) 点;

  • ang = 0 时,画笔的坐标由当前的 (x, y) 移动到 (x+len-1, y);

  • ang = 90 时,画笔的坐标由当前的 (x, y) 移动到 (x, y-len+1);

  • ang = 180 时,画笔的坐标由当前的 (x, y) 移动到 (x-len+1, y);

  • ang = 270 时,画笔的坐标由当前的 (x, y) 移动到 (x, y+len-1)。

本关首先要将角度值 0、90、180、270 映射成坐标偏移量 (Δx, Δy)。映射关系如下:

  • 0 → (1, 0);

  • 90 → (0, -1);

  • 180 → (-1, 0);

  • 270 → (0, 1)。

我们每画一个点,就按照以上方式偏移画笔坐标。然后,由于每画一条线,画笔都需要向同样的方向偏移 len-1 次,所以同样的偏移量我们需要连续发送 len-1 次。本关的代码如下:

首先,因为每一个角度都映射成了 (Δx, Δy) 这两个数字,所以我们在查表前,首先要将 0、90、180、270 映射成表中的地址值。上方节点的前 5 行代码用于将角度值转换成地址值:读入一个角度后,不断减去 87(mov up acc, sub 87, jgz 2),直到减到负数后再加回一个 88(add 88)。因此,角度值和地址值的映射关系如下表所示:

角度 0 映射到了地址 1,角度 90 映射到了地址 4,角度 180 映射到了地址 7,角度 270 映射到了地址 10。我们将算好的地址值发给下方(mov acc down)。

接下来第 6~11 行代码则是往下发 len-2 次 -2(mov up acc, sub 2, mov -2 down, sub 1, jnz 8)和一次 -999(mov -999 down)。

中央节点纯传话(mov up down)。

左下角的节点就是记录了四种 (Δx, Δy) 的表。由于画图节点在传完 (x, y) 坐标后,acc 和 bak 已经经过了一次交换,acc 里存放的是实时的 y 坐标,bak 里存放的是实时的 x 坐标。那么为了减少 swp 指令的使用次数,在移动画笔时,我们选择先提供 Δy,再提供 Δx。

左下角点首先等待上方传来 1/4/7/10 的地址值(jro up):

  • 传来 1 时,说明当前角度是 0,我们向下跳 1 行,给画图节点传入 Δy = 0, Δx = 1 的偏移量(mov 0 right, mov 1 right);

  • 传来 4 时,说明当前角度是 90,我们向下跳 4 行,给画图节点传入 Δy = -1, Δx = 0 的偏移量(mov -1 right, mov 0 right);

  • 传来 7 时,说明当前角度是 180,我们向下跳 7 行,给画图节点传入 Δy = 0, Δx = -1 的偏移量(mov 0 right, mov -1 right);

  • 传来 10 时,说明当前角度是 270,我们向下跳 10 行,给画图节点传入 Δy = 1, Δx = 0 的偏移量(mov 1 right, mov 0 right)。

注意到以上四个代码块的下方都有一个对应的 jro up 指令。由于同样的偏移量需要传 len-1 次,而我们刚才已经传了一次,还剩下 len-2 次没有传。上方节点还会给我们发送 len-2 次 -2。我们每收到一次 -2,就往上跳 2 行,将同样的偏移量再往右边发送一次。同样的偏移量重复发送 len-1 次后,我们最终会收到上方发来的 -999 指令。由于我们的上方并没有 999 行代码,所以程序会选择最近的边界点,即跳到首行的 jro up,等待上方节点发来下一次的地址值。

最后是右下角的画图节点:

  1. 画图节点的 acc 里存的是画笔当前的 x 坐标,bak 里存储的是画笔当前的 y 坐标。我们首先给 image 依次发送 x(mov acc down)

  2. y(swp)

  3. (mov acc down)

  4. 3(mov 3 down)

  5. -1(mov -1 down),要求 image 在 (x, y) 处画一个白色的点。

  6. 接下来,我们不断从左下角的节点接收 Δy 和 Δx,将对应的偏移量加到 y 和 x 上去(add left)

  7. (swp)

  8. (add left)每收到一组偏移量,就跳回第一行继续在新的 (x, y) 上画点。如此反复,直到画完所有要求的线条。

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


【TIS-100 攻略】TIS-NET 第 14 关:密闭空间路径查看器的评论 (共 条)

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