本帖最后由 贰逼 于 2015-7-9 13:46 编辑

条件语句
下一页为 或 与 且 概念
条件语句是模块中的一个重要指令
它用于判断事件是否成立
若成立则输出;
若不成立则跳过。


条件语句将会涉及到
execute
  • 条件与变量
  • 相对性

testfor

关于枚举多个条件输出

或|| 与 且&&
  • 或||
  • 且&&
  • 或且结合

!非的表达
  • !非 单个变量
  • !非 多个执行体

条件嵌套
  • 条件嵌套相对性
  • 条件嵌套与变量
  • 子条件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 → 相同输出

而且要使输出只执行一次,可以使用以下两种方式:
  • 实体选择器自带(错误示范)
   1.这是一个max和min的或(相反范围)
拿变量举例,
@e[score_x_min=10,score_x=1]
而此处表达且的关系,所以并不能
  • 转存计分板
使用与条件不同的计分板进行转存变量

例如(按照执行顺序):
或条件1 → 转存变量x
或条件2 → 转存变量x
或条件n → 转存变量x
条件变量x → 输出
清空计分板


比如说
或条件1是:f的a变量值>=2
或条件2是:f的a变量值<=-2

那么可以得到以下的指令:



在所有指令之前模拟fill执行:
  1. /fill ~1 ~ ~ ~4 ~ ~ redstone_block
复制代码
接着按照顺序执行以下指令;
  1. /execute @e[name=f,score_a_min=2] ~ ~ ~
  2. /scoreboard players set @e[name=f,r=0] b 1
  3. /execute @e[name=f,score_a=-2] ~ ~ ~ /scoreboard players set @e[name=f,r=0] b 1
  4. /execute @e[name=f,score_b_min=1,score_b=1] ~ ~ ~ /say 1
  5. /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 = 输出

做到这一点,可以有两种方式:
  • 实体选择器自带
   1.这是一个min和max的且(相对范围)
拿变量举例,
@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执行:
  1. /fill ~1 ~ ~ ~4 ~ ~ redstone_block
复制代码

接着按照顺序执行以下指令;

  1. /execute @e[name=f,score_a_min=2] ~ ~ ~ /scoreboard players add @e[name=f,r=0] b 1
  2. /execute @p ~ ~ ~ detect ~ ~-1 ~ minecraft:wool 0 /scoreboard players add @e[name=f,c=1] b 1
  3. /execute @e[name=f,score_b_min=2,score_b=2] ~ ~ ~ /say 1
  4. /scoreboard players reset @e[name=f] b
复制代码
(detect以后会讲到)

效果:









可以看到:
只要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;

  • 指令标准格式
和算法差不多,将4中的算法表达成指令:(此处变量x为实体f的计分板a的变量;变量y为实体f的计分板b的变量
条件a就是检测Cow;
条件b就是检测Sheep;
条件c就是检测Chicken;
未用到条件变量

那么有9个条件满足
a;
aa;ac;ab;bc;
abc;aac;aab;
abac;

此时我们不需要枚举9个条件
使用以下指令



在所有指令之前模拟fill执行:
  1. /fill ~1 ~ ~ ~9 ~ ~ redstone_block
复制代码

接着按照顺序执行以下指令;
*逻辑检测

  1. /execute @e[type=Cow] ~ ~ ~ /scoreboard players set @e[name=f,c=1] a 1
  2. /execute @e[type=Sheep] ~ ~ ~ /scoreboard players set @e[name=f,c=1] a 1
  3. /execute @e[type=Cow] ~ ~ ~ /scoreboard players set @e[name=f,c=1] b 1
复制代码
*条件输出
  1. /execute @e[name=f,score_a=-2] ~ ~ ~ /say 1
复制代码
*清空

  1. /scoreboard players reset @e[name=f] a
  2. /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]