Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

查看: 2809|回复: 26

[新版本预览] 【CBL|pca】【1.9命令方块】"无延迟"else、else if 及嵌套(不需scb)

[复制链接]
发表于 2015-11-6 23:29:27 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 pca006132 于 2015-11-6 23:34 编辑

大家好,我是pca。今天来和大家说说1.9的chain CB(下称CCB)如何做到else/else if及嵌套
首先让我来介绍一下if、else、if else嵌套的概念(如果早就知道的话就可以跳过~)


                               
登录/注册后可看大图

if、else、else if

什么是if呢?相信大家都知道,if就是如果
比如说,如果地图上有盔甲架,就say 地图上有盔甲架
常见的表达方法:



至于else呢,就是当前面的if的条件没有达成,就执行下面的东西(否则就不执行)。也就是否则
比如说,如果地图上有盔甲架,就say 地图上有盔甲架;否则就say 地图上没有盔甲架



else if则是else 和 if一起使用,如果前面的if的条件没有达成,就执行另外一个if
例子: 如果有玩家叫a,就say 这里有个玩家叫a;否则如果有玩家叫b,就say这里有个玩家叫b;否则如果有玩家叫c,就say这里有个玩家叫b;否则就say这里没有任何叫a/b/c的玩家


从这个例子上可以看到,if、else、else if是可以配搭一起用的


                               
登录/注册后可看大图


嵌套

比如说,我们要在地图上有盔甲架并且有叫a的玩家的时候就say地图上有盔甲架和a玩家我们可以怎么办呢?我们可以用and,然而这需要scb,然而这并不符合本文的中心,而且也会很麻烦(如果要有盔甲架但是不能有叫a的玩家呢?或者是有盔甲架并且有叫b的玩家呢?难道写多几次?)
所以我们需要一个叫嵌套的东西
嵌套就是在if 里弄多一个if之类的东西,以下是一个例子
if (地图上有盔甲架)
{
    if (地图上有叫a的玩家)
    {
        say .......
    }
}
里面的东西和一般的基本上是一样的。无论是if、else、还是else if也能够嵌套别的if


                               
登录/注册后可看大图


1.9 CCB的特性

在了解如何做到if那些控制之前,你需要明白CCB的一些特性,不然的话是不能够明白那个系统的原理的。

首先,CCB是会把之前指着它的CB的信号延续下去无论它有没有被激活/conditional的条件是否满足
只要对着它的ICB(普通CB),RCB(自带高频的CB)有被激活(有没有成功执行命令是完全没关系的),或者对着它的CCB有信号传过来,它就会传递信号

第二,CCB在激活了(有红石信号激活/auto)并且满足条件(见下)的情况下就会执行命令

第三,CCB在以下情况下被称之为"条件满足"
  • 不是conditional模式
  • conditional模式下,前一个CB箭头对着它的箭头尾端,并且前一个CB在传递信号的时候成功执行命令
(比如??(第一个箭头为前一个命令方块及其方向,后一个箭头为conditional模式的CCB及其方向),如果前一个成功执行,后面那个就会为满足条件)
(比如
??(第一个箭头为前一个命令方块及其方向,后一个箭头为conditional模式的CCB及其方向),即使前一个成功执行,后面那个还是不满足条件,因为不是对着其箭头尾部)

接下来会使用的特殊简写(除了第一个CB是普通CB之外,所有都是CCB)
cond:命令
该CCB是在conditional模式的
mark:名字
以指定名字的盔甲架来标记下一个命令方块的位置

                               
登录/注册后可看大图


CCB的if、else、else if
首先,这个我经常使用blockdata来更改CCB的auto,因为auto为0的时候,它不会执行命令,但是会传递信号。而且,blockdata几乎是没有延迟的(执行后会马上看到结果),起码没有1gt的延迟,在CCB这种每个命令执行时间少于1gt的情况下(微观延迟)是极度有用的。

——if——
if就相当简单,后面的命令加上cond就可以了。
比如
testfor @e[type=ArmorStand]
cond:say there are armorstands
cond:say 第二个命令
如此类推,用我上面的表达方法就是
if (有盔甲架)
{
say there are armorstands
say 第二个命令
}
因为如果第一个条件不符合,后面的第一个CB就不能够执行,第二个也因为第一个不能执行而无法执行,如此类推,一串的cond命令方块就无法执行了
——————————————

