记分板分数运算
比较分数大小
比较分数大小其实十分简单, 其核心逻辑就是:
c=a-b
if a > b: c > 0
if a < b: c < 0
if a == b: c == 0
因此用/scoreboard players operation就可以了(需要注意的是, 如果那分数不希望被改变, 则需要把一个分数赋值到另外一个分数, 然后在那边处理)
记分板取最高、最低分数
取最高分数
分数储存在marker的scb里
命令:
scoreboard players set marker scb -2147483648
execute 所有要比较分数的实体 ~ ~ ~ scoreboard players operation marker scb > @e[c=1] scb
取最低分数
分数储存在marker的scb里
命令:
scoreboard players set marker scb 2147483647
execute 所有要比较分数的实体 ~ ~ ~ scoreboard players operation marker scb < @e[c=1] scb
原理解释
execute部分,是用来确保每个分数都会获得比较
而operation部分,就是当前最高/低分数和实体分数比较,如果实体分数更高/低,替换掉当前marker的分数
至于那初始分数, 求最大的时候就设置为记分板下限, 求最小的时候就设置为记分板上限,是为了保证会替换为第一个实体的分数。不替换的可能性只有一个: 等于当前marker的分数。
伪代码
max_score = -2147483648
for score in scores:
if score > max_score:
max_score = score
随机分数
以下的方法一般生成比较小的分数, 如果需要比较大的分数则可以运行多次, 获得几个随机分数然后进行移位运算(比如a, b都小于10, 这可以a*10+b这样得出小于100的随机数)。
/spreadplayers命令
基本上就是在一个n*n的平面里(方块, 上方不可以有方块遮挡)放置压力板和命令方块, 然后用spreadplayers命令把一个实体随机放在n*n的平面里的某个位置, 接触到压力板然后就让命令方块执行命令(scoreboard players set)
这方法较少使用, 因为比较麻烦
@r
生成n个Marker(type=area_effect_cloud,tag=rnd), 有不同分数(可以设置多个同一个分数的来调整选中的几率), 选择其中一个的分数。
scoreboard players operation @e[name=储存分数的marker] scb = @r[type=marker的类型,tag=rnd] scb