最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

【MCBE·命令】斷鏈的運(yùn)用及遞歸的轉(zhuǎn)入和轉(zhuǎn)出

2022-01-31 19:52 作者:Happy2018new  | 我要投稿

引言

? ? ? ?使用過 McFunction 的小伙伴都知道,我們可以在一個(gè)函數(shù)中調(diào)用函數(shù),也可以對多個(gè)對象使用函數(shù),也就是諸如 Execute Target ~ ~ ~ Function FilePath 的用法。

? ? ???函數(shù)就是包含指令的 .mcfunction 文件,我們執(zhí)行函數(shù)就是執(zhí)行里面包含的指令。如果函數(shù)外有預(yù)設(shè)指令的執(zhí)行環(huán)境,例如使用 Execute 來執(zhí)行函數(shù),那么函數(shù)內(nèi)的指令在被執(zhí)行時(shí)也會(huì)繼承執(zhí)行環(huán)境,例如執(zhí)行位置、執(zhí)行維度、執(zhí)行朝向、命令執(zhí)行者等內(nèi)容都會(huì)發(fā)生繼承。

? ? ? ?一般地,在使用函數(shù)的時(shí)候,我們不希望每次都執(zhí)行所有函數(shù)中的所有命令(功能項(xiàng)),因此我們通過使用 Execute 命令 、?目標(biāo)選擇器目標(biāo)選擇器參數(shù) 來限制執(zhí)行條件,以達(dá)到“我需要執(zhí)行哪些命令就執(zhí)行哪些命令”的目的。

? ? ? ?也就是說,我們在函數(shù)包內(nèi)定義一個(gè)主函數(shù) run(.mcfunction) ,然后讓這個(gè)主函數(shù)根據(jù)我們定義的 限制條件 來訪問和調(diào)用其他函數(shù)。在不滿足條件的時(shí)候,主函數(shù) run 就不會(huì)調(diào)用對應(yīng)的函數(shù),而滿足條件時(shí),對應(yīng)的函數(shù)被調(diào)用。這樣,我們可以保證我們制作的指令系統(tǒng)在被閑置的時(shí)候,每GameTick內(nèi)平均執(zhí)行的命令量都不會(huì)太多。

正文

? ? ? ?那么前面扯了這么多關(guān)于函數(shù)的東西,它跟我們的命令方塊有些什么關(guān)系呢?

? ? ? ?我認(rèn)為這之間的關(guān)系可大了!

? ? ? ?假想一下,如果我們將以上關(guān)于函數(shù)的知識(shí)運(yùn)用到非函數(shù)領(lǐng)域,也就是租賃服中純命令方塊制作指令系統(tǒng)這一領(lǐng)域來,是不是也可以優(yōu)化租賃服,減少指令執(zhí)行量呢?

? ? ? ?“我需要執(zhí)行哪些命令就執(zhí)行哪些命令”是很容易達(dá)到的。如果主函數(shù) run 中要調(diào)用的其他子函數(shù)不必按順序運(yùn)行,即調(diào)換這些子函數(shù)的執(zhí)行順序都不會(huì)對最終結(jié)果造成影響,那么我們可以為主函數(shù) run 中提到的每一個(gè)子函數(shù)制作一個(gè)斷鏈,然后這些斷鏈都用于運(yùn)行主函數(shù) run 中提到的每一個(gè)子函數(shù)中的命令。

? ? ? ?那么,什么是斷鏈呢?

? ? ? ?如圖就是一個(gè)斷鏈。

斷鏈

? ? ? ?就如同字面意思,整個(gè)鏈?zhǔn)?strong>斷開的。如果我們?nèi)匀话颜麄€(gè)斷鏈看作函數(shù),那么我們可以近似的認(rèn)為,當(dāng)條件滿足時(shí)運(yùn)行函數(shù),即填上斷鏈上的空缺、執(zhí)行對應(yīng)的命令然后再重新設(shè)置空缺,讓它回到斷鏈狀態(tài)。當(dāng)條件不滿足時(shí)就不會(huì)運(yùn)行函數(shù),即不填補(bǔ)斷鏈上的空缺,后續(xù)的指令不會(huì)被執(zhí)行。

