(萌新专向)我的世界BE版本命令二分法的详细解析(二分法是什么)
(PS:本专栏不面相编程……我Java才刚开始学QwQ)
关于二分法,想必大家都不陌生,就是逐渐分割的算法。
这里可能有些小伙伴不理解,我在这里解释一下。 假设你现在正在一个平面坐标系上,你为原点,纵轴是y,横轴为x。 我们分别给纵轴,横轴标一个计分板。
/scoreboard objectives add x dummy "x轴"
/scoreboard objectives add y dummy "y轴"
现在,你正在用定点传送,标记了一个位置,在
x:666 y:233
/scoreboard players set @s x 666
/scoreboard players set @s y 233
那么,这时候该怎么办呢?如何完成指令的定点传送? 这个时候肯定会有聪明的小伙伴讲:啊,那我用穷举不好了?,x轴每tp1格加1分,一直tp到666分数,而y轴也是一样。 如果指令运行按照mc
每游戏刻
(game tick,简称gt)
=0.05s
的情况下(忽略卡顿以及其他可能有的误差),也就是
1s=20gt
,
到666格也就是666/20=33.3
秒!都够我跑200米短跑了! 而且万一遇见1000格,10000格的情况下,一秒20格的速度终究是太感人了。
(都够我泡泡面了)
扯了这么多,终于到我们的正题了。 二分法是什么?又是如何解决我们上面问题的呢? 其实很简单,我这里举了一个例子。 我要to到666格的地方,于是我先开始检测
/execute @a[scores={x=1024..}] ~ ~ ~ tp @s ~1024 ~ ~
(指令大意:传送玩家,如果计分板“x”分数大于等于1024,那么就将玩家向x轴传送1024格)
如果未执行成功,则跳过该条命令,执行下一条。
/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。 你发现什么规律没有?
512=1024/2
256=512/2
…… 没错,下一个数都是上一个数的
(n^2)/2
现在知道为什么是二分法了吧( ͡° ͜ʖ ͡°)✧ 这时候就会有人问了:啊?你能保证能算出我想要的数吗? 放心,这就是道规律题:
n^2+(n-1)^2+(n-2)^2+……+1
这是可以到其化简:
(2n)^2-1
以内的任何数的。 举个例
子
666=512+128+16+8+2
看看,没骗你吧。 那么单数怎么办? 像是y轴是233 这个很简单,在后面加个1
/execute @a[scores={y=1}] ~ ~ ~ tp @s ~ ~1 ~
那么问题又来了,负数怎么办呢?像是x=-111 y=-16 我这里有两种解决方案,第一种是检测小于0,直接跳过前面的步骤,变为:
/execute @a[scores={x=-64..}] ~ ~ ~ tp @s ~-64 ~ ~
至于如何检测小于0,我推荐用scoreboard players operation 让数据与一个x值与y值为0的工具面板比较,若是>=0,则执行上面步骤,若<=0,则tp负数。 另外一种就是减法到0的算法,也是检测大于小于0 不过略有差别。 至于该怎么写……那就是你们的……作业了!
(绝对不是因为我自己懒!)
新人up,有错指出~求关注和点赞~ 点赞破十光速更新下一期。