穷举

穷举(Enumerating)是一个命令中常见的做法。
就是把一切可能性列出。

比如说我们要把一个掉落物的数量(Count)写进其count分数里,我们可以怎么做呢?
由于没有一个方法可以检测掉落物的数量,也没法直接把NBT换为分数,我们只能穷举。

scoreboard players set @e[type=item] count 1 {Item:{Count:1b}}
scoreboard players set @e[type=item] count 2 {Item:{Count:2b}}
# ...
scoreboard players set @e[type=item] count 64 {Item:{Count:64b}}

其实大部分命令都是穷举的,只是我们一般不把那些视为穷举而已,我们只是把这种特别多而且看上去特别蠢的列举说是穷举。

二分法

二分法是穷举的一个特殊情况,就是比较聪明的穷举。
我们没法直接获得某个数值,然而我们可以改变(不是直接设置)这个数值并且知道该数值所在的范围,这种情况就可以用二分法了。

使用二分法能把穷举量大幅减少,方法就是每次把数值范围减半进行处理,直到范围已经足够精确。
比如要知道一个随机数的数值,我们只知道它是否等于/大于/小于某个数,那么我们就可以用二分法,先猜50,如果大于的话范围就变为51-100,小于就变为0-49,如此类推。

NBT我们没法用二分法,因为我们没法改变数值。然而我们可以用二分法获取坐标。

获取marker的x坐标。例子:(为了方便,例子里只容许x坐标为0-8,假设y及z坐标为1)

scoreboard players set @e[name=marker] x 0

# 检查是否x >= 4,是的话就x分数+4然后tp x - 4
scoreboard players add @e[name=marker,x=4,y=1,z=1,dx=4] x 4
tp @e[name=marker,x=4,y=1,z=1,dx=4] ~-4 ~ ~

# 检查是否x >= 2,是的话就x分数+2然后tp x - 2
scoreboard players add @e[name=marker,x=2,y=1,z=1,dx=2] x 2
tp @e[name=marker,x=2,y=1,z=1,dx=2] ~-2 ~ ~

# 检查是否x >= 1,是的话就x分数+2然后tp x - 1
scoreboard players add @e[name=marker,x=1,y=1,z=1,dx=1] x 1
tp @e[name=marker,x=1,y=1,z=1,dx=1] ~-1 ~ ~

# 最后的分数就是该marker的x坐标了,因为范围已经足够精确了。

通过代码进行穷举

穷举这活真不是人干的,而且大部分穷举都是有其规律的,我们有时候会使用一些非常简单的代码来进行穷举。

我们这里使用的是JavaScript,这是一种脚本语言,使用还是蛮方便的。读者可以按F12然后找控制台(或者是Console)执行代码。

有兴趣朋友可以去看看相关教程,因为我也不太会,教不了。


我们一般都是先找出命令的模板(用template string),然后看看哪些地方是一个不停改变的数值,找出那数值改变的规律然后计算、放进那模板里。

比如这是上方那对应NBT的代码

//一般也是用for,把一堆选项扔进去

var commands = [];

//生成命令
for (var i = 1; i <= 64; i++)
    commands.push(`scoreboard players set @e[type=item] count ${i} \{Item:\{Count:${i}b\}\}`);
//显示命令
console.log(commands.join('\n'));

比如这是上方那二分法的代码

//二分一般都是用2的n次方,从大到小
var commands = [];
for (var i = 2; i >= 0; i--) {
    commands.push(`scoreboard players add @e[name=marker,x=${Math.pow(2,i)},y=1,z=1,dx=${Math.pow(2,i)}] x ${Math.pow(2,i)}`);
    commands.push(`tp @e[name=marker,x=${Math.pow(2,i)},y=1,z=1,dx=${Math.pow(2,i)}] ~-${Math.pow(2,i)} ~ ~`);
}
console.log(commands.join('\n'));

results matching ""

    No results matching ""