? ? ? ?需要注意的是,我們建議您在制作斷鏈時(shí)使用諸如以下格式的命令:

[重復(fù)·無條件的·保持開啟] testfor 目標(biāo)

[鏈·有條件的·保持開啟] setblock 坐標(biāo) chain_command_block 數(shù)據(jù)值

[空氣]

[鏈·無條件的·保持開啟] setblock 坐標(biāo)?air

? ? ? ?但我們?yōu)槭裁匆@么做呢,特別是使用 Testfor 這條命令。

? ? ? ?很顯然,機(jī)智的小伙伴肯定想到了,我們可以簡化以上指令,把 Testfor 和第二個(gè) Setblock 命令改寫為 Execute 型的命令,即 Execute 目標(biāo) ~ ~ ~ Setblock 坐標(biāo) chain_command_block 數(shù)據(jù)值 。

? ? ? ?不過,我們很快就會(huì)發(fā)現(xiàn)問題——如果斷鏈在主世界,而滿足條件的 目標(biāo) 不在主世界且只有1個(gè)時(shí),即使其本身滿足條件,斷鏈上的空缺也不會(huì)被填上。

? ? ? ?造成這個(gè)問題的根本原因在于 Execute 命令會(huì)繼承命令執(zhí)行者的執(zhí)行環(huán)境,這也包括執(zhí)行維度。因此,我們無法確定最終是在哪個(gè)維度執(zhí)行的 Setblock 命令,因?yàn)樗赡苁窃谙陆绲?坐標(biāo) 放置鏈命令方塊,也可能是在 末地?的坐標(biāo)放置鏈命令方塊。

? ? ? ?因此,如果確實(shí)要使用 Execute 命令來放置鏈命令方塊,那么必須要確定最終執(zhí)行的維度是在 主世界 ,我們可以多嵌套一層 Execute 以解決問題,例如:

Execute 目標(biāo) ~ ~ ~ Execute 一個(gè)在主世界的實(shí)體 ~ ~ ~ Setblock chain_command_block 數(shù)據(jù)值

? ? ? ?但考慮到實(shí)體可能會(huì)被清理等問題,我建議您將一條指令改寫為兩條指令。但無論如何,您都可以很簡單的解決維度問題。

? ? ? ?那么,斷鏈就說完了。不過我們只實(shí)現(xiàn)了一部分關(guān)于 Function 的功能。如果我們要將一個(gè) Function 轉(zhuǎn)換為指令意義上等效的命令方塊形式,那么我們應(yīng)該怎么做呢?

? ? ? ?假設(shè)有一個(gè)函數(shù)A,它里面有如下幾個(gè)命令:

Execute @e[tag=C] ~ ~ ~ Function B

Execute @e[tag=D] ~ ~ ~ Kill @s

? ? ? ?然后有一個(gè)函數(shù)B,它里面有如下幾個(gè)命令:

Say 1

Say 2

? ? ? ?然后,我們?nèi)绾螌⒚睢?Function A”轉(zhuǎn)化為純命令方塊形式呢?也就是說,我們要只依靠命令方塊實(shí)現(xiàn)函數(shù)A的功能。但我們仔細(xì)觀察函數(shù)A,我們發(fā)現(xiàn)它可能對多個(gè)實(shí)體使用了函數(shù)B……

? ? ? ?于是顯而易見的,我們不容易使用純命令方塊來實(shí)現(xiàn)函數(shù)A的功能,因?yàn)槲覀儫o法確定函數(shù)B到底會(huì)被執(zhí)行幾次,以及哪些實(shí)體會(huì)被執(zhí)行這些命令。

