目录

新人手册

1 记分板分数运算

1.1 比较分数大小

比较分数大小其实十分简单, 其核心逻辑就是:
c=a-b
if a > b: c > 0
if a < b: c < 0
if a == b: c == 0

因此用/scoreboard players operation就可以了(需要注意的是, 如果那分数不希望被改变, 则需要把一个分数赋值到另外一个分数, 然后在那边处理)

1.2 记分板取最高、最低分数
1.12后可用@s代替@e[c=1]

1.2.1 取最高分数

分数储存在marker的scb里

命令:

scoreboard players set marker scb -2147483648
execute 所有要比较分数的实体 ~ ~ ~ scoreboard players operation marker scb > @e[c=1] scb

1.2.2 取最低分数

分数储存在marker的scb里

命令:

scoreboard players set marker scb 2147483647
execute 所有要比较分数的实体 ~ ~ ~ scoreboard players operation marker scb < @e[c=1] scb

1.2.3 原理解释

execute部分,是用来确保每个分数都会获得比较
而operation部分,就是当前最高/低分数实体分数比较,如果实体分数更高/低,替换掉当前marker的分数

至于那初始分数, 求最大的时候就设置为记分板下限, 求最小的时候就设置为记分板上限,是为了保证会替换为第一个实体的分数。不替换的可能性只有一个: 等于当前marker的分数。

伪代码

max_score = -2147483648
for score in scores:
    if score > max_score:
        max_score = score

1.3 随机分数

以下的方法一般生成比较小的分数, 如果需要比较大的分数则可以运行多次, 获得几个随机分数然后进行移位运算(比如a, b都小于10, 这可以a*10+b这样得出小于100的随机数)。

1.3.1 /spreadplayers命令

基本上就是在一个n*n的平面里(方块, 上方不可以有方块遮挡)放置压力板和命令方块, 然后用spreadplayers命令把一个实体随机放在n*n的平面里的某个位置, 接触到压力板然后就让命令方块执行命令(scoreboard players set)

这方法较少使用, 因为比较麻烦

1.3.2 @r

生成n个Marker(type=area_effect_cloud,tag=rnd), 有不同分数(可以设置多个同一个分数的来调整选中的几率), 选择其中一个的分数。

scoreboard players operation @e[name=储存分数的marker] scb = @r[type=marker的类型,tag=rnd] scb