TPLL计数器教程 #1-最基础的sequence encoder和aw记号
喵呜~ 没人研究计数器这香火续不上啊😭
猫猫在此~ 是对八月十九日群里聊天记录的汇总 想要文件的请入群
这一篇主要讲了sequence encoder和aw记号的制作,难度大概在2/10 属于入门计数器必看内容
名前は琪露诺 20:51:00 emm 名前は琪露诺 20:51:38 你先理解一下aw 名前は琪露诺 20:52:20 [图片]
名前は琪露诺 20:53:12 这个记号的增长率是ω 群羊,时不时咩咩叫 20:53:33 这么强? 名前は琪露诺 20:53:37 。。 𝙀𝙩𝙖 𝙃𝙮𝙥𝙚𝙧 20:53:45 。。 名前は琪露诺 20:54:13 你能不能搞明白它的增长率为什么是ω 群羊,时不时咩咩叫 20:54:34 不明白 群羊,时不时咩咩叫 20:54:38 再看看 名前は琪露诺 20:54:48 。 名前は琪露诺 20:55:14 你想想fgh 名前は琪露诺 20:55:17 是怎么展开的 群羊,时不时咩咩叫 20:55:20 明白了 名前は琪露诺 20:55:29 ok 名前は琪露诺 20:55:48 那咱的目的就是把这个记号在gd里面重建 名前は琪露诺 20:56:32 还得教你如何做sequence encoder 名前は琪露诺 20:56:43 其实我之前发过视频不过删了 名前は琪露诺 20:57:37 下面先说怎么做se 名前は琪露诺 20:58:04 sequence encoder顾名思义,就是把一段序列编码 群羊,时不时咩咩叫 20:58:38 e 名前は琪露诺 20:58:39 像上文提到的aw记号,本质上是对一段序列进行操作 名前は琪露诺 20:58:58 但是序列的长度是变量 名前は琪露诺 20:59:15 所以一般的指令处理不了一段变化的序列 名前は琪露诺 20:59:23 所以需要编码器 名前は琪露诺 20:59:57 序列有可能是无限长的,所以这个编码器巧妙的使用了方块之间的距离 名前は琪露诺 21:00:28 因为距离是可变的变量,同时是可以无限大的(理论情况) 名前は琪露诺 21:00:52 所以se本质上是将一段序列转换成方块之间的距离 雾雨魔理沙kira 21:01:01 相当于一进制 名前は琪露诺 21:01:08 不 雾雨魔理沙kira 21:01:13 1代表分隔符,0的个数表示数字 名前は琪露诺 21:01:18 占位符也是很重要的好嘛 名前は琪露诺 21:01:49 lumi采用了二进制的方法 名前は琪露诺 21:02:03 因为比较简单 名前は琪露诺 21:02:20 既然是将序列变成距离 名前は琪露诺 21:02:35 就需要一个转换的模板 名前は琪露诺 21:03:25 当然可以不一样,不过主流想法是用0代表序列中的每个数字,1代表序列里两个数字的分割 名前は琪露诺 21:03:54 序列中数字的大小,对应0的多少 名前は琪露诺 21:04:15 例如: seq(0,1,2) = 110100 名前は琪露诺 21:04:48 一般在最开头放个1防bug 名前は琪露诺 21:06:03 序列里面的0被转换成了" 1" 1被转换成 "01" 2被转换成 "00" 名前は琪露诺 21:06:45 二进制的最后一般不再加入1 取决于你的操作方法 名前は琪露诺 21:07:24 综上所述,一段序列被转换成了一段二进制,这就是se的核心思路 名前は琪露诺 21:07:35 下面说在几何冲刺里面制作se 名前は琪露诺 21:08:15 因为gd里面没有简单的可以存储无限数字的变量 名前は琪露诺 21:08:23 所以采取block之间的距离 名前は琪露诺 21:08:59 我们要完成的,是给定一个序列,输出一个距离用以表示这个序列 名前は琪露诺 21:09:36 指令基本教程这里不再赘述 名前は琪露诺 21:10:12 用两个collision block来表示距离 名前は琪露诺 21:10:22 因为后面涉及到碰撞 名前は琪露诺 21:10:56 那么假设已知我要生成一个序列(0,10) 名前は琪露诺 21:11:17 首先将它转换成二进制"110000000000" 名前は琪露诺 21:11:56 之后我们要做的,就是移动一段的block,使两者之间的距离为这个数 名前は琪露诺 21:12:34 当然之间设置move是不可取的,因为我们常常要对序列进行多种操作,所以我们需要一个最基本的操作方式 名前は琪露诺 21:12:56 那就是:给距离加"0"或者加"1" 名前は琪露诺 21:14:20 假设原序列的距离已经是一个数"#",我们要在这个二进制后面加0或1 群羊,时不时咩咩叫 21:14:34 先乘二? 名前は琪露诺 21:14:42 yes 名前は琪露诺 21:14:51 左移 名前は琪露诺 21:15:32 如果想加0,那么对于原距离乘2 加1则是乘2加1 名前は琪露诺 21:15:52 好,那么距离操作的基本内容已经ok了 名前は琪露诺 21:16:42 [不支持的元素类型]如果想生成这个,将原距离(乘2加1)重复两遍,再(乘2)重复十遍 名前は琪露诺 21:17:04 用指令你应该会 名前は琪露诺 21:17:21 follow或者move+碰撞都可 名前は琪露诺 21:17:29 这里说follow 名前は琪露诺 21:18:36 最开始我们放了两个方块a和b 下面让b follow a 之后将a move to b 之后ab之间的距离就乘2了 名前は琪露诺 21:18:57 加1只用单独b move一格即可 名前は琪露诺 21:19:24 se的内容讲完了 名前は琪露诺 21:19:31 下面再接着说aw 名前は琪露诺 21:20:15 如果想在gd里面实现aw,我们需要 1.se(已ok) 2.将aw的展开方式在gd里面还原 名前は琪露诺 21:20:36 假设我们已知了一段合法aw序列 名前は琪露诺 21:20:58 如何使用距离的基本操作来展开这个序列? 名前は琪露诺 21:21:14 还是举个例子 名前は琪露诺 21:21:35 假设有合法aw序列 (0,2) 名前は琪露诺 21:22:08 那么第一步是运用se将它变成距离"1100" 名前は琪露诺 21:22:24 上文提到不再赘述 名前は琪露诺 21:22:36 第二步是将它展开 名前は琪露诺 21:23:10 根据aw的展开方式,我们有 (0,2) → (0,1,1,1,...) 名前は琪露诺 21:23:42 这里展开成多少个1,取决于[row] 名前は琪露诺 21:24:03 所以你需要一个变量来储存row 名前は琪露诺 21:24:31 鉴于row可能很大的原因,最好的方法是再找两个block来用距离表示row 名前は琪露诺 21:25:02 这里不在使用二进制,原因是这个变量是一个数字,并不是序列 名前は琪露诺 21:25:11 不需要分隔符 名前は琪露诺 21:25:27 那么我们开始展开 名前は琪露诺 21:26:28 首先aw的展开在距离上是如此表现的 (0,2) - (0,1,1,1) 假设row=2 "1100" - "1101010" 名前は琪露诺 21:27:15 可以看到,在aw的展开中,我们需要知道最后一位的数字,并展开成row+1个它减去1 名前は琪露诺 21:27:45 因此,我们还需要一个变量来存储最后一位的数字 名前は琪露诺 21:28:21 就管它叫last term,当然还是使用两个方块之间的距离表示 名前は琪露诺 21:30:55 那么展开步骤如下 1.指针从末端向前读取0的个数,并将它存储到lastterm 2.指针读取到一个1,停止,并开始复制row+1个lastterm-1 3.指针向后不断复制l-1个0,复制完毕一轮插入一个1当分隔符,之后重复,直到row+1 4.结束复制 名前は琪露诺 21:31:47 这里涉及到了se读取的内容 名前は琪露诺 21:31:56 刚刚忘了说了,现在补上 名前は琪露诺 21:32:38 se的写入,采用乘2(+1)的方法 se的读取,同样是除以2 名前は琪露诺 21:33:05 但是除法会产生余数 名前は琪露诺 21:33:29 所以我们需要额外的一个方块来充当检测余数的作用 名前は琪露诺 21:34:30 还是举例 名前は琪露诺 21:35:49 给定序列距离"1100"如何读取lastterm? 可在block b前面放一个block c 名前は琪露诺 21:36:27 将block a move to 原点 随后让a 前进一格 bc倒退一格 名前は琪露诺 21:37:21 如此操作,当a与bc相遇时 若a碰到c,则整个序列长度是偶数(结尾是0) 若a碰b,则序列长度为奇 名前は琪露诺 21:38:05 这便完成了se中的读取,获得了距离中最后一位二进制的信息 名前は琪露诺 21:38:18 [不支持的元素类型]说回正题 名前は琪露诺 21:39:00 1要求我们不断向前读取,统计0的个数,实际上是在获取lastterm的信息 名前は琪露诺 21:39:46 每当我们读取到一个0,负责存储lt的block便前进一格,代表lt读入一个0 名前は琪露诺 21:40:14 那么假设序列为"1100"我们向前读到两个0,则lt为2 名前は琪露诺 21:40:25 成功实现获取lt信息 名前は琪露诺 21:41:01 2.读入遇到1停止,因为我们已经读完了lt,要开始复制 名前は琪露诺 21:41:19 此时指针应向后移动,开始复制 名前は琪露诺 21:41:54 先前我们拥有一个lt变量和一个row变量 名前は琪露诺 21:42:21 这时先插入一个1 名前は琪露诺 21:43:10 原因是先前读取的时候是读掉了"1100"中的第二个1才知道要停止 名前は琪露诺 21:43:35 所以为防止先前序列不变需要插入一个1 名前は琪露诺 21:43:42 之后便开始插入0 名前は琪露诺 21:44:34 每完成一次插入,将lt中的起点方块向前移动一格 名前は琪露诺 21:45:23 此处应当注意,lt在获取完信息之后要向前移动一格,相当于-1 名前は琪露诺 21:46:06 重复插入0直到lt的起点方块碰到终点方块,代表我们在序列中插入了一个lt-1 名前は琪露诺 21:46:56 此时让row的起点方块前进一格,并重置lt的起点方块,并插入一个1 名前は琪露诺 21:47:55 重复进行这样的循环 lt前进直到碰,之后row前进一格 直到row的起点方块碰到终点方块 名前は琪露诺 21:48:26 此处不需要再插入1,不过也可不做处理,因为不影响结果 名前は琪露诺 21:49:35 row的两个方块碰到之后,代表这一整次的展开完成了,重置lt的两个方块,并重新开始向前读取,准备下一次的展开 名前は琪露诺 21:49:59 下面说一下如何结束这个东西 名前は琪露诺 21:50:38 在aw里面,如果序列的末端是(0)那么可以去掉并row++ 名前は琪露诺 21:51:26 同理,在几何冲刺里面向前读取如果在没有碰到"0"的情况下碰到了"1",那么不用复制,将row增加1,继续读取 名前は琪露诺 21:52:03 所以从指令的角度看,一直读到"1"说明block a一直和b碰撞 名前は琪露诺 21:52:32 所以在最后的最后,这个序列会坏掉,b会在a的左侧 名前は琪露诺 21:53:24 所以主流的做法是,检测b是否碰到起始点,若碰到了则去除wall,允许player过关 名前は琪露诺 21:54:02 综上所述,一个aw记号在几何冲刺中实现的思路就已经完整了 名前は琪露诺 21:54:23 具体指令细节还需提醒一点 名前は琪露诺 21:55:03 在aw的展开中,指针有两种移动模式,分别为向前移动读取和向后移动写入 名前は琪露诺 21:55:50 鉴于整个机器是由touch触发,有必要设置一个mode变量用以存储什么时候该读什么时候该写 名前は琪露诺 21:56:06 mode是有限变量所以使用item即可 名前は琪露诺 21:57:25 整个机器的指令思路大概是 touch→instant count检测mode→分别对应两种不同mode的操作 名前は琪露诺 21:58:20 初始设定建议手动设置距离序列(0,n),同时手动设置row的大小,毕竟row是你要放在fgh里面的数字 名前は琪露诺 21:58:43 呐,就这样,也不是很难 名前は琪露诺 22:02:29 这是计数器 名前は琪露诺 22:02:50 如果不懂指令设计,可以借鉴 名前は琪露诺 22:05:00 其实吧,计数器唯一有点难的地方就在于将记号展开方式做到gd里面的思路,如果思路有了其实指令设计不是很难的 博丽灵梦 22:12:32 玩了会泰拉瑞亚99+ 𝙀𝙩𝙖 𝙃𝙮𝙥𝙚𝙧 22:12:41 [不支持的元素类型]@博丽灵梦 看看 名前は琪露诺 22:12:48 没爱了