——else——
else呢,就稍微难一点了,我们需要用到blockdata
比如
  1. testfor @e[type=Item]
  2. cond:say 这里有物品
  3. cond:execute @e[type=ArmorStand,name=1] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}
  4. mark:1
  5. say 这里没有物品
  6. execute @e[type=ArmorStand,name=1] ~ ~ ~ blockdata ~ ~ ~ {auto:1b}
复制代码
整个事情就好像是,当检测到有物品,就说有物品,并且令名字为1的盔甲架所在的命令方块无法执行命令,只能传递信息。最后把所有命令方块重置(令其能够执行命令)
如果没有物品,名字为1的盔甲架所在的命令方块就不会被blockdata,因此能够执行命令。

————————————

——else if——
else if其实和else差不多,都是利用那个auto的原理,然而这个稍微比较复杂点。例子:
  1. testfor @e[type=Item]
  2. cond:say 这里有物品
  3. cond:execute @e[type=ArmorStand,name=1] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}


  4. mark:1
  5. testfor @e[type=Creeper]
复制代码
其实,就是在else里增加一个if那样子而已。

相信大家也看到那个say 2、say 1和say end了。到底我弄那些看起来什么也表达不了的东西来干啥呢?
其实就是想告诉大家,有cond:和没有cond:是很大差别的。有cond:,就是当前面的成功执行才可以执行这个命令,所以就是在{}里面
如果没有cond:,就是在{}外面


                               
登录/注册后可看大图


嵌套!
warning!警告!
前方可能会让人头疼,如果不熟习上方的概念的话切勿看下方。(:D其实看看也无妨,然而我不确保解释的好)

好了,说了那么多,嵌套怎么做呢?
其实很简单的,大家看到我写的那个mark:1吗?1是什么意思呢?其实我就是把它当做为第一层那么看的。
嵌套的话,就是不同名字的盔甲架,1、2、3、4.....
第一层的在一开始的是auto:1b的,其他则是auto:0b(这里是简化了的)
如果符合某条件,它就把所有和它同一层次的CB变成auto:0b,并且把所有的下一层次CB变为auto:1b。
到了另外一个部分(比如if {} else {}就是两个部分),就把它需要用到的层次重置(以减少需要重置的次数)

相信大家也看到不明所以了,以下是一个例子,希望能够让大家更容易明白这个概念。
  1. execute @e[type=ArmorStand,name=1] ~ ~ ~ blockdata ~ ~ ~ {auto:1b}
  2. execute @e[type=ArmorStand,name=2] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}
  3. execute @e[type=ArmorStand,name=3] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}

  4. testfor @e[type=Arrow]
  5. cond:execute @e[type=ArmorStand,name=1] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}
  6. cond:execute @e[type=ArmorStand,name=2] ~ ~ ~ blockdata ~ ~ ~ {auto:1b}

  7.     mark:2
  8.     cond:testfor @e[type=Item]
  9.     cond:execute @e[type=ArmorStand,name=3] ~ ~ ~ blockdata ~ ~ ~ {auto:1b}
  10.     cond:execute @e[type=ArmorStand,name=2] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}

  11.         mark:3
  12.         cond:testfor @a
  13.         cond:say there are arrows,items and players
  14.         cond:execute @e[type=ArmorStand,name=3] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}

  15.         mark:3
  16.         say there are arrows and items

  17.     mark:2
  18.     testfor @a
  19.     cond:say there're arrows and players
  20.     cond:execute @e[type=ArmorStand,name=2] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}

  21.     mark:2
  22.     say there are arrows


  23. execute @e[type=ArmorStand,name=2] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}
  24. mark:1
  25. testfor @e[type=Item]
  26. cond:execute @e[type=ArmorStand,name=1] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}
  27. cond:execute @e[type=ArmorStand,name=2] ~ ~ ~ blockdata ~ ~ ~ {auto:1b}

  28.     mark:2
  29.     cond:testfor @a
  30.     cond:say there are items and players
  31.     cond:execute @e[type=ArmorStand,name=2] ~ ~ ~ blockdata ~ ~ ~ {auto:0b}

  32.     mark:2
  33.     say there are items

  34. mark:1
  35. testfor @a
  36. cond:say there are players