? ? ? ?這便是函數(shù)的優(yōu)勢所在。但我們?nèi)匀豢梢灾挥妹罘綁K完成函數(shù)A的功能,我們需要“給指令加點(diǎn)糖”。

? ? ? ?那么,我們怎么“加點(diǎn)糖”呢?答案是使用遞歸(俗稱“自閉鏈”)。

? ? ? ?讓我們看一個(gè)遞歸鏈的模型:

遞歸鏈模型

? ? ? ?按照正常的邏輯,一般情況下執(zhí)行這一個(gè)鏈只會(huì)執(zhí)行7個(gè)命令方塊內(nèi)的指令。但我們可以使用特殊方法讓它執(zhí)行更多的命令,也就是在1GameTick內(nèi)重復(fù)執(zhí)行右邊6個(gè)鏈命令方塊里面的命令。

? ? ? ?那么,我們應(yīng)該怎么做呢?

? ? ? ?很簡單,我們只需要了解一個(gè)特性就行了——假定一個(gè)鏈命令方塊G已經(jīng)在該時(shí)刻內(nèi)執(zhí)行過,那么我們可以把另一個(gè)沒有在該時(shí)刻內(nèi)被執(zhí)行過的鏈命令方塊復(fù)制到鏈命令方塊G所在的位置,然后鏈命令方塊G處的命令方塊就又可以被執(zhí)行了。

? ? ? ?利用這一個(gè)特性,我們可以做到“自閉”的效果。

? ? ? ?我們?yōu)檫@些命令方塊標(biāo)上號(hào),如 圖1 所示

圖 1

? ? ? ?然后,我們再把這些命令方塊復(fù)制一個(gè)模板到另一個(gè)位置,然后為模板上的命令方塊標(biāo)上號(hào)。需要注意的是,模板中的命令方塊不會(huì)被執(zhí)行,具體如 圖2 所示。

圖 2

? ? ? ?然后,我們執(zhí)行①,接著就會(huì)執(zhí)行②、③、④、⑤、⑥和⑦。我們在⑦和7所在的命令方塊放入同一個(gè) Clone 命令,其作用是將2、3和4復(fù)制到②、③和④。這樣,我們更新了第二行中的鏈命令方塊,然后游戲就會(huì)認(rèn)為這些鏈命令方塊沒有被執(zhí)行過,然后重新再執(zhí)行一次②、③和④。

? ? ? ?同理,我們可以在④和4中放入同一個(gè) Clone 命令,其作用是將5、6和7復(fù)制到⑤、⑥和⑦,然后游戲就會(huì)再執(zhí)行一次⑤、⑥和⑦。

? ? ? ?然后,一個(gè)遞歸鏈就做成了。一般地,①不會(huì)參與遞歸,那么從①到②這一過程,我們可以稱為遞歸的轉(zhuǎn)入。

? ? ? ?于是,我們可以很容易地實(shí)現(xiàn)函數(shù)A的功能了。我們再次看到函數(shù)A和函數(shù)B:

? ? ? ?函數(shù)A

Execute @e[tag=C] ~ ~ ~ Function B

Execute @e[tag=D] ~ ~ ~ Kill @s

? ? ? ?函數(shù)B

Say 1

Say 2

? ? ? ?將“Execute @e[tag=C] ~ ~ ~ Function B”解析一下,其大意就是讓每一個(gè)加載區(qū)域內(nèi)且帶有標(biāo)簽C存活的實(shí)體執(zhí)行函數(shù)B。那么,我們只需要統(tǒng)計(jì)這些實(shí)體的數(shù)量,然后將這些實(shí)體加入到待遍歷列并 逐一的 遍歷它們。

? ? ? ?我們剛剛統(tǒng)計(jì)的實(shí)體總數(shù)將作為遍歷總次數(shù),也就是我們需要遞歸的次數(shù)(要重復(fù)執(zhí)行命令的次數(shù))。

