创作交流

记分板的运算 #3

惯宣***Lv.3 中级会员 发表于 2024-7-21 IP:广东省 3,151 0
AI 速览2026-09-26 22:44 生成

系统讲解 Minecraft 记分板命令的运算技巧与实战用法

这篇帖子是记分板运算系列的第三篇,从 objectives 与 players 两类基础操作讲起,介绍了计分项创建、分数设置、虚设目标、随机赋分、检测与显示等命令用法。随后重点展开 operation 运算,涵盖赋值、求和、求差、求积、求商、求余、取大小和交换等符号,并给出清除玩家下线、跨行、排序、缺号、求余、进位、循环交换、二分检测等实战案例。适合已经接触过命令方块、想深入掌握记分板运算的玩家阅读。

  • 基岩版创建计分项时准则只能选择 dummy
  • 记分板只能记录整数,小数运算通常需放大百倍处理
  • 虚设目标无法用 @a 选择,需借助 execute 条件代为检测
  • operation 对多实体执行时按最近实体先行选择,结果可能不一致
本卡片由 AI 阅读本帖后生成,可能存在疏漏,请以帖子正文为准。
【记分板的运算 #3】
基础内容

scoreboard(记分板)是用于计数的命令,可以较为方便的记录玩家数据。


记分板分为:对"objectives(计分项)"操作和对"players(玩家/目标)"操作两大类。
  1. scoreboard objectives add <名称> dummy [显示名]
  2. scoreboard objectives remove <名称>
复制代码

add是增加、remove是移除。基岩版只能选择"dummy"作为准则。
计分项的的[显示名]可以是空间命名id,会显示对应语言在lang里的文本(item.apple.name=苹果)。


创建"计分项"之后要为"玩家"写入记分:
  1. scoreboard players add <目标> <计分项> <数量>
  2. scoreboard players remove <目标> <计分项> <数量>
  3. scoreboard players set <目标> <计分项> <数量>
  4. scoreboard players reset <目标> [计分项]
复制代码

set即设置<目标>的分数。reset则是重置<目标>的分数,如果[计分项]为空则重置该目标的全部分数。
<目标>不需要指定实体,可以是任意名字,即"虚设目标(伪造玩家名)"。但是在之后不能使用"@a[scores={<计分项>=<数量>]"选择该目标,因为实体不存在。
  1. execute if score <目标> <计分项> matches <数量>
复制代码

虚设目标需要充作execute的条件来代为检测。
同理,"@a[scores={<计分项>=<数量>]"不可以选择没有分数的实体,也需要充作execute的条件来代为检测:
  1. execute unless score <目标> <计分项> matches <数量>
复制代码

代替方法还有:
  1. scoreboard players add <目标> <计分项> 0
复制代码

即为所有目标添加0。没有分数时增加分数默认从零开始增加,所以会将全部没有分数的玩家写为0。
在<目标>填入"*"表示选择全部实体以及全部计分项中有分数的目标。包括"玩家下线"。


  1. scoreboard players random <目标> <计分项> <最小值> <最大值>
  2. scoreboard players test <目标> <计分项> <最小值> <最大值>
复制代码

random随机赋分,test则是检测分数是否在指定范围内。
test的<最小值>和<最大值>可以填入"*"表示记分板可记录的最小值或最大值。


使用list可以查阅已记录的列表:
  1. scoreboard objectives list
  2. scoreboard players list [目标]
复制代码

scoreboard players list中写入[目标]则显示该目标的全部分数。


使用setdisplay可以将记分板显示出来:
  1. scoreboard objectives setdisplay <belowname/list/sidebar> [计分项] [排序]
复制代码

如果[计分项]为空,则清除对应位置。[排序]填入"ascending(顺序)"或"descending(倒序)",默认按倒序。
显示位置
belowname 名牌下方
list 玩家列表
sidebar 侧边

以"#"开头的虚设目标不会被显示。


operation

  1. scoreboard players operation <目标> <目标计分项> <运算> <选择器> <计分项>
复制代码