复制代码
首先就是把所有的第一层次CB变为auto:1b,并且把所有其他层次的CB变为auto:0b
然后如果检测到箭,就把第二层次的变为auto:1b(进入第二层次),并把第一层次的变为auto:0b(把后面的命令忽略掉)
    如果检测到物品,就把第三层次变为auto:1b(进入第三层次),并把第二层次的变为auto:0b(把之后的忽略掉)
        如果检测到玩家,就say检测到箭、物品和玩家。然后把第三层次的变为auto:0b(忽略掉后方的)
        否则,就say 检测到箭和物品。
    否则,如果检测到玩家,就say 检测到箭和玩家。并且把第二层次的变为auto:0b
    否则,就say 检测到箭。
把所有第二层次的CB重置为auto:0b(不用重置第三层次是因为这里用不到第三层次)
否则,如果检测到物品,就把第二层次的变为auto:1b(进入第二层次),并把第一层次的变为auto:0b(把后面的命令忽略掉)
    如果检测到玩家,就say 检测到物品和玩家。并且把第二层次的变为auto:0b
    否则,就say 检测到物品
否则,如果检测到玩家
就say检测到玩家。



很简单吧= ̄ω ̄=,就是不停的把不同层次disable/enable。

深夜码字哦,各位客官来捧个场吧QAQ
{:10_521:}

来自群组: Command Block Logic

评分

