联动CancergaryTyanboot

康威生命游戏是啥大伙可以在上面的链接中了解,本文以Accidental Games的作品为例详细讲解mc中的Conway’s Game。游戏展示和存档视频里都有。

那么开始。 注: 本游戏需要Minecraft 1.9版本。

ICB:Impulse Command Block,即1.8及以前版本里的黄色命令方块
RCB:Repeat Command Block,即自带脉冲的命令方块,紫色,每t运行一次。
CCB:Chain Command Block,即指向它的命令方块被激活时会连锁激活的绿色命令方块,本文的CCB全是Unconditional模式,不需要红石激活。

2015-11-08_15.16.22

首先,ICB用来创建一个名叫life的无判据计分板。它是基础。当然,它只需要运行一次,直接用按钮开启即可。

/scoreboard objectives add life dummy

接下来这段非——常——长的一串CCB就是Run Life,它控制整个游戏的运行。 首先用一个RCB testfor玩家手中的绿宝石块,如果检测到,就会触发它指着的那个CCB。

/testfor @p {SelectedItem:{id:minecraft:emerald_block}}

这里的ICB和上一个CCB分开了,我也不知道为什么。在ICB上方summon一个名字为runLife的盔甲架(过程略),然后在CCB中让它在原地放置红石块,正好激活下方的ICB(还是原来的配方,还是熟悉的味道)。

/execute @e[name=runLife] ~ ~ ~ setblock ~ ~ ~ redstone_block

为什么要用这个ICB呢?因为RCB的脉冲是不可控的╮(╯▽╰)╭

/setblock ~ ~1 ~ wool 14

然后就是一串的CCB,最开始的CCB重置分数,接下来八个CCB探测每个药水云周围是否有其他药水云(药水云哪来的在后面会说到),然后加一分。翻译成康威生命游戏的话就探测每个居民身边是否有邻居。这是判断死亡的条件。

/scoreboard players set @e[type=AreaEffectCloud] life 0

/execute @e[type=AreaEffectCloud] ~1 ~ ~ scoreboard players add @e[type=AreaEffectCloud,r=0] life 1

/execute @e[type=AreaEffectCloud] ~1 ~ ~1 scoreboard players add @e[type=AreaEffectCloud,r=0] life 1

/execute @e[type=AreaEffectCloud] ~ ~ ~1 scoreboard players add @e[type=AreaEffectCloud,r=0] life 1

/execute @e[type=AreaEffectCloud] ~-1 ~ ~1 scoreboard players add @e[type=AreaEffectCloud,r=0] life 1

/execute @e[type=AreaEffectCloud] ~-1 ~ ~ scoreboard players add @e[type=AreaEffectCloud,r=0] life 1

/execute @e[type=AreaEffectCloud] ~-1 ~ ~-1 scoreboard players add @e[type=AreaEffectCloud,r=0] life 1

/execute @e[type=AreaEffectCloud] ~1 ~ ~-1 scoreboard players add @e[type=AreaEffectCloud,r=0] life 1

/execute @e[type=AreaEffectCloud] ~ ~ ~-1 scoreboard players add @e[type=AreaEffectCloud,r=0] life 1

然后该判断复活的条件了,八个CCB分别探测八个方向,每探测到一个煤块就生成一个名为check的药水云。

/execute @e[name=tile,type=AreaEffectCloud] ~1 ~ ~ detect ~ ~-1 ~ coal_block -1 summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:check}

/execute @e[name=tile,type=AreaEffectCloud] ~1 ~ ~1 detect ~ ~-1 ~ coal_block -1 summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:check}

/execute @e[name=tile,type=AreaEffectCloud] ~ ~ ~1 detect ~ ~-1 ~ coal_block -1 summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:check}

/execute @e[name=tile,type=AreaEffectCloud] ~-1 ~ ~1 detect ~ ~-1 ~ coal_block -1 summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:check}

/execute @e[name=tile,type=AreaEffectCloud] ~-1 ~ ~ detect ~ ~-1 ~ coal_block -1 summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:check}

