欢迎光临散文网 会员登陆 & 注册

(萌新专向)我的世界BE版本命令二分法的详细解析(二分法是什么)

2023-07-22 01:55 作者:卄grass卄  | 我要投稿

(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,有错指出~求关注和点赞~ 点赞破十光速更新下一期。

(萌新专向)我的世界BE版本命令二分法的详细解析(二分法是什么)的评论 (共 条)

分享到微博请遵守国家法律