(萌新專向)我的世界BE版本命令二分法的詳細(xì)解析(二分法是什么)
(PS:本專欄不面相編程……我Java才剛開始學(xué)QwQ)
關(guān)于二分法,想必大家都不陌生,就是逐漸分割的算法。
這里可能有些小伙伴不理解,我在這里解釋一下。 假設(shè)你現(xiàn)在正在一個(gè)平面坐標(biāo)系上,你為原點(diǎn),縱軸是y,橫軸為x。 我們分別給縱軸,橫軸標(biāo)一個(gè)計(jì)分板。
/scoreboard objectives add x dummy "x軸"
/scoreboard objectives add y dummy "y軸"
現(xiàn)在,你正在用定點(diǎn)傳送,標(biāo)記了一個(gè)位置,在
x:666 y:233
/scoreboard players set @s x 666
/scoreboard players set @s y 233
那么,這時(shí)候該怎么辦呢?如何完成指令的定點(diǎn)傳送? 這個(gè)時(shí)候肯定會(huì)有聰明的小伙伴講:啊,那我用窮舉不好了?,x軸每tp1格加1分,一直tp到666分?jǐn)?shù),而y軸也是一樣。 如果指令運(yùn)行按照mc
每游戲刻
(game tick,簡(jiǎn)稱gt)
=0.05s
的情況下(忽略卡頓以及其他可能有的誤差),也就是
1s=20gt
,
到666格也就是666/20=33.3
秒!都?jí)蛭遗?00米短跑了! 而且萬一遇見1000格,10000格的情況下,一秒20格的速度終究是太感人了。
(都?jí)蛭遗菖菝媪?
扯了這么多,終于到我們的正題了。 二分法是什么?又是如何解決我們上面問題的呢? 其實(shí)很簡(jiǎn)單,我這里舉了一個(gè)例子。 我要to到666格的地方,于是我先開始檢測(cè)
/execute @a[scores={x=1024..}] ~ ~ ~ tp @s ~1024 ~ ~
(指令大意:傳送玩家,如果計(jì)分板“x”分?jǐn)?shù)大于等于1024,那么就將玩家向x軸傳送1024格)
如果未執(zhí)行成功,則跳過該條命令,執(zhí)行下一條。
/execute @a[scores={x=512..}] ~ ~ ~ tp @s ~512 ~ ~
(解釋同上,不過1024改為512)
/execute @a[scores={x=256..}] ~ ~ ~ tp @s ~256 ~ ~
(基本同上……)
/execute @a[scores={x=128..}] ~ ~ ~ tp @s ~128 ~ ~
(……) 就這樣,一直除到1。 你發(fā)現(xiàn)什么規(guī)律沒有?
512=1024/2
256=512/2
…… 沒錯(cuò),下一個(gè)數(shù)都是上一個(gè)數(shù)的
(n^2)/2
現(xiàn)在知道為什么是二分法了吧( ?° ?? ?°)? 這時(shí)候就會(huì)有人問了:?。磕隳鼙WC能算出我想要的數(shù)嗎? 放心,這就是道規(guī)律題:
n^2+(n-1)^2+(n-2)^2+……+1
這是可以到其化簡(jiǎn):
(2n)^2-1
以內(nèi)的任何數(shù)的。 舉個(gè)例
子
666=512+128+16+8+2
看看,沒騙你吧。 那么單數(shù)怎么辦? 像是y軸是233 這個(gè)很簡(jiǎn)單,在后面加個(gè)1
/execute @a[scores={y=1}] ~ ~ ~ tp @s ~ ~1 ~
那么問題又來了,負(fù)數(shù)怎么辦呢?像是x=-111 y=-16 我這里有兩種解決方案,第一種是檢測(cè)小于0,直接跳過前面的步驟,變?yōu)椋?
/execute @a[scores={x=-64..}] ~ ~ ~ tp @s ~-64 ~ ~
至于如何檢測(cè)小于0,我推薦用scoreboard players operation 讓數(shù)據(jù)與一個(gè)x值與y值為0的工具面板比較,若是>=0,則執(zhí)行上面步驟,若<=0,則tp負(fù)數(shù)。 另外一種就是減法到0的算法,也是檢測(cè)大于小于0 不過略有差別。 至于該怎么寫……那就是你們的……作業(yè)了!
(絕對(duì)不是因?yàn)槲易约簯校?
新人up,有錯(cuò)指出~求關(guān)注和點(diǎn)贊~ 點(diǎn)贊破十光速更新下一期。