/execute @e[name=tile,type=AreaEffectCloud] ~-1 ~ ~-1 detect ~ ~-1 ~ coal_block -1 summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:check}

/execute @e[name=tile,type=AreaEffectCloud] ~ ~ ~-1 detect ~ ~-1 ~ coal_block -1 summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:check}

/execute @e[name=tile,type=AreaEffectCloud] ~1 ~ ~-1 detect ~ ~-1 ~ coal_block -1 summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:check}

接着为所有名为check的药水云加名为keep的tag。

/execute @e[name=check,type=AreaEffectCloud] ~ ~ ~ scoreboard players tag @e[name=check,type=AreaEffectCloud,r=0,c=-1] add keep

接着的CCB每探测到一个名为check的药水云就给药水云自身加一分。然后杀死所有tag不是keep的药水云。

/execute @e[type=AreaEffectCloud,name=check] ~ ~ ~ scoreboard players add @e[type=AreaEffectCloud,name=check,r=0] life 1

/kill @e[type=AreaEffectCloud,name=check,tag=!keep]

接下来CCB给所有分数为1的药水云(当然是带keep的)下方放一个煤块,即杀死居民。然后杀死那个作为锚点的药水云。

/execute @e[type=AreaEffectCloud,name=tile,score_life=1] ~ ~ ~ setblock ~ ~-1 ~ coal_block

/kill @e[type=AreaEffectCloud,name=tile,score_life=1]

杀死所有4+分的居民,跟上面一样,不详细说了。

/execute @e[type=AreaEffectCloud,name=tile,score_life_min=4] ~ ~ ~ setblock ~ ~-1 ~ coal_block

/kill @e[type=AreaEffectCloud,name=tile,score_life_min=4]

接下来CCB让分数为3的居民复活,给他们上加一个名为tile的药水云,作用是什么下面会说。循环完毕杀死所有名为check的药水云。

/execute @e[type=AreaEffectCloud,name=check,score_life=3,score_life_min=3] ~ ~ ~ setblock ~ ~-1 ~ quartz_block

/execute @e[type=AreaEffectCloud,name=check,score_life=3,score_life_min=3] ~ ~ ~ summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:tile}

/kill @e[type=AreaEffectCloud,name=check]

此时玩家手中还有绿宝石块,第一个RCB就会再次loop一次刚才的过程。

2015-11-08_15.16.26

接下来就是玩家生产生命的时候到了,在代表死亡的煤块上用羊蛋生成羊的同时放置代表居民的石英块,触发CCB生成名为tile的药水云供前面的CCB判定(现在知道为什么刚才要用tile药水云了吧),把羊tp到虚空里杀死。

//RCB Here

/execute @e[type=Sheep] ~ ~ ~ setblock ~ ~-1 ~ quartz_block

//CCB Here

/execute @e[type=AreaEffectCloud] ~ ~ ~ tp @e[type=Sheep,r=0] ~ -100 ~

/execute @e[type=Sheep] ~ ~ ~ summon AreaEffectCloud ~ ~ ~ {Duration:2147483647,CustomName:tile}

/tp @e[type=Sheep] ~ -100 ~

通过末影螨蛋把石英块变(居民)变成煤块(死亡),不再赘述。

//RCB Here

/execute @e[type=Endermite] ~ ~ ~ setblock ~ ~-1 ~ coal_block

//CCB Here

/execute @e[type=Endermite] ~ ~ ~ kill @e[r=0,type=AreaEffectCloud,c=1]

/tp @e[type=EnderMite] ~ -100 ~

哞菇蛋杀死所有居民和药水云。

//RCB Here

/execute @e[type=MushroomCow] ~ ~ ~ execute @e[type=AreaEffectCloud] ~ ~ ~ setblock ~ ~-1 ~ coal_block

//CCB Here

/execute @e[type=MushroomCow] ~ ~ ~ kill @e[type=AreaEffectCloud]

/tp @e[type=MushroomCow] ~ -100 ~