TPLL計(jì)數(shù)器教程 #1-最基礎(chǔ)的sequence encoder和aw記號(hào)
喵嗚~ 沒(méi)人研究計(jì)數(shù)器這香火續(xù)不上啊??
貓貓?jiān)诖恕? 是對(duì)八月十九日群里聊天記錄的匯總? ?想要文件的請(qǐng)入群
這一篇主要講了sequence encoder和aw記號(hào)的制作,難度大概在2/10? 屬于入門(mén)計(jì)數(shù)器必看內(nèi)容
名前は琪露諾 20:51:00 emm 名前は琪露諾 20:51:38 你先理解一下aw 名前は琪露諾 20:52:20 [圖片]
名前は琪露諾 20:53:12 這個(gè)記號(hào)的增長(zhǎng)率是ω 群羊,時(shí)不時(shí)咩咩叫 20:53:33 這么強(qiáng)? 名前は琪露諾 20:53:37 。。 ?????? ?????????? 20:53:45 。。 名前は琪露諾 20:54:13 你能不能搞明白它的增長(zhǎng)率為什么是ω 群羊,時(shí)不時(shí)咩咩叫 20:54:34 不明白 群羊,時(shí)不時(shí)咩咩叫 20:54:38 再看看 名前は琪露諾 20:54:48 。 名前は琪露諾 20:55:14 你想想fgh 名前は琪露諾 20:55:17 是怎么展開(kāi)的 群羊,時(shí)不時(shí)咩咩叫 20:55:20 明白了 名前は琪露諾 20:55:29 ok 名前は琪露諾 20:55:48 那咱的目的就是把這個(gè)記號(hào)在gd里面重建 名前は琪露諾 20:56:32 還得教你如何做sequence encoder 名前は琪露諾 20:56:43 其實(shí)我之前發(fā)過(guò)視頻不過(guò)刪了 名前は琪露諾 20:57:37 下面先說(shuō)怎么做se 名前は琪露諾 20:58:04 sequence encoder顧名思義,就是把一段序列編碼 群羊,時(shí)不時(shí)咩咩叫 20:58:38 e 名前は琪露諾 20:58:39 像上文提到的aw記號(hào),本質(zhì)上是對(duì)一段序列進(jìn)行操作 名前は琪露諾 20:58:58 但是序列的長(zhǎng)度是變量 名前は琪露諾 20:59:15 所以一般的指令處理不了一段變化的序列 名前は琪露諾 20:59:23 所以需要編碼器 名前は琪露諾 20:59:57 序列有可能是無(wú)限長(zhǎng)的,所以這個(gè)編碼器巧妙的使用了方塊之間的距離 名前は琪露諾 21:00:28 因?yàn)榫嚯x是可變的變量,同時(shí)是可以無(wú)限大的(理論情況) 名前は琪露諾 21:00:52 所以se本質(zhì)上是將一段序列轉(zhuǎn)換成方塊之間的距離 霧雨魔理沙kira 21:01:01 相當(dāng)于一進(jìn)制 名前は琪露諾 21:01:08 不 霧雨魔理沙kira 21:01:13 1代表分隔符,0的個(gè)數(shù)表示數(shù)字 名前は琪露諾 21:01:18 占位符也是很重要的好嘛 名前は琪露諾 21:01:49 lumi采用了二進(jìn)制的方法 名前は琪露諾 21:02:03 因?yàn)楸容^簡(jiǎn)單 名前は琪露諾 21:02:20 既然是將序列變成距離 名前は琪露諾 21:02:35 就需要一個(gè)轉(zhuǎn)換的模板 名前は琪露諾 21:03:25 當(dāng)然可以不一樣,不過(guò)主流想法是用0代表序列中的每個(gè)數(shù)字,1代表序列里兩個(gè)數(shù)字的分割 名前は琪露諾 21:03:54 序列中數(shù)字的大小,對(duì)應(yīng)0的多少 名前は琪露諾 21:04:15 例如: seq(0,1,2) = 110100 名前は琪露諾 21:04:48 一般在最開(kāi)頭放個(gè)1防bug 名前は琪露諾 21:06:03 序列里面的0被轉(zhuǎn)換成了" 1" 1被轉(zhuǎn)換成 "01" 2被轉(zhuǎn)換成 "00" 名前は琪露諾 21:06:45 二進(jìn)制的最后一般不再加入1 取決于你的操作方法 名前は琪露諾 21:07:24 綜上所述,一段序列被轉(zhuǎn)換成了一段二進(jìn)制,這就是se的核心思路 名前は琪露諾 21:07:35 下面說(shuō)在幾何沖刺里面制作se 名前は琪露諾 21:08:15 因?yàn)間d里面沒(méi)有簡(jiǎn)單的可以存儲(chǔ)無(wú)限數(shù)字的變量 名前は琪露諾 21:08:23 所以采取block之間的距離 名前は琪露諾 21:08:59 我們要完成的,是給定一個(gè)序列,輸出一個(gè)距離用以表示這個(gè)序列 名前は琪露諾 21:09:36 指令基本教程這里不再贅述 名前は琪露諾 21:10:12 用兩個(gè)collision block來(lái)表示距離 名前は琪露諾 21:10:22 因?yàn)楹竺嫔婕暗脚鲎? 名前は琪露諾 21:10:56 那么假設(shè)已知我要生成一個(gè)序列(0,10) 名前は琪露諾 21:11:17 首先將它轉(zhuǎn)換成二進(jìn)制"110000000000" 名前は琪露諾 21:11:56 之后我們要做的,就是移動(dòng)一段的block,使兩者之間的距離為這個(gè)數(shù) 名前は琪露諾 21:12:34 當(dāng)然之間設(shè)置move是不可取的,因?yàn)槲覀兂3R獙?duì)序列進(jìn)行多種操作,所以我們需要一個(gè)最基本的操作方式 名前は琪露諾 21:12:56 那就是:給距離加"0"或者加"1" 名前は琪露諾 21:14:20 假設(shè)原序列的距離已經(jīng)是一個(gè)數(shù)"#",我們要在這個(gè)二進(jìn)制后面加0或1 群羊,時(shí)不時(shí)咩咩叫 21:14:34 先乘二? 名前は琪露諾 21:14:42 yes 名前は琪露諾 21:14:51 左移 名前は琪露諾 21:15:32 如果想加0,那么對(duì)于原距離乘2 加1則是乘2加1 名前は琪露諾 21:15:52 好,那么距離操作的基本內(nèi)容已經(jīng)ok了 名前は琪露諾 21:16:42 [不支持的元素類型]如果想生成這個(gè),將原距離(乘2加1)重復(fù)兩遍,再(乘2)重復(fù)十遍 名前は琪露諾 21:17:04 用指令你應(yīng)該會(huì) 名前は琪露諾 21:17:21 follow或者move+碰撞都可 名前は琪露諾 21:17:29 這里說(shuō)follow 名前は琪露諾 21:18:36 最開(kāi)始我們放了兩個(gè)方塊a和b 下面讓b follow a 之后將a move to b 之后ab之間的距離就乘2了 名前は琪露諾 21:18:57 加1只用單獨(dú)b move一格即可 名前は琪露諾 21:19:24 se的內(nèi)容講完了 名前は琪露諾 21:19:31 下面再接著說(shuō)aw 名前は琪露諾 21:20:15 如果想在gd里面實(shí)現(xiàn)aw,我們需要 1.se(已ok) 2.將aw的展開(kāi)方式在gd里面還原 名前は琪露諾 21:20:36 假設(shè)我們已知了一段合法aw序列 名前は琪露諾 21:20:58 如何使用距離的基本操作來(lái)展開(kāi)這個(gè)序列? 名前は琪露諾 21:21:14 還是舉個(gè)例子 名前は琪露諾 21:21:35 假設(shè)有合法aw序列 (0,2) 名前は琪露諾 21:22:08 那么第一步是運(yùn)用se將它變成距離"1100" 名前は琪露諾 21:22:24 上文提到不再贅述 名前は琪露諾 21:22:36 第二步是將它展開(kāi) 名前は琪露諾 21:23:10 根據(jù)aw的展開(kāi)方式,我們有 (0,2) → (0,1,1,1,...) 名前は琪露諾 21:23:42 這里展開(kāi)成多少個(gè)1,取決于[row] 名前は琪露諾 21:24:03 所以你需要一個(gè)變量來(lái)儲(chǔ)存row 名前は琪露諾 21:24:31 鑒于row可能很大的原因,最好的方法是再找兩個(gè)block來(lái)用距離表示row 名前は琪露諾 21:25:02 這里不在使用二進(jìn)制,原因是這個(gè)變量是一個(gè)數(shù)字,并不是序列 名前は琪露諾 21:25:11 不需要分隔符 名前は琪露諾 21:25:27 那么我們開(kāi)始展開(kāi) 名前は琪露諾 21:26:28 首先aw的展開(kāi)在距離上是如此表現(xiàn)的 (0,2) - (0,1,1,1) 假設(shè)row=2 "1100" - "1101010" 名前は琪露諾 21:27:15 可以看到,在aw的展開(kāi)中,我們需要知道最后一位的數(shù)字,并展開(kāi)成row+1個(gè)它減去1 名前は琪露諾 21:27:45 因此,我們還需要一個(gè)變量來(lái)存儲(chǔ)最后一位的數(shù)字 名前は琪露諾 21:28:21 就管它叫l(wèi)ast term,當(dāng)然還是使用兩個(gè)方塊之間的距離表示 名前は琪露諾 21:30:55 那么展開(kāi)步驟如下 1.指針從末端向前讀取0的個(gè)數(shù),并將它存儲(chǔ)到lastterm 2.指針讀取到一個(gè)1,停止,并開(kāi)始復(fù)制row+1個(gè)lastterm-1 3.指針向后不斷復(fù)制l-1個(gè)0,復(fù)制完畢一輪插入一個(gè)1當(dāng)分隔符,之后重復(fù),直到row+1 4.結(jié)束復(fù)制 名前は琪露諾 21:31:47 這里涉及到了se讀取的內(nèi)容 名前は琪露諾 21:31:56 剛剛忘了說(shuō)了,現(xiàn)在補(bǔ)上 名前は琪露諾 21:32:38 se的寫(xiě)入,采用乘2(+1)的方法 se的讀取,同樣是除以2 名前は琪露諾 21:33:05 但是除法會(huì)產(chǎn)生余數(shù) 名前は琪露諾 21:33:29 所以我們需要額外的一個(gè)方塊來(lái)充當(dāng)檢測(cè)余數(shù)的作用 名前は琪露諾 21:34:30 還是舉例 名前は琪露諾 21:35:49 給定序列距離"1100"如何讀取lastterm? 可在block b前面放一個(gè)block c 名前は琪露諾 21:36:27 將block a move to 原點(diǎn) 隨后讓a 前進(jìn)一格 bc倒退一格 名前は琪露諾 21:37:21 如此操作,當(dāng)a與bc相遇時(shí) 若a碰到c,則整個(gè)序列長(zhǎng)度是偶數(shù)(結(jié)尾是0) 若a碰b,則序列長(zhǎng)度為奇 名前は琪露諾 21:38:05 這便完成了se中的讀取,獲得了距離中最后一位二進(jìn)制的信息 名前は琪露諾 21:38:18 [不支持的元素類型]說(shuō)回正題 名前は琪露諾 21:39:00 1要求我們不斷向前讀取,統(tǒng)計(jì)0的個(gè)數(shù),實(shí)際上是在獲取lastterm的信息 名前は琪露諾 21:39:46 每當(dāng)我們讀取到一個(gè)0,負(fù)責(zé)存儲(chǔ)lt的block便前進(jìn)一格,代表lt讀入一個(gè)0 名前は琪露諾 21:40:14 那么假設(shè)序列為"1100"我們向前讀到兩個(gè)0,則lt為2 名前は琪露諾 21:40:25 成功實(shí)現(xiàn)獲取lt信息 名前は琪露諾 21:41:01 2.讀入遇到1停止,因?yàn)槲覀円呀?jīng)讀完了lt,要開(kāi)始復(fù)制 名前は琪露諾 21:41:19 此時(shí)指針應(yīng)向后移動(dòng),開(kāi)始復(fù)制 名前は琪露諾 21:41:54 先前我們擁有一個(gè)lt變量和一個(gè)row變量 名前は琪露諾 21:42:21 這時(shí)先插入一個(gè)1 名前は琪露諾 21:43:10 原因是先前讀取的時(shí)候是讀掉了"1100"中的第二個(gè)1才知道要停止 名前は琪露諾 21:43:35 所以為防止先前序列不變需要插入一個(gè)1 名前は琪露諾 21:43:42 之后便開(kāi)始插入0 名前は琪露諾 21:44:34 每完成一次插入,將lt中的起點(diǎn)方塊向前移動(dòng)一格 名前は琪露諾 21:45:23 此處應(yīng)當(dāng)注意,lt在獲取完信息之后要向前移動(dòng)一格,相當(dāng)于-1 名前は琪露諾 21:46:06 重復(fù)插入0直到lt的起點(diǎn)方塊碰到終點(diǎn)方塊,代表我們?cè)谛蛄兄胁迦肓艘粋€(gè)lt-1 名前は琪露諾 21:46:56 此時(shí)讓row的起點(diǎn)方塊前進(jìn)一格,并重置lt的起點(diǎn)方塊,并插入一個(gè)1 名前は琪露諾 21:47:55 重復(fù)進(jìn)行這樣的循環(huán) lt前進(jìn)直到碰,之后row前進(jìn)一格 直到row的起點(diǎn)方塊碰到終點(diǎn)方塊 名前は琪露諾 21:48:26 此處不需要再插入1,不過(guò)也可不做處理,因?yàn)椴挥绊懡Y(jié)果 名前は琪露諾 21:49:35 row的兩個(gè)方塊碰到之后,代表這一整次的展開(kāi)完成了,重置lt的兩個(gè)方塊,并重新開(kāi)始向前讀取,準(zhǔn)備下一次的展開(kāi) 名前は琪露諾 21:49:59 下面說(shuō)一下如何結(jié)束這個(gè)東西 名前は琪露諾 21:50:38 在aw里面,如果序列的末端是(0)那么可以去掉并row++ 名前は琪露諾 21:51:26 同理,在幾何沖刺里面向前讀取如果在沒(méi)有碰到"0"的情況下碰到了"1",那么不用復(fù)制,將row增加1,繼續(xù)讀取 名前は琪露諾 21:52:03 所以從指令的角度看,一直讀到"1"說(shuō)明block a一直和b碰撞 名前は琪露諾 21:52:32 所以在最后的最后,這個(gè)序列會(huì)壞掉,b會(huì)在a的左側(cè) 名前は琪露諾 21:53:24 所以主流的做法是,檢測(cè)b是否碰到起始點(diǎn),若碰到了則去除wall,允許player過(guò)關(guān) 名前は琪露諾 21:54:02 綜上所述,一個(gè)aw記號(hào)在幾何沖刺中實(shí)現(xiàn)的思路就已經(jīng)完整了 名前は琪露諾 21:54:23 具體指令細(xì)節(jié)還需提醒一點(diǎn) 名前は琪露諾 21:55:03 在aw的展開(kāi)中,指針有兩種移動(dòng)模式,分別為向前移動(dòng)讀取和向后移動(dòng)寫(xiě)入 名前は琪露諾 21:55:50 鑒于整個(gè)機(jī)器是由touch觸發(fā),有必要設(shè)置一個(gè)mode變量用以存儲(chǔ)什么時(shí)候該讀什么時(shí)候該寫(xiě) 名前は琪露諾 21:56:06 mode是有限變量所以使用item即可 名前は琪露諾 21:57:25 整個(gè)機(jī)器的指令思路大概是 touch→instant count檢測(cè)mode→分別對(duì)應(yīng)兩種不同mode的操作 名前は琪露諾 21:58:20 初始設(shè)定建議手動(dòng)設(shè)置距離序列(0,n),同時(shí)手動(dòng)設(shè)置row的大小,畢竟row是你要放在fgh里面的數(shù)字 名前は琪露諾 21:58:43 吶,就這樣,也不是很難 名前は琪露諾 22:02:29 這是計(jì)數(shù)器 名前は琪露諾 22:02:50 如果不懂指令設(shè)計(jì),可以借鑒 名前は琪露諾 22:05:00 其實(shí)吧,計(jì)數(shù)器唯一有點(diǎn)難的地方就在于將記號(hào)展開(kāi)方式做到gd里面的思路,如果思路有了其實(shí)指令設(shè)計(jì)不是很難的 博麗靈夢(mèng) 22:12:32 玩了會(huì)泰拉瑞亞99+ ?????? ?????????? 22:12:41 [不支持的元素類型]@博麗靈夢(mèng) 看看 名前は琪露諾 22:12:48 沒(méi)愛(ài)了