- 条件与变量
- 相对性
- 或||
- 且&&
- 或且结合
- !非 单个变量
- !非 多个执行体
- 条件嵌套相对性
- 条件嵌套与变量
- 子条件detect
§3.4 或|| 与 且&&
下一页为 或 详解
3.4.1 基本概念
在枚举条件的过程中,除了可以使用满足单个条件的条件判断外,
也可以使用满足多个条件的条件判断:
条件1 或者 条件a → 输出1
条件2 而且 条件b → 输出2
条件3 或者 (条件c 而且 条件α) →输出3
┊
条件n 或/且 条件s(条件x) → 输出n
也就是说条件与条件之间也可以做到使用逻辑关联。
其中两个逻辑关联便是 或|| 和 且&&。
3.4.2 或|| 概念
或代表两个条件不需要全部满足,
满足其一便可以输出。
例如:
条件1 或者 条件a → 输出
那么我只满足了条件1会输出;
只满足条件a也会输出;
满足了全部仍然会输出。
3.4.3 且&& 概念
或代表两个条件需要同时存在全部满足,
满足全部才可以输出。
例如:
条件1 而且 条件a → 输出
那么我只满足了条件1是不会输出的;
只满足条件a也是不会输出的;
只有满足了全部才会输出。
3.4.4 或||
下一页为 且 详解
要做到:
或条件1 或者 或条件2 → 输出
可以转化成:
或条件1 → 相同输出
或条件2 → 相同输出
或条件n → 相同输出
而且要使输出只执行一次,可以使用以下两种方式:
- 实体选择器自带(错误示范)
拿变量举例,
@e[score_x_min=10,score_x=1]
而此处表达且的关系,所以并不能
- 转存计分板
例如(按照执行顺序):
或条件1 → 转存变量x
或条件2 → 转存变量x
或条件n → 转存变量x
条件变量x → 输出
清空计分板
比如说
或条件1是:f的a变量值>=2
或条件2是:f的a变量值<=-2
那么可以得到以下的指令:
在所有指令之前模拟fill执行:
- /fill ~1 ~ ~ ~4 ~ ~ redstone_block
- /execute @e[name=f,score_a_min=2] ~ ~ ~
- /scoreboard players set @e[name=f,r=0] b 1
- /execute @e[name=f,score_a=-2] ~ ~ ~ /scoreboard players set @e[name=f,r=0] b 1
- /execute @e[name=f,score_b_min=1,score_b=1] ~ ~ ~ /say 1
- /execute @e[name=f,score_b_min=1,score_b=1] ~ ~ ~ /scoreboard players reset @e[name=f] b
效果:
可以看到:
f的a为3、-3、-15、111 由于都在>=2或者<=-2的范围内,所以均有输出;
然而f的a为1、0、-1 则不在范围内,没有输出。
分析指令:
首先如果f的a符合 或条件1,
则将f的b设成1;
如果f的a符合 或条件2,
则也将f的b设成1;
那么只要符合 或条件1 和 或条件2 其中之一的
f的b都是1;
只要判断f的b为1,则输出,且将b清空以便于下一次输入。
标准格式:
- 按照上面的方法,再制作一个或的例子(熟练掌握转存);
- 教程部分使用的是条件变量,没有介绍相对性;按照上面的方法,制作一个相对性的例子(了解或与相对性的兼容性)。
3.4.5 且&&
下一页为 或且结合
要做到:
且条件1 而且 且条件2 → 输出
可以分为:
且条件1 + 且条件2 + …… + 且条件n = 输出
做到这一点,可以有两种方式:
- 实体选择器自带
拿变量举例,
@e[score_x_min=1,score_x=10]
就是x的值>=1且<=10
那么
@e[score_x_min=1,score_x=1]
就代表>=1且<=1,也就是1
这是一个十分简单的过程,完全是实体选择器自带的分项
其他的分项也有类似且关系。
2.并列关系,多个分项的且
@e[score_x_min=1,score_x=10,r=1]
他同时满足三个变量,
所以三个选择器分项需要同时并列,
也就是x>=1,x<=10,r=1三个且条件全部满足才能判断。
- 转存计分板
使用与条件不同的计分板,和或差不多。
例如(按照执行顺序):
且条件1 → 变量x++
且条件2 → 变量x++
且条件n → 变量x++
条件变量nx → 输出
清空计分板
与或不同的是这不是一个恒等的过程,
而是一个连加的过程。
达到全部满足后才有判断输出。
比如说
且条件1是:玩家脚下的方块是白色羊毛
且条件2是:f的a变量值>=-2
那么可以得到以下的指令:
在所有指令之前模拟fill执行:
- /fill ~1 ~ ~ ~4 ~ ~ redstone_block
接着按照顺序执行以下指令;
- /execute @e[name=f,score_a_min=2] ~ ~ ~ /scoreboard players add @e[name=f,r=0] b 1
- /execute @p ~ ~ ~ detect ~ ~-1 ~ minecraft:wool 0 /scoreboard players add @e[name=f,c=1] b 1
- /execute @e[name=f,score_b_min=2,score_b=2] ~ ~ ~ /say 1
- /scoreboard players reset @e[name=f] b
效果:
可以看到:
只要f的a为1 由于不在>=2的范围内,所以没有输出;
我在空中,由于不在羊毛上没有输出。
只有我在羊毛上,f的a>=2,才有输出。
分析指令:
首先如果f的a符合 且条件1,
则将f的b自身加1;
如果f的a符合 且条件2,
则将f的b自身再加1;
那么只有符合 且条件1 和 且条件2 全部的
也就是说f的b是2;
只有判断f的b为2,才输出,且将b清空以便于下一次输入。
标准格式:
- execute条件嵌套
3.4.6 或且结合
前面我们学习了 或与且 的单个逻辑关系,
在本篇我们需要学习 或与且 的综合逻辑关系。
或与且的综合关系比如:
(a 或 b) 且 c
(a 且 b) 或 c
(a 且 b) 或 (a 且 c)
(a 或 b) 且 (a 或 c)
……
都属于组合逻辑关系,
这个可以利用逻辑电路进行表达,
而今天我们要使用 或与且 的条件操作进行表达。
- 算法标准表达
依旧和前面讲到的算法一样:
遇到或——计分板set;
遇到且——计分板add(或remove)。
只不过综合关系中如果有n(n>1)组括号就必须创建n个转存计分板;并且将括号划分级别*(最先执行的为一级)。
最后再判断转存计分板的关联。
(当然除了创建多计分板外,也可以使用多实体储存多变量)
比如上面举到的例子(x,y,z表示变量,a,b,c表示条件)
(按顺序执行)
1.
a → x=1
b → x=1
c → x+1
清空x
最后只需要判断x是否等于2;
2.
a → x+1
b → x+1
c → x=2
清空x
最后只需要判断x是否等于2;
3.
a → x+1
b → x+1
a → y+1
c → y+1
x=2 → x=-1 //判断转存计分板的或关联(由于x,y计分板值被判断的并非范围,所以可以直接改变自身的值表示true)
y=2 → x=-1
清空x,y
最后只需判断x是否等于-1;
4.
a → x=1
b → x=1
a → y=1
c → y=1
x=1 → x=-1 //判断转存计分板的且关联(由于x,y计分板值被判断的并非范围,所以可以直接改变自身的值表示true)
y=1 → x-1 //由于顺序,必然先x=-1。若无执行x=-1,x-1,x的值则会为1;若无执行x=-1,执行x-1,x的值则为0;只有都执行了才为-2
清空x,y
最后只需要判断x是否等于-2;
- 指令标准格式
条件a就是检测Cow;
条件b就是检测Sheep;
条件c就是检测Chicken;
(未用到条件变量)
那么有9个条件满足
a;
aa;ac;ab;bc;
abc;aac;aab;
abac;
此时我们不需要枚举9个条件;
使用以下指令
在所有指令之前模拟fill执行:
- /fill ~1 ~ ~ ~9 ~ ~ redstone_block
接着按照顺序执行以下指令;
*逻辑检测
- /execute @e[type=Cow] ~ ~ ~ /scoreboard players set @e[name=f,c=1] a 1
- /execute @e[type=Sheep] ~ ~ ~ /scoreboard players set @e[name=f,c=1] a 1
- /execute @e[type=Cow] ~ ~ ~ /scoreboard players set @e[name=f,c=1] b 1
- /execute @e[name=f,score_a=-2] ~ ~ ~ /say 1
- /scoreboard players reset @e[name=f] a
- /scoreboard players reset @e[name=f] b
效果:
上面列举的九种情况都有输出;
如果b或c单独出现没有输出。
分析指令:
a → x set 1
b → x set 1
a → y set 1
c → y set 1
x==1 → x set -1 //判断转存计分板的且关联(由于x,y计分板值被判断的并非范围,所以可以直接改变自身的值表示true)
y==1 → x remove 1 //由于顺序,必然先x=-1。若无执行x=-1,x-1,x的值则会为1;若无执行x=-1,执行x-1,x的值则为0;只有都执行了才为-2
清空x,y
(完全是按照之前的算法来的)
标准格式:('{}'标示层次关系,无实际意义)
- 按照上面的方法,再制作一个或的例子(熟练掌握);
- 使用其他的条件制作或且结合。
[groupid=546]Command Block Logic[/groupid]