逻辑运算---And, or, not

什么是逻辑运算呢?就是对布尔值(boolean,有两个值true/false)进行运算
常用的就是要多个条件同时符合(and),或者是任何一个条件符合(or),或是不能符合某个条件(not)

真值表

以下表格可以拓展至n个不同输入/输出

输入 and or
True, True True True
True, False False True
False, True False True
False, False False False
输入 not
True False
False True

MC实现And

记分板+选择器

选择器的规则就是选择到的实体必须是符合所有条件
由于记分板的选择器参数是score_XXX或者是score_XXX_min,因此可以同时有多个参数
因此,你可以用多个参数来指定同时拥有多个分数的实体
举个例子,@e[score_a=5,score_a_min=5,score_b=6,score_b_min=6],就是选择所有记分板a=5、b=6的实体

需要注意的是,除了记分板以外的参数都不能重复出现(score_ascore_b实为不同参数,因此可“重复”),详见选择器教程

execute命令

如果是同时需要多个tag,我们可以通过execute+@s来选择。
如我们需要同时有a, b, c tag,我们可以:

execute @e[tag=a] ~ ~ ~ execute @s[tag=b] ~ ~ ~ execute @s[tag=c] ~ ~ ~ 命令

也可以做到多反选

Stats

通过检测SuccessCount,我们可以得知之前的命令有没有成功,然后执行别的命令。这样在命令函数里也能做到条件制约。
如果命令a之后的命令需要SuccessCount大于等于1才能继续执行(通过execute命令),那就代表了如果前面任何一个命令出现错误,后面的命令就没法执行,这也是and的一种。

例子(命令函数,假设由实体执行并且有一个变量叫scb):

scoreboard players set @s scb 0
stats entity @s set SuccessCount @s scb

# 检测命令
testfor @s[score_test=3]
# 如果不成功的话下面这条命令也不会执行
execute @s[score_scb_min=1] ~ ~ ~ testfor @s[score_test_min=3]

# 如果上面任意一条命令失败了的话这条命令也不会执行
# 如果是第一条检测失败了,那么scb还是0,执行不了
# 如果是第二条检测失败了,那么scb就会变为0,执行不了
execute @s[score_scb_min=1] ~ ~ ~ say test = 3

MC实现Or

多条命令

这...简单到我都不知道有啥可以说明的了。
不过注意,要小心重复执行命令,多条命令的条件尽量不要重复。

记分板tag

方法很简单,分别检测不同情况是否符合,符合就给实体一个分数/标签。然后针对那个分数/标签的实体执行命令

例子:

scoreboard players set @a[tag=a] tagScb 1
scoreboard players set @a[tag=b] tagScb 1
execute @a[score_tagScb_min=1,score_tagScb=1] ~ ~ ~ say 我有a/b标签

这方法看起来需要的命令多一点,然而有两个好处:

  • 不会重复执行命令。就算条件重复了,被选择到的实体还是那个
  • 重复使用该条件时这方式能节省命令数量。

MC实现Not

not就是当条件不满足的时候才执行命令(为了方便,下面会用!代表not)
举个例子,分数a!=5的时候say hi,就是分数不等于5的时候才say hi

记分板分数

首先给所有实体一个初始分数,然后给符合条件的实体另一个分数
还维持着原来分数的实体就自然是不符合那些条件的实体了

scoreboard players set @e notSlime 1
scoreboard players set @e[type=Slime] notSlime 0
scoreboard players set @e[type=LavaSlime] notSlime 0
execute @e[score_notSlime_min=1] ~ ~ ~ say i am not slime

注意: 记分板的好处在于能够在大量逻辑的时候进行简化, 而且如果不止是not一种的话, 记分板就能做到特殊优化

tag

原理就是这样,给符合要求的实体一个tag,然后用=!tag选择没那个tag的实体

scoreboard players tag @e[type=Slime] add Slime
scoreboard players tag @e[type=LavaSlime] add Slime
execute @e[tag=!Slime] ~ ~ ~ say i am not slime

注意: tag的话则不能做到and。如果需要复杂逻辑的话建议使用记分板分数,因为那比较方便优化

Stats

和And的部分类似,我们检测SuccessCount=0就好,所以这里就不多加以描述了。

然而注意多个条件,比如

# 绑定stats的就不写了

testfor @s[score_test=0]
execute @s[score_stats=0] ~ ~ ~ testfor @s[score_test_min=10]
execute @s[score_stats=0] ~ ~ ~ say 1-9

这是错的。
因为如果满足了第一条命令,第二条命令自然就会失败,而stats就会变为0,满足了第三条命令。
上面的命令其实是 not ((not a) and b),也就是a or (not b)

命令函数

命令函数能够很方便的做到if 和 unless(else)。
故此复杂的条件可以拆成if else部分放进不同命令函数进行调用。

results matching ""

    No results matching ""