参与人数 13人气 +19 金粒 +229 金锭 +1 贡献 +2 收起 理由
guaiwanji + 1 后面一大串指令看蒙了,我还是静静地待在1..
xsy123 + 1 + 1 好思路
寒冰han_Ice + 5 把我看呆了,不错
acordome + 1 + 15 思路的确很棒!
kongbaiyo + 1 + 20 屌极了
sylqiuyifeng + 4 + 50 + 1 Mcbbs有你更精彩~
玄素 + 1 + 10 新思路get
白天 + 1 + 20 cbl有这个人吗 斜眼笑
840196733mw + 1 很棒的作品!然而看不懂
lzs1234 + 2 + 33 顶起
屠灵神 + 1 + 15 完全不懂,好腻害的样子(斜眼.
ufof + 2 + 35 厉害
乙烯_中国 + 3 + 25 + 2 优秀

查看全部评分

回复

使用道具 举报

发表于 2015-11-6 23:31:58 | 显示全部楼层
看了半天啥也没看懂……这个东西有实际意义么,似乎以前1.8 1.7时代也蛮好的……

点评

然而你就看了顶多3分钟吧。。。 这东西确实有意义的,解决了只能if不能else 的问题  详情 回复 发表于 2015-11-6 23:35

评分

参与人数 1人气 +1 收起 理由
840196733mw + 1 1.7没有@e exe 能玩? 手动滑稽

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-11-6 23:35:45 | 显示全部楼层
andylizi 发表于 2015-11-6 23:31
看了半天啥也没看懂……这个东西有实际意义么,似乎以前1.8 1.7时代也蛮好的…… ...

然而你就看了顶多3分钟吧。。。
这东西确实有意义的,解决了只能if不能else 的问题

点评

是的,代码太多实在头疼……果然1.9发布后,红石工程师/地图制造者要逆天了  详情 回复 发表于 2015-11-7 18:18
回复

使用道具 举报

发表于 2015-11-6 23:40:54 | 显示全部楼层
话说CB能不能够面向对象

点评

这个嘛,我不懂编程,然而我觉得应该就是吧。 毕竟记分板的分数、nbt等等绝大多数的都是针对实体/方块来搞的。 当然,能够做到的东西当然比编程少很多,毕竟我们能用的就是Mojang给我们的那些东西,而且经常有"特性"  详情 回复 发表于 2015-11-6 23:46
回复

使用道具 举报

 楼主| 发表于 2015-11-6 23:46:11 | 显示全部楼层
ufof 发表于 2015-11-6 23:40
话说CB能不能够面向对象

这个嘛,我不懂编程,然而我觉得应该就是吧。
毕竟记分板的分数、nbt等等绝大多数的都是针对实体/方块来搞的。
当然,能够做到的东西当然比编程少很多,毕竟我们能用的就是Mojang给我们的那些东西,而且经常有"特性",局限实在是太大了。

评分

参与人数 2人气 +2 金粒 +3 收起 理由
kakagou12 + 1 + 3 不懂编程?虚伪。
840196733mw + 1 特性32个差评

查看全部评分

回复

使用道具 举报

发表于 2015-11-6 23:45:39 | 显示全部楼层
lz,if可以用多个命令方块朝向一个chain做到,else可以用多个“需要前面的命令方块成功输出”做到,还有,那个“需要前面的命令方块成功输出”的一组必须是一条直线

点评

这个嘛,我有点不明白你在说啥.... 然而我看不出这算是什么if,因为只要前面的给个信号那个chain cb,它就会执行命令,我看不到有任何条件。 需要前面的命令方块成功输出这不是if吗?为什么是else? 而且if那些相关  详情 回复 发表于 2015-11-6 23:52
回复

使用道具 举报

 楼主| 发表于 2015-11-6 23:52:31 | 显示全部楼层
林扬骐 发表于 2015-11-6 23:45
lz,if可以用多个命令方块朝向一个chain做到,else可以用多个“需要前面的命令方块成功输出”做到,还有, ...

这个嘛,我有点不明白你在说啥....
if可以用多个命令方块朝向一个chain做到

然而我看不出这算是什么if,因为只要前面的给个信号那个chain cb,它就会执行命令,我看不到有任何条件。
else可以用多个“需要前面的命令方块成功输出”做到

需要前面的命令方块成功输出这不是if吗?为什么是else?

而且if那些相关的东西,你这里没说conditional,没说命令,没说红石组件,到底你想说什么呢?

点评

可能我也没有理会你的意思吧……  详情 回复 发表于 2015-11-7 07:16
回复

使用道具 举报

发表于 2015-11-7 00:22:43 来自手机 | 显示全部楼层
vb大触说我不会编程_(:3」∠)_
回复

使用道具 举报

发表于 2015-11-7 00:33:19 来自手机 | 显示全部楼层
没有end if能玩?没有select case能用?(斜眼
回复

使用道具 举报

发表于 2015-11-7 00:38:32 | 显示全部楼层
看到1/3的时候我就放弃了,看起来很腻害的样子
回复

使用道具 举报

发表于 2015-11-7 07:16:53 | 显示全部楼层
pca006132 发表于 2015-11-6 23:52
这个嘛,我有点不明白你在说啥....

然而我看不出这算是什么if,因为只要前面的给个信号那个chain cb,它 ...

可能我也没有理会你的意思吧……
回复

使用道具 举报

发表于 2015-11-7 12:25:35 | 显示全部楼层
本帖最后由 840196733mw 于 2015-11-29 08:43 编辑

看了半天,我想说,对于我还不如计分板呢(滑稽)
嵌套彻底看不懂了





————————————————————分割——————————————


在被计分板坑了之后回来看,终于理解了50%、





回复

使用道具 举报

发表于 2015-11-7 12:28:07 | 显示全部楼层
在reddit看过类似的

点评

刚才Google了一下,你说的是https://www.reddit.com/r/Minecraft/comments/3iuzs8/if_else_statements_are_easier_than_ever_with/这个吧? 这个我觉得最大的问题在于需要检测不同命令方块的successcount,如果是大量  详情 回复 发表于 2015-11-7 12:53
回复

使用道具 举报

 楼主| 发表于 2015-11-7 12:53:30 | 显示全部楼层
chyx 发表于 2015-11-7 12:28
在reddit看过类似的

刚才Google了一下,你说的是https://www.reddit.com/r/Minecra ... ier_than_ever_with/这个吧?
这个我觉得最大的问题在于需要检测不同命令方块的successcount,如果是大量if else/嵌套的话,就需要检测不同坐标,这对我来说很麻烦(不能直接复制命令)。或者可以用AS来检测,然而还是麻烦,因为要指定每个CB一个AS,名字不可以相同,不然就可能会出bug。

点评

确实 你的auto确实十分巧妙 赞  详情 回复 发表于 2015-11-7 13:15
回复

使用道具 举报

发表于 2015-11-7 13:15:15 | 显示全部楼层
本帖最后由 chyx 于 2015-11-7 13:17 编辑

确实 你的auto确实十分巧妙
赞!我先不评分 因为我快9级了 到时候再评

评分

参与人数 2人气 +1 金粒 +21 收起 理由
lzs1234 + 1 于是你愉快地忘了这档事
pca006132 + 1 + 20 感谢~

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 手机版本

GMT+8, 2017-9-25 08:46 , Processed in 0.174478 second(s), 7 queries , Memcache On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。

© 2010-2017 我的世界中文论坛 版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。

快速回复 返回顶部 返回列表