? ? ? ?每遍歷一個(gè)實(shí)體,我們就從總次數(shù)中減去1,直到總次數(shù)小于等于0,不再需要遍歷。

? ? ? ?也就是說,我們在開始遞歸前生成一個(gè)輔助實(shí)體J,然后將次數(shù)賦值給它,當(dāng)實(shí)體J的分?jǐn)?shù)≤0時(shí)就不再更新命令方塊,也就是不再 Clone 。當(dāng)實(shí)體J的分?jǐn)?shù)≥1時(shí)就更新命令方塊,也就是繼續(xù) Clone 。

? ? ? ?讓我們重新看到剛剛的那兩個(gè)圖和函數(shù)A:

圖 1


圖 2

? ? ? ?不難發(fā)現(xiàn),在命令“Execute @e[tag=C] ~ ~ ~ Function B”的后面還有一個(gè)命令“Execute @e[tag=D] ~ ~ ~ Kill @s”。

? ? ? ?很顯然,我們得在遞歸完成后執(zhí)行一個(gè)“Execute @e[tag=D] ~ ~ ~ Kill @s”命令。因此,我們需要在遞歸完成后轉(zhuǎn)出遞歸以進(jìn)入非遞歸狀態(tài)。

? ? ? ?那么,我們可以在實(shí)體J分?jǐn)?shù)≤0時(shí)選擇將鏈命令方塊⑦的朝向改變?yōu)橄蛏系某?,然后在這個(gè)方向上放置剩余的命令方塊(如 圖3 所示),然后遞歸就成功轉(zhuǎn)出了。在轉(zhuǎn)出遞歸后,我們先要清理輔助實(shí)體J,然后再執(zhí)行函數(shù)A剩下的指令“Execute @e[tag=D] ~ ~ ~ Kill @s”。

圖3

? ? ? ?需要注意的是,我們絕對不會(huì)執(zhí)行⑦時(shí)才改變朝向,而是在執(zhí)行⑥或之前的命令方塊時(shí)就改變了朝向。而且,由于最終是在⑦處轉(zhuǎn)出的遞歸,那么你必須讓第一行的命令方塊始終保持更新,否則可能會(huì)出現(xiàn)第二行的命令方塊執(zhí)行后就不再執(zhí)行命令的問題。

? ?????一般地,⑦上面的命令方塊不會(huì)參與遞歸,那么從⑦到其上方命令方塊的這一過程,我們可以稱為遞歸的轉(zhuǎn)出。


結(jié)語

? ? ???那么本篇專欄的干貨到此就結(jié)束了。我主要講述了 Function 與 命令方塊 之間的聯(lián)系與轉(zhuǎn)譯函數(shù)的具體操作過程。可以說,使用 Function 的思維可以很有效的解決卡頓問題。

? ? ???有了本篇專欄的知識(shí)傳播,我也相信任何函數(shù)都可以很簡便的被轉(zhuǎn)為純命令方塊形式,供純命令方塊玩家的借鑒、使用和命令的優(yōu)化。

【MCBE·命令】斷鏈的運(yùn)用及遞歸的轉(zhuǎn)入和轉(zhuǎn)出的評(píng)論 (共 條)

分享到微博請遵守國家法律
石棉县| 平谷区| 南丰县| 镇坪县| 白水县| 田阳县| 上林县| 略阳县| 修水县| 东乌珠穆沁旗| 钟祥市| 高邮市| 武乡县| 禄劝| 纳雍县| 寿宁县| 瓦房店市| 利川市| 葫芦岛市| 陇南市| 韶关市| 舞钢市| 长子县| 綦江县| 宝清县| 略阳县| 伊宁县| 卫辉市| 峨边| 河源市| 正定县| 辰溪县| 务川| 麻阳| 赣榆县| 普宁市| 马公市| 温州市| 姚安县| 新竹县| 和田县|