以<选择器>在<计分项>的分数对<目标>在<目标计分项>的分数进行运算。包括负数运算。
<运算>使用以下运算符号表示:
= 赋值:使目标分数等于选择器分数。
+= 求和:目标分数加上选择器分数。
-= 求差:目标分数减去选择器分数。
*= 求积:目标分数乘以选择器分数。
/= 求商:目标分数除以选择器分数,输出结果的整数部分。
%= 求余:目标分数除以选择器分数,输出结果的余数。
< 取较小值:在目标和选择器的分数中,输出较小的分数。
> 取较大值:在目标和选择器的分数中,输出较大的分数。
>< 交换目标与选择器的分数。

所有的运算都是对<目标>的分数进行运算,除"><"以外的运算都不改变<选择器>的分数。


【清除"玩家下线"】
  1. scoreboard players reset * scb_r
  2. scoreboard players operation @a scb_r = @a scb
  3. scoreboard players reset * scb
  4. scoreboard players operation @a scb = @a scb_r
复制代码

将所有玩家的分数保存到另一计分项,然后重置计分项,再从备份中读取记录。有时会遇到reset清除不了的情况,这时候建议直接移除计分项。


【跨行】

⑦⑧⑨
④⑤⑥
①②③
   ⓪
7-4 = 4-1 = 3
如果要上下移动则直接加减3。


【减法选择(已过时)】
  1. scoreboard players operation @a scb -= #不定值 scb
  2. .. @a[scores={scb=0}] ..
复制代码

选择分数等于"#不定值"的玩家。因为无法获知"#不定值"的准确数值,则使所有玩家减去"#不定值"。如果为0则该玩家的分数与"#不定值"一致。
  1. execute as @a at @s if score @s scb = #不定值 scb
复制代码

使用execute可以代替。


【排序】
  1. scoreboard players set @a scb -1
  2. scoreboard players operation @a scb -= @a[scores={scb=..-1}] scb
复制代码

-1减-1(n-1),即(-1)+(n-1)。(-1)-(-1) = 0,负负得正。
而排序是因为先执行的玩家,减去其他玩家的分数后,自己的分数就不再是"scb=-1"了,不符合后执行玩家的条件。直到最后的玩家只能减去自己的分数,变为0,则完成了排序。


【缺号】
  1. scoreboard players operation 总分_r scb = 总分 scb
  2. scoreboard players reset 总分
  3. scoreboard players operation 总分 scb += @a scb
  4. scoreboard players operation 总分_r scb -= 总分 scb
  5. execute as @a at @s if score 总分_r scb matches 1.. if score @s scb > 总分_r scb run scoreboard players remove @s scb 1
复制代码

排序之后遇到"玩家下线",需要序号靠后的玩家补上。但是不能获知"玩家下线"的序号,可以比较下线前玩家序号的总分和下线后玩家序号的总分之间的差值,快速算出"玩家下线"的序号。


【求余】
  1. scoreboard players operation @a scb %= #4 scb
复制代码

排序之后,求除以特定数值的余数。适合用于分队。


【进位】
  1. scoreboard players operation 记数 scb *= #10 scb
复制代码

十进制乘10进一。
记分板只能记录整数,所以像百分比这样原本属于小数的运算,通常会放大百倍运算。


【循环交换】
  1. scoreboard players operation @e[c=1] scb >< @e scb
复制代码

使最近的实体由近到远交换所有实体的分数。结果上,会将所有实体的分数向外推一位。
① 12345
② 51234
③ 45123
④ 34512



【二分】

在数值存储(计数)中2,4,8,16,32,64,128,256,512..即2的乘方被认为是最简练的记数法。
使一只盔甲架向特定方向移动,并给予距离自己特定范围内的玩家加分,这就是二分法检测坐标。


【关键问题】

operation的关键问题在于单实体对单实体和单实体对多实体的差异上。
而目标选择器选择多实体时,会先行选择最近的实体。因而会造成"单一命令内,由于执行顺序导致的条件变化,使得命令在多目标身上执行呈现出不同结果"的情况。
但是,只要有一个目标执行成功,命令的执行结果就会反馈为成功。这使得有条件的命令方块出现局限性,需要更多命令才能弥补这方面的不足。
您需要登录后才可以回帖 登录 | 立即注册
本版积分规则