粘液块及观察者技术

由于粘液块的神奇功用,利用粘液块已经发展成了一门专门的技术,国内玩家亲切地称之为——绿萌技术。

让我们衷心感谢粘液块代码的最初编写者和将他推荐给mojang公司的玩家——KaboPC和Panda4994。

第一节 综述

粘液块于1.8中被正式引入游戏。

粘液块向游戏中增加了更多电路实现的方式,增加了可玩性和趣味性。粘液块标志着可移动电路被正式引入游戏,这种电路可以在一定程度内自由改变自身的位置,从而不被局限于固定的位置,同时,由于红石线和中继器等元件无法被活塞移动,它们在粘液块技术中无法被自由使用,这掀起了一场“去红石化”浪潮。

粘液块技术被广泛应用于生存电路和机械电路中。粘液块技术在生存电路中的应用主要在于可移动电路,例如轰炸机,采矿机,排水机,弯铁轨机,造路机等。生存中大面积进行操作带来的庞大机械性正是可移动电路恰如其分的用武之地,而在物品及实体传输,信号传递等方面,粘液块带来的便利性也是不可替代的。粘液块技术在机械电路中的应用主要在于大型的活塞门和多样化的飞行器。过大的活塞门使用传统电路显得过于繁杂而不切实际,但使用飞行器构建活塞门就可以使得大型活塞门的制作成为可能。

观察者于1.11被正式引入游戏。

观察者是一种可以检测方块变化的方块,这使得其在检测方块变化上有了用武之地;而观察者作为一种可以被移动的输入元件,在电路中充当了轻便的信号源的地位;不得不提的是,观察者输出的信号是2gt的短脉冲信号,因而其又是结构简单、抗干扰能力强的短脉冲器。综合以上几点,观察者在被加入游戏后得到了广泛而又深刻的应用,其对传统电路与粘液块电路的优化和简化都起到了不可磨灭的功用。

在粘液块被引入游戏后,可移动电路诞生了,但观察者被引入游戏后,玩家Modiseus 制作出了无粘液块的可移动电路。除此之外,panda4994还曾在无粘液块及观察者的时代,通过不断的放置方块,制作出可以不断向前移动并含有特定结构的电路,并借此将特定结构推入未生成区块,从而人工生成刷怪笼。

第二节 粘液块飞行器

粘液块的运动特性

当粘液块静止时,粘液块表现得和其他方块并无二致。但是当活塞推动粘液块时,粘液块便会表现出它的粘性,粘动毗邻的方块,包括其他粘液块一起运动。换句话说,只有粘液块能够表现出粘性,运动的粘液块可以粘动其他方块,但用运动的方块粘动粘液块是不可能的。

活塞能够推动十二个方块,当粘液块被引入运动时,活塞最多能使得十二个方块运动。如果活塞尝试推出超过十二个方块,活塞将不会推出并陷入BUD态;如果粘性活塞尝试收回超过十二个方块,粘性活塞将自己收回而留下方块不动。

活塞会使得自己即将移动的方块有一个运动趋势,而粘液块可以将这种运动趋势传递给毗邻,这样所有要运动的方块都有了运动趋势,也就有了一个即将到达的位置,这个位置被称为运动趋势位,趋势位也是一种基本位置关系。如果在趋势位上存在有诸如基岩、推出的活塞等无法被移动的方块,所有的方块包括活塞将不会有动作,甚至伸出的活塞也无法收回这些方块。树叶、南瓜、西瓜、火把等方块,如果存在于运动趋势位,会在该方块开始运动时破坏,同时其也不能被粘液块所粘动。较为特殊的方块是带釉陶瓦,这是一种可以推动但无法被粘液块粘动的方块。另一种值得注意的方块是1.15加入的蜂蜜块,其具有与粘液块相似的特性,但并不与粘液块相互粘连,这允许玩家在相邻两格内使用两套粘液块电路,相信蜂蜜块也会给红石电路带来不小的创新空间。

总结而言,考察粘液块的运动特性需要先考察方块的运动反应类型,一般包括:常规型(一般可推动的方块),阻挡型(基岩、屏障、黑曜石等方块,箱子、熔炉、铁砧等方块实体),破坏型(西瓜、火把等方块及潜影盒),仅推动型(带釉陶瓦,蜂蜜块之于粘液块,粘液块之于蜂蜜块)。

粘液块的运动特性就可以被总结为:

粘液块仅能粘动常规型方块

事实上,Mojang这里写的代码极度混乱,铁砧不能被推动是因为被放在了重金属材料一类中,这一类中有一个属性是不可推动。基岩的这一属性却是可推动,但推动前会检测硬度,若为-1则也不能推动。屏障虽然硬度也是-1,但属性却是不可推动。代码里明确规定了黑曜石不可推动,而蜂蜜块和粘液块会在相互运动时决定不可粘连,简直写得乱七八糟。

粘液块推动方块产生效果等价于活塞直接推动该方块的效果,活塞能否伸出或带方块收回取决于所有粘液块、所有被推动的方块及所有被粘液块粘动的方块能否移动。

例 1 分析如下的电路,说明拉杆拉下和拉回后电路的运行情况。

解:拉杆拉下,现在检查粘性活塞的推出条件,粘液块总计11个,常规型方块红石块1个,将被粘动,伸出的普通活塞属于阻挡型方块,粘液块不能粘动。方块总数为12,所有方块均能移动,故粘性活塞伸出。由于红石块被粘动,上方普通活塞收回。

拉杆拉回,检查粘性活塞带方块收回的条件,粘液块11个,红石块1个,普通活塞1个,总计13个,故粘性活塞无法带方块收回,其自行收回,其余方块不动。

传统红石引擎

在可移动电路的实际应用中,红石引擎的诞生是必然的。红石引擎是一种粘液块电路结构,其可以在保持自身电路结构的前提下,不断地移动自己的位置,从这一点看,红石引擎有无限移动的能力,就好像是“永动机”一样。

红石引擎的构思是简单的,电路需要向前移动,就必然需要活塞将电路向前推动,但就像俗语所说“人不能拎着头发把自己举起来”一样,这个活塞没有办法推动其自身,这就需要另一个活塞来推动它,或者粘性活塞将它向前拉。

红石引擎可以不断地向前移动,这依赖于活塞的不停运动,但如果红石引擎撞到了墙上呢?如果红石引擎在行进过程中遇到了不可推动的方块,那么活塞自然会陷入BUD态(如果信号是观察者提供的,活塞就会错过信号),我们理所应当地希望在该方块被移除后,更新处于BUD态的活塞(或重新通过观察者激活这一活塞),引擎可以继续向前移动,而电路结构不至于被破坏。因此,在红石引擎的某一静止状态时,一定有活塞处于BUD态(或观察者指向某个活塞)。正是这种“能够被激活”的能力,赋予了红石引擎“能量”。从某种意义上讲,红石引擎的静止态是不稳定的,而运行态才是稳定的。

在创造模式中,为了更新处于BUD态的活塞,我们可以使用火焰弹。通常情况下对着处于BUD的活塞或观察者使用火焰弹,火焰弹会产生火方块,但又会因为下方没有可以支撑火方块的方块,其又立马消失,这个过程就会给予我们所希望更新的方块一次方块更新。

下图的装置被称为半自动机,左边的粘性活塞处于BUD态。下面我们用火焰弹更新这个方块,并分析电路的运行情况。

1e74e5fa

更新粘性活塞,粘性活塞意识到自己被激活,从而伸出,3pt后活塞推出完成。此时普通活塞处于BUD态,但其不可能伸出,因为其不能推出已经伸出的粘性活塞。粘性活塞随后自检,发现其已经不处于激活态,从而在3pt后完成收回。就结果来看,粘性活塞花费了6pt将普通活塞粘了回来。

在《基础红石原理》中我们曾经介绍过,基于活塞运行的更新顺序,判断其能否成为BUD有一条经验规律,即

如果活塞推动方块的趋势位已有一个方块,装置作为BUD;如果方块为空气,装置被更新后会伸出收回如此往复持续。

就现在的情况进行分析,粘性活塞将普通活塞粘了回来,这个方块占据了趋势位,从而粘性活塞将陷入BUD态。那么此时,普通活塞则可以推出,3pt后普通活塞推出,基于同样的道理,粘性活塞也因无法推出伸出的普通活塞而无法伸出,其陷入BUD态。再3pt后普通活塞收回。

综上所述,这个装置在粘性活塞收到方块更新后,会花费12pt,向左移动一格。由于这个装置可以改变自己的位置,但又无法自行持续运行下去,因此被称为“半自动机”。又因为半自动机必须接收更新才能移动,其也被称为“更新引擎”。

半自动机并非是我们需要的红石引擎的唯一类型,有时我们需要可以自我更新的“全自动机”。全自动机有自我更新的能力,因此其可以不借助外界更新而无限运动,举例来说,我们可以在上例的半自动机上增加一个更新模块,使得其可以更新自己。

这便是一个全自动机,下面我们更新粘性活塞,分析电路运行的时序。

粘性活塞当前处于BUD态,更新其后,粘性活塞3pt推出,再3pt将右侧活塞粘回,随后右侧活塞激活,3pt推出。此时与之前的半自动机不同是,被右侧活塞推动得到不仅仅是粘性活塞,还有左侧活塞。虽然粘性活塞依然不能推出,但此时左侧活塞被BUD激活,在下一个3pt中,右侧活塞收回而左侧活塞推出。在左侧活塞推出完成后,其更新到粘性活塞,这就进入了一个循环,那么接下来发生的就是在粘性活塞推出的同时,左侧活塞收回。这个全自动机的周期也是12pt,也就意味着该红石引擎的速度是1格/12gt。

刚才提到的红石引擎都只具有单向飞行的能力,也就是所谓的单向飞行器。拥有向两个方向运动能力的飞行器被称为双向飞行器,其中的引擎也就是双向引擎。

下图所示的就是一种双向飞行器,其在之前提到的全自动机的基础上增加了一些结构,这些结构恰好是一个没有红石块的全自动机,并且方向也是相反的。就现在看来,其只能被全自动机所带动,新加的活塞不可能激活。根据之前的分析,更新后侧的粘性活塞,这个引擎会以1格/12gt的速度向右移动。

我们现在在电路的运行轨道上增加如下电路,其中黑曜石会阻止飞行器继续运动,粘性活塞和红石块则会检测是否有飞行器撞到了黑曜石上。巧妙的是,当飞行器停在黑曜石前时,两个普通活塞会伸出,并把引擎中两个红石块推到原先没有红石块的全自动机一侧,如图所示:

随后,黑曜石上的中继器熄灭,给予前侧全自动机的普通活塞更新,这个飞行器就沿原路返回了,但此时两个红石块已经被移交到了向左运动的全自动机上了。

除了并排放置两个全自动机,也可以将两个相反方向的全自动机放在一条线上,但此时最两侧的活塞就要推动10个方块,换句话说只能再携带额外的2个方块,再多就会超过推动上限,这对于飞行器的拓展是不利的。

此时这个飞行器是向右移动的,若希望其反向,则移动红石块的位置则不是仅仅将两个红石块推到侧面这么简单的了,下面尝试给出一种思路。

在这个例子中,我们尝试将靠后的红石块移到最前的粘液块上,为此可以将靠后的红石块用粘性活塞粘起,随后用活塞将它推到最前面,再用普通活塞推下去,为此电路中预存了5个红石块。

右侧的黑曜石负责停住飞行器,而观察者检测飞行器的飞入。负责拿起和放下红石块的粘性活塞和普通活塞单纯由5个红石块中的2个激活,电路只需要控制5个粘性活塞和将6红石块向前退的普通活塞即可。

当右侧普通活塞将红石块推下后,顺势激活音符盒,这是为了更新其下的普通活塞。同时上方的电路保证上方活塞伸出,避免在启动过程中原先用于检测飞行器停靠的观察者输出的信号再起启动这个装置。

基于完全相同的原理,我们可以制作向上和向下运动的全自动机,这里不再详述,各给出一例,仅做原理解释作用的参考。

通用观察者引擎

在如上的红石引擎中,我们都使用了红石块激活活塞。当然,在有观察者的版本中,我们可以使用观察者激活活塞,其具有以下的若干特点:

  • 观察者可以强充能方块,也可以用指向直接激活粘性活塞,而红石块只能以常规方式或BUD方式激活粘性活塞,因此观察者可以依据不同的方向用不同的朝向和方式激活粘性活塞。
  • 观察者只会在运动后给出信号,这意味着如果飞行器被阻塞,内部没有活塞处于BUD态。如果希望飞行器启动,可以更新引擎内特定的观察者。
  • 观察者发出的是短脉冲,这可以很好地让粘性活塞完成只推不拉的操作,这意味着我们在一些场合中,完全有能力将普通活塞替换为粘性活塞,让其可以承担推动方块和拉动方块的任务。

如下便是一个使用了观察者的红石引擎,注意到其本身的结构是对称的,其可以朝两个方向运动,这完全取决于我们更新哪个观察者。当红石引擎遇到障碍而停下时,我们完全可以更新对面的观察者,使其沿原路反向运动回去。这种飞行器就是现在使用的一种通用且标准的双向飞行器。

6方块通用飞行器

现在我们更新下侧的观察者,分析电路的运行情况。

更新观察者,其进入启动延迟,2gt后开始激活,给出2gt的短脉冲。注意观察者充能的是右下的粘液块,这个信号并不能激活左下的粘性活塞,因而只有右上的粘性活塞收到短脉冲,并在2gt后将方块顺推,随后的2gt则是收回。根据粘液块的运动特性,右上的粘性活塞可以推动左侧的三个方块。

在右上的粘性活塞顺推左侧的三个方块后,观察者会以此作为更新源进入启动延迟,并在2gt后激活,不过左下粘性活塞并没有可以推动的方块,在这里它的作用是于2gt顺推后将右侧的三个方块粘回来,这又需要2gt,此时装置回到了一开始的状态。

总结来看,下侧观察者的启动延迟2gt,右上的活塞顺推方块2gt,收回的同时使上侧的观察者进入2gt的启动延迟,其后左下的粘性活塞推出2gt,收回2gt。这个红石引擎的周期是10gt,向左运动。

当我们更新观察者后,两个粘性活塞就被赋予了两个不同的任务,这个红石引擎就被分成了两个模块。在这个例子中,右上的活塞执行的是“推模块”的功能,其将左侧的“拉模块”推走,而左下的活塞执行“拉模块”的功能,其将右侧的“推模块”拉走。在这里,右上的粘性活塞只发挥推方块的功能,只相当于一个普通活塞,在本电路中可以完全把它换成普通活塞,红石引擎的周期和运行情况没有变化,但这样一来,这个红石引擎便只能向左运行了。

两个观察者可以改变它们的位置,例如可以将观察者放置在粘液块之上,并指向它们所要激活的活塞的上方,又或者变更粘液块的结构,如下2图的8方块通用飞行器。类似的改动是简单的,只要保证两个观察者能够激活自己所要激活的活塞,并不干扰另一个活塞即可,这就是为什么这里不能被简单地用红石块进行替代。

8方块通用飞行器

制作垂直移动的通用引擎也是简单的,如下图便是一例,制作过程中需要注意活塞的BUD激活。

拓展模块和环状引擎

一个活塞只能推出12个方块,但飞行器决不能就此止步,与之相反,必须存在一定的拓展模块,使飞行器能够移动更多的方块。

下图展示的是三个“推扩展模块”。红石引擎或其它拓展模块将普通活塞向前推动一格,使之进入到一个有信号的位置,在这里指的是可以被红石块激活的位置,无论这个激活是常规激活或者非常规激活。随后普通活塞伸出,将信号源推离自身,这一过程需要3gt。事实上,只要能够令普通活塞将激活自己信号源推走,推模块便可以实现,而红石块具体的位置是灵活的。

下图展示的是一个“拉拓展模块”,红石引擎或其他拓展模块将图中的普通活塞和粘性活塞向前移动一格,使之进入到一个有信号的位置,粘性活塞和普通活塞开始伸出。但普通活塞会将红石块推走,由此粘性活塞接收到的是0t信号,瞬间推出并开始收回。普通活塞的伸出和粘性活塞的收回需要3gt。

基于观察者的拓展模块也是简单的,由于观察者可以强充能方块,推模块中可以直接激活、BUD激活或充能粘液块激活活塞。观察者的启动延迟是2gt,活塞无启动延迟推出需要2gt,基于观察者的推模块推出完成需要4gt。

同样的原理也适用于拉模块,观察者启动延迟2gt,粘性活塞推出2gt,收回需要2gt,拉模块收回完成总计需要6gt。

一点很神奇的是,观察者的拉模块和推模块结构很相似,事实上这是因为观察者输出的是一个短脉冲,而短脉冲作用于粘性活塞可以使其只推不拉,也就是充当了普通活塞的作用。

下图则是一个双向拓展模块。

当红石块向后运动的时候,下方粘性活塞撤销激活,将装置向后移动一格,移动结束的上方粘性活塞再将下方粘性活塞向后推一格,使之回到当前的样子。

当红石块向前运动时,下方的粘性活塞A也要收回,但其不能收回方块,因为红石块正在向前移动,其不能将前方的观察者D移动到和红石块同一位置上,因此粘性活塞A只能自行收回。粘性活塞A是因为红石块被推走而撤销激活的,这是一个非同步信号,粘性活塞A无启动延迟,收回需要2gt。同时,观察者D可以检测到有方块要移入,从而进入启动延迟。

活塞A收回后,靠后的观察者C也进入启动延迟,同一gt中的观察者D则是在NTE事件开始激活的,因而随后D的撤销激活优先于C的开始激活,因而观察者C再次使观察者进入启动延迟。同时,D的撤销激活使粘性活塞B顺推而转向开始收回。2gt后,观察者C撤销激活,观察者D开始激活,粘性活塞B收回完成,使得粘性活塞A被拉到一个有能量的位置。收回完成时同步信号,活塞有启动延迟,下一gt粘性活塞A开始推出,导致正在激活的观察者D被推动,其将在2gt后到位,但不再激活。这就回到了现在的状态。

下面给出时间轴表。

粘性活塞A 粘性活塞B 观察者C 观察者D
BE 开始收回 BE 启动延迟
TE 收回完成 BE 开始激活 TE 启动延迟 NTE 开始激活
BE 开始收回 NTE 开始激活 NTE 撤销激活
NTE 启动延迟
TE 收回完成 NTE 撤销激活 NTE 开始激活
BE 开始推出 BE 被推动
TE 推出完成

观察者C能否换为普通方块?很明显不能,这里利用了它更新观察者D,使得后者能够在激活时被移动,避免了粘性活塞B的再伸出。

这里有一点需要注意:红石引擎的周期是不同的,而拓展模块的工作时间也是不同的,必须保证拓展模块能够跟得上红石引擎的速度,否则拓展模块就无法完成其应当完成的作用了。

在介绍了推拉拓展模块之后,相信读者对引擎和推拉拓展模块之间的关系有了更深的认识,事实上,红石引擎就是由推拉拓展模块构成的。例如在半自动机中,粘性活塞就是拉的模块而普通活塞就是推的模块;在通用红石引擎中,两个互相推拉的模块正是推拉拓展模块。红石引擎和推拉拓展模块的区别就在于在红石引擎中,所有拓展模块不能同时处于静息状态,其总能自己更新并使自身向前移动。

既然如此,存在只包含推模块的红石引擎吗?答案当然是肯定的,但如果只包含两个推模块的话,第一个模块推出完毕后需要3gt收回,第二个推模块无法将其推出。因此在不用其他方式等待这3gt过去,是不可能只用2个推模块制作红石引擎的。下面是一个包含3个推模块的红石引擎,三个推模块交替激活,构成一个环,因此这种红石引擎又称为环状引擎。

由于推拉拓展模块的结构是灵活的,环状引擎的制作也是灵活的。在本例中,左侧推模块活塞处于BUD态,其需要3gt推出。推出完成后会将右侧活塞推到一个有能量的位置,其推出也需要3gt。再推出完成后,中间活塞被推到一个有能量的位置,此时左侧的活塞已经收回,可以被推出,这又需要3gt。因此这个红石引擎的周期为9gt。

使用更多的推拉拓展模块构成一个环状引擎,引擎的周期会变得更长,这是制作长周期引擎的一种简单方式。

半自动机不能自我更新,我们可以利用相反的道理,使用半自动机来制作拓展模块。如上图便是用一个全自动机带动两个半自动机运行的例子,全自动机使用白色玻璃更新半自动机使其运动,在半自动机上便可以拓展更多的方块了。

利用更新可以将半自动机当做拓展模块使用,而拓展模块之间的环状关系可以构成环状引擎,那么如下图的半自动机环状引擎就是利用两个半自动机互相更新制成的。这个引擎的周期是15gt,启动时需要更新前侧半自动机的粘性活塞或普通活塞,因为在当前的BUD态下其落后于后侧的半自动机一格。下面我们来分析这一过程。

更新下侧半自动机普通活塞,其后推出,推动下侧粘性活塞和后面的更新装置,在推出时上侧粘性活塞受到更新,因此下侧普通活塞和上侧粘性活塞同时伸出并收回,这需要6gt。半自动机不能更新自己,下侧半自动机就此陷入BUD态。随后上侧普通活塞用3gt推出,伸出结束后白色玻璃便会更新到下侧粘性活塞。在上侧普通活塞收回,上侧粘性活塞陷入BUD态的同时,下侧粘性活塞伸出并收回,在这6gt过后,引擎回到了最初的样子,总计15gt。

同样的道理可以拓展至4个半自动机互相更新,四个半自动机构成互相更新的环,上图便是一例,其中右图和左图分别是前后剖面图。

从左侧可以更清晰地看出四个半自动机互相更新的依赖关系。

通用引擎的反向

通用引擎是一种很通用的标准红石引擎,不仅制作简便,其本身的结构就允许其双向飞行,为了让其反向我们只需要在合适的时机阻挡它并给出更新即可。下面介绍一些常用的结构。

这个反向器主体是一个BUD,其附带的一个方块,用于更新红石引擎的观察者。下面我们来分析这个电路的运行情况。

红石引擎向右运动,左侧三个方块作为推模块,而右侧作为拉模块。BUD响应时,恰好是左侧活塞推出完成。由于这一推出是收到了观察者的短脉冲,BUD活塞推出没有启动延迟,和推模块活塞收回都将花费2gt,同时发生的还有拉模块观察者的启动延迟。随后拉模块观察者激活,在这2gt中,拉模块活塞推出,BUD活塞收回。虽然拉模块观察者可以检测到BUD活塞将白色混凝土变为36号方块,但此时拉模块观察者正处于激活状态,无视这一方块变化,2gt后观察者熄灭于NTE事件,BUD活塞收回完成于TE事件,这一次可以更新到拉模块的观察者了。

在拉模块观察者等待启动延迟的过程中,拉模块活塞收回。由于收回和观察者的启动延迟均为2gt,而观察者于NTE事件激活,拉模块活塞在TE事件才能收回完成,其在BE事件时便会发现其已经又被激活了,于是在BE事件转收回为激活。推模块观察者在BE事件开始进入启动延迟,但在下一gt的BE事件就又被推动,因此其不会理睬这次启动延迟,并会在推出完毕后正常进入下一次的启动延迟。

至此,拉模块已经推出完成,两模块的地位已经互换,随后在原先的推模块将拉模块拉走时,BUD会再响应一次,但这次响应不会影响红石引擎的运行。

第二种反向器使用观察者检测飞行器的到来,为清晰见,下面我们用时间轴列表分析装置的运行情况。

推模块 拉模块 右侧观察者 最右侧观察者
NTE观察者激活
BE活塞推出
BE观察者启动延迟
NTE观察者撤销激活
BE活塞收回
BE观察者启动延迟 NTE观察者激活
BE活塞推出
TE活塞收回完成 NTE观察者激活
BE活塞推出
NTE观察者撤销激活
BE活塞收回
BE观察者启动延迟
BE观察者启动延迟
NTE观察者撤销激活
BE活塞收回
NTE观察者激活
BE活塞推出
NTE观察者激活
NTE中继器启动延迟
BE活塞推出 NTE观察者撤销激活
BE活塞收回
BE观察者启动延迟
NTE观察者撤销激活
NTE中继器激活
BE活塞收回 NTE观察者激活
BE活塞推出
NTE中继器撤销激活
TE观察者启动延迟
TE活塞收回完成 NTE观察者撤销激活
BE活塞收回
TE观察者启动延迟
BE观察者启动延迟
NTE观察者激活
BE活塞推出
NTE观察者激活
BE活塞推出
NTE观察者激活
NTE观察者撤销激活
BE活塞收回
NTE观察者撤销激活
BE活塞收回
NTE观察者撤销激活
NTE中继器激活
TE活塞收回完成 TE观察者启动延迟
TE活塞收回完成 TE观察者启动延迟
NTE观察者激活
BE活塞推出

通过这两个反向装置,我们不难理解,反向器的实现关键在于及时激活拉模块的活塞,使其顺推推模块,从而让两个模块地位调换。因此,如下的反向装置也是不难理解的。

这个飞行器在向右运行到普通活塞处时,附加的观察者会激活普通活塞,进而更新到拉模块的观察者,使其立即激活,从而改变飞行方向。

在之前提到的8方块通用飞行器的基础上,我们可以增加一个利用活板门更新自己的装置。在飞行的过程中,观察者总会在活板门被激活的一瞬间被移动,而如果飞行器遇到了障碍物,则观察者无法被移动,活板门产生的更新就可以重新启动拉模块并使其推出了。这样我们并不需要制作反向器,这种撞到墙就会自动反向的飞行器也就是自返回飞行器。

如果希望反向运行到另一面墙也能返回,只需要对称地再增加一个活板门更新装置就好了。

如上的电路装置小巧精干,充分体现出了观察者对于粘液块飞行器的简化。可以说观察者对于多向飞行器的简化是其重要的应用领地之一。

附加模块

下图所示的是三种不同朝向的粘液块BUD。

当粘液块BUD被飞行器推动时,其会响应一次,这就意味着我们制作出了一个每运行一格就推动一次的装置。例如下例的飞行器可以在向前飞行的同时将右侧的一列方块向右推动一格。在这里,BUD和更新半自动机的普通活塞共用了粘液块和红石块。

即使不使用BUD,也可以单纯地使用活塞间的逻辑完成这一功能。飞行器向前移动一格,粘性活塞无法被粘动,但其会收回。收回后普通活塞会被激活,其将粘性活塞向前推出,推出完成后粘性活塞又回到了同现在相同的相对位置关系,因而再次伸出。

当然,使用观察者直接激活普通活塞是最简单的。

用观察者激活粘性活塞,其会将方块推出而不收回,再次激活才可以将方块收回。如果粘性活塞推出的方块是观察者的话,就可以实现每两次输入给出一次输出的装置,与飞行器搭配,就可以做出每两格推一次方块的飞行器了。

第三节 活塞更新次序理论

红石更新延迟理论提出,NTE元件优先级高者先激活,而优先级相等者先被更新先激活,红石更新延迟理论很好地揭示了同一gt内NTE元件的运行先后规律。同样地,活塞更新次序理论将揭示活塞推动若干方块的次序先后规律。也只有在这里我们可以最终解释早在《基础红石原理》就已经提到的,判别粘液块装置作为BUD或伸出收回如此往复持续的经验规律。

活塞的更新规律

在红石更新延迟理论中,我们已经认识到,活塞在激活时会进入启动延迟,在BE事件启动,此时活塞需要检测自身的状态,在允许推出时开始推出。活塞的推出过程实际是一个将方块依次变为36号方块的过程,这一过程依赖一个列表,而列表是有序的,所以我们可以对其的顺序进行研究。按照顺序,要被移动的方块首先被移除,这一过程给予毗邻方块更新。随后每一个36号方块将会被放置在所有要被移动的方块的运动趋势位上,这一过程产生方块变化。活塞在最后产生活塞臂。36号方块表现为移动中的方块,但这是游戏渲染产生的效果,在理论分析中我们忽略这一过程。在2gt后的TE事件,36号方块将自身变为对应的方块,这一过程产生方块更新和方块变化。(方块变化有待考究)

活塞收回的过程和推出的过程是类似的,但活塞臂必须先收回,否则其他方块无法在活塞臂的位置创建36号方块。

当活塞在激活过程中遇到信号下降沿,此时活塞必须收回,但前方方块全为36号方块,活塞一个也不会将其拉回。比较特殊的是活塞面前的方块,活塞会将它在BE事件到位,但也不会收回。(活塞在收回过程中遇到上升沿呢)

在以上运动过程中,并没有提到活塞自检,事实上活塞不会单独地对自己进行检查,自检发生在活塞接收到方块更新信号时,而活塞本身的推出,周围方块的变化都会产生方块更新。例如活塞伸出收回往复持续的过程,就是活塞面前的方块从36号方块变为普通方块时给予方块更新,使得活塞再次推出的。

活塞推动方块和红石线的更新不同,活塞推动方块有一个客观存在的列表,因此这一过程有着严格的规律性,我们因此可以得出活塞推动次序的规律,换言之:

活塞推动方块的次序不仅具有时间平移对称性,也具有空间平移对称性。

换句话说,活塞的行为随时间稳定,也随空间稳定,只要活塞的装置不被旋转。此外,即使对于不同的活塞朝向,活塞的规律也是类似的,可以分类讨论。

除了中继器等NTE元件和活塞外,36号方块也遵循“先被更新先激活”的规律,在这里是指:

先被推动的36号方块先到位。

活塞更新的次序规律

有关活塞在运动前后更新规律已经叙述详尽了,下面针对研究活塞推动的列表进行分析,这主要包括活塞推方块的更新规律和粘液块粘动方块的更新规律。关于前者,其必须遵循一条基本原则,那就是不能在已有方块的位置创建36号方块。因此,当活塞推动一列方块时,总是最远端的方块先更新。并且,如要使一列方块发生移动,每个方块移动前,总是先移动其趋势位的方块。这一点对于粘液块粘动后方的方块也是一样的,就好像方块不是被粘液块从后方粘动的,而是被活塞从反方向推出的。换句话说,活塞推动一列方块和粘液块从后方粘动一列方块个次序规律是相同的

例 分析如下的电路,判断活塞伸出后两组活塞的伸出情况。

由于活塞推出时总是最远端的方块先更新,因而远端的红石块先到位,所以总有远端的活塞伸出而近端的活塞无法伸出。

例 分析如下的电路,判断拉杆拉下后活塞组的伸出情况。

中继器是严格的NTE元件,根据红石更新延迟理论,其总遵循先被更新先激活的原理,因此第一列中继器中远端先更新。但是远端中继器延迟较长,所以第二列中继器激活时是近端先激活,因而第三列中继器也是近端先激活,近端活塞伸出而远端无法伸出。

如上两例中的研究方法可以扩展到粘液块的研究领域中,如下图便可得出粘液块粘动方块的更新规律。和红石线不同的是,当面朝北方时,下图的活塞组总是右侧伸出而左侧无法伸出,没有随机性。

对于研究更复杂的粘液块结构来说,使用红石块多有不便,这里给出一种思路:使用BUD态的伸出粘性活塞。

当粘液块结构被移动时,两个粘性活塞被更新,更新顺序取决于粘液块被移动的顺序,因此它们收回红石块的先后顺序也是严格的,中继器又时严格的NTE元件,结果就是粘液块结构的更新顺序被忠实地反映在了活塞组上。

例 拉杆拉回,判断活塞组的推出情况

由于每个方块移动前,总是先移动其趋势位的方块,因此一定是活塞臂先收回,粘液块再从远到近地依次被移动,此时近端先更新,因此近端活塞伸出而远端无法伸出。

虽然中继器是严格的NTE元件,但不同档数,不同指向情况的中继器有着不同的优先级,因此使用中继器将信号导出,用延长活塞组的方法有时更为便利。

当然,使用命令方块是最简单的。

将完全相同的装置旋转,在不同朝向下进行实验,便可以得到在完全对等的位置下,各方向的优先级顺序:

东>西>南>北>上>下

这一规律可以被归入东南法则。

下面作如下约定,在不作特殊说明的情况下,水平方向的活塞总是朝北推出的(或朝东),这样右手方向优先于左手方向。当活塞朝竖直方向推动,默认前方为北方。

读者或许会认为右侧总是优先于左侧,但如下的实验证明这是错误的。

读者或许会认为离活塞越远者越先更新,但这同样也是有适用条件的。

事实是,判断活塞移动方块的更新优先级需要首先考虑最小粘动次数(层数、深度)。活塞仅具有将面前方块向前推的能力,只有粘液块和蜂蜜块拥有将侧面方块粘动的能力,而一个被移动的方块到活塞本身至少经历了几次粘动,就被定义为该方块的最小粘动次数。即有:

最小粘动次数大者先更新,在最小粘动次数相等的情况下考虑东南法则,东南上者先更新,最后,在移动一列方块时,先移动趋势位的方块。

以上便是活塞更新次序理论在推动和拉动时的描述。对编程略有熟悉的读者可能已经能从这个规律中窥探出活塞推动方块的代码实现方式了。

若干推论与例题

例 给出拉杆拉下时,所有粘液块的推动次序。

首先,给出所有方块的最小粘动次数:

1 2 3 2

1 X X 2

1 0 1 2

据此可以给出推动次序:

7 5 1 2

8 X X 3

9 10 6 4

例 再给出上图中所有方块收回时的推动次序

如上的最小粘动次数表依然适用,据此可以给出收回次序:

9 5 1 4

8 X X 3

7 10 6 2

从上例就可以看出,推出和拉回只有在一列方块上有区别,并且是完全的倒序,除此之外都是相同的。

这里发表一些关于为什么我要从实验入手而不是去翻阅代码去研究这一问题,原因有二。其一是我认为实验是发现真理的最合适途径,红石电路之于Minecraft就好比科学之于现实世界,而科学就是以实验为基础的。在实验的过程中可以发现新的事物或事物新的用途,也可以给出事物的研究方法。的确不可否认的是有些知识如果离开源码有些东西或许我们永远也无法搞清真相,但至少这个理论不是。其二是mojang的代码我实在不敢恭维,而实验有助于简化这个过程。翻过代码之后我会首先给你讲一堆活塞如何判断要移哪些方块,再把它们放到Set和List里,判断二者的size以及用一个迭代器遍历,最后形成一个什么什么树,在来一遍后序遍历…我想有很多有创新的火花就埋没在代码里了。当然,如果你是程序员的话或许和你讲后序遍历你可能会觉得我废话更少一点吧。(行了不要为你不会java而找借口了。)

这里给出一条推论:

在粘液块结构上增加或减去方块,如果不改变粘液块结构的拓扑结构,则不影响原先粘液块结构的更新次序。

举例来说,从中间推动三个方块的横条的更新次序是“右左中”,无论在哪里新加一个方块,这三个方块的更新先后顺序仍然是“右>左>中”。但推动3×3方块的粘液块结构和去掉中间一个方块的粘液块结构,推动次序发生了明显的改变。

例 解释为何图左的装置是一个BUD而图右的装置在被更新后会伸出收回往复持续。

分析需要从活塞收回开始,图左的装置需要移动3个方块,红石块的最小粘动次数为1,因而红石块先到位,因此4个方块的更新先后顺序是:红石块>粘性活塞>粘液块>普通方块。其中粘液块到位时会更新活塞,但此时普通方块尚未到位,活塞无法伸出,再次陷入BUD态。去掉普通方块,不影响原先的更新次序,此时活塞可以伸出,从而伸出收回往复持续。

例 判断拉杆拉下后活塞的运动情况

活塞、红石块和右侧的粘液块的最小推动次数为1,这三个方块首先到位,随后中间的一列方块到位,更新处于BUD态的活塞,其会伸出并收回一次。

例 判断拉杆拉下后活塞的运动情况

活塞和红石块最先到位,其后是活塞面前的粘液块到位,此时更新活塞,但活塞无法推出。因此该装置在拉杆拉下后没有特殊的动作。

例 判断拉杆拉下后装置的运行情况

拉杆拉下后,左侧粘性活塞有1的最小粘动次数,其相较右侧粘性活塞先到位,将两个红石块、两个粘液块和右侧粘性活塞一同推出。到位后,右侧粘性活塞先于左侧粘性活塞到位,其将两个粘液块和两个红石块推出,而左侧粘性活塞无法收回它们。但左侧粘性活塞收回的过程会更新到右侧粘性活塞,其将方块瞬推并自行收回。如下为结果图。

例 判断拉杆拉下后装置的运行情况

拉杆拉下后,右侧优先于左侧,右侧粘性活塞先到位,其先推出。随后左侧粘性活塞最小粘动次数最大,再推出,最后是中间粘性活塞推出。如下为结果图。

第四节 信号传输:铁轨电路、树叶电路及脚手架电路

诚然,红石线可以传递红石信号,但可以传递信号的并不止红石线。动力铁轨或激活铁轨的点亮和熄灭可以传递方块更新信号,而BUD和观察者可以响应铁轨的变化,因而铁轨可以传递方块更新信号。树叶使用distance数据值记录数据,而观察者可以响应distance数据值的变化,因此树叶可以传递方块变化,这意味着如果恰当地利用这二者,其可以实现与红石信号的互化和传递红石信号的功能。

铁轨电路

红石线的信号可以传递15格,铁轨信号只能传递9格。这意味着一个信号源最多可以点亮位于同一条线路上的17个铁轨,并且,铁轨和红石线一样,都是瞬时响应输入的变化。但与红石线有着极大不同的是:铁轨并不存在信号强度,其并不使用信号强度作为信号传递的依据。

1-4-1

铁轨会在自身收到方块更新信号时,确认自己是否应处在正确的状态,并只有在需要改变状态时才会产生方块更新信号,这也就造就了如下看似奇怪的例子:

如图,拉杆附着于第九个铁轨下的方块,拉下拉杆后,第九个拉杆已被激活,判断其本身不需要变更状态,也就不会更新到第十个铁轨,这使得第十个铁轨保持未激活的状态,从而陷入BUD态。

1-4-2

1-4-3

制作亮BUD态的铁轨也是简单的,如下的电路在按钮按下后,最右的两个铁轨会陷入BUD态。

1-4-4

1-4-5

这一BUD最早由Defanive发现,发现时间不晚于2012年9月,限于在当时的版本中还未加入激活铁轨,这一类型的BUD被称为动力铁轨BUD。

基于此,Defanive制作了可以无限拓展的自复位动力铁轨BUD,其将活塞BUD的检测范围从活塞本身拓展到了几乎一整串铁轨。以下为该自复位BUD的一个简单模型:

1-4-6

在本例中,白色混凝土上的铁轨都处于BUD态,蓝色混凝土上的铁轨常亮,最右侧的活塞BUD起到复位和上上图中按钮——也就是脉冲发生器的作用。

铁轨在某些场合也可配合观察者一起使用,传输信号,特别地,其也可以并排但又互不干扰地传递信号。

1-4-7

1-4-8

树叶电路

树叶依赖NTE事件改变自己的distance数据值,在这里,distance数据值充当了信号强度的功能,因而树叶不像铁轨那样容易制作出BUD。改变distance数据值的常用方法是通过活塞移动毗邻的原木,延迟是1gt。

树叶distance数据值必须在毗邻的树叶间传递,对角线和断开的树叶均不能传递distance数据值。并且,树叶distance数据值只会被更新为毗邻树叶最小distance数据值加一,因而移除原木后树叶distance数据值的增加和移除信号源后红石线信号强度的衰减有着诸多类似之处。

1-4-9

如图是一个树叶时钟,周期为5gt,占空比40%的时钟。一般的时钟周期都为偶数,这是时钟中较为特殊的类型。

1-4-10

观察者检测到树叶的变化,进而激活,启动延迟2gt,输出2pt NTE-NTE短脉冲,活塞无启动延迟,2pt顺推,原木于BE到位,树叶于1gt后更新自己的distance数据值,总计5gt。5gt后,观察者再次检测到树叶的变化,激活,启动延迟2gt,输出2gt短脉冲,活塞顺推并开始收回,原木于BE变为36号方块,同理,树叶仍为1gt后更新自己的distance值。这是一个周期为5gt的时钟。

若想延长时钟的周期,可以增加观察者的个数,如下图就是一个周期为7gt的时钟。
1-4-11

例 3 简述拉下拉杆后,装置的动作

1-4-12

活塞启动延迟1gt,1gt后原木被变为36号方块,树叶失去原木,开始增加distance数据值。
2gt,右下树叶更新自己的状态,由于左下和右上的树叶distance值为2,右下树叶设置自己的distance数据值为3,更新左下和右上的树叶。3gt,左下和右上的树叶将自己的distance数据值为4,更新左上和右下的树叶。
此时,树叶的状态为

3 4

4 3

由于右上的树叶发生了变化,右观察者进入启动延迟。就在同一gt,活塞推出完成,原木位于左侧。
4gt,左上和右下树叶被更新为5,同时原木使得左下树叶被更新为1,左观察者进入启动延迟。
此时,树叶的状态为

5 4

1 5

5gt,树叶状态为

2 6

1 2

且右观察者开始激活,活塞开始推出。

6gt,树叶全部更新完成,状态为

2 3

1 2

同时,左观察者开始激活。两观察者的延迟差为1gt,这意味着两观察者会将信号合并为3gt的脉冲,上方活塞得以在5-7gt正常推出。8gt,左熄灭,上方活塞在8-10gt正常收回。

试请读者自行分析拉杆拉回时装置的动作和树叶于各游戏刻的状态。

实际应用:灭灯游戏

1-4-13

灭灯游戏是一种益智游戏,当一个灯的按钮被按下,待电路稳定后,其本身和相邻的四个灯的状态会翻转,即从亮变为灭,从灭变为亮。如下图就是最中央的按钮被按下后的情况。

1-4-14

游戏的胜利条件在于将给定初始条件的灯形经过一系列的翻转,使之全灭。

1-4-15

下面我们将介绍PeterjiangTW基于树叶电路所制作的灭灯游戏。

为了用红石电路实现这一游戏,我们首先来分析电路的实现方式。

最首先注意到的是,虽然按钮被放置在红石灯上,但红石灯的亮灭并不直接受按钮的控制,按钮只提供脉冲,红石灯的亮灭则要由一个T触发器控制。如下图就是一个对电路的实现。

1-4-16

但是电路的难点在于如何让四周的四个红石灯也发生变化,这意味着每个红石灯单元的信号必须传递到周围四个单元去,并且只能传递到这四个单元,每个单元也只能接收周围四个单元的信号。

PeterjiangTW的设计巧妙地利用了树叶来传递信号,由于树叶的distance数据值最大为7,这就限制了信号只能被传递到周围的四格。上图电路只包含了核心的翻转电路,因为本节的内容旨在学习树叶电路的应用形式,复位电路的设计请读者作为附加内容自行学习。

1-4-17

在灭灯游戏电路中,每一个红石灯都对应一个电路单元,树叶将这些单元全部连起来,但限于树叶的传输能力有限,其只能将信号传输到四周的四个单元,按钮按下时只需要基于树叶系统一个信号即可。下面我们进行单个单元的设计。

1-4-18

按钮按下后会自行弹回,活塞也会相应伸出并收回,我们要求这两个边沿只会产生一次翻转,如下图的电路可以解决这一问题。观察者检测树叶变化,按钮两个边沿会转变为观察者的两个脉冲,右下的粘性活塞会顺推观察者并收回,这意味着上方的粘性活塞只会伸出收回一次。

1-4-19

应用比较器可以隔着一个实体方块检测其后容器的容量的性质,通过粘性活塞控制这一个实体方块,可以将T触发器的输出接到红石灯上。

1-4-20

余下内容的电路请读者自行学习和实践。

脚手架电路

脚手架的bottom数据值用于指示脚手架下方的方块能否支撑脚手架,一般而言,只有上表面完整的方块才能支撑脚手架,灵魂沙、伸出的活塞、活塞臂、打开的活板门是不能支撑脚手架的。

脚手架拥有和树叶类似的distance数据值,但这个数据值只能累计横向拓展距离,这个值最大是6,例如下图中的橙色玻璃位置不能再放置脚手架了。如果尝试在distance数据值为7的位置放置脚手架,脚手架会将自己变为掉落沙实体向下掉落,如果脚手架发现自身的数据值被更新为7,脚手架会被破坏。

和树叶类似地,脚手架更新自己的distance值依赖四周和下方的脚手架,延迟也为1gt,我们可以尝试将树叶电路中类似的结构套用在脚手架电路中。

与树叶时钟类似地,这是一个脚手架时钟,基于类似的原理,这个时钟的周期也为5gt,占空比也为40%。

除了使用活塞移动脚手架下的方块外,活板门也可以用于配合脚手架使用。如上图便是一个3gt中继器。

垂直信号传输

我们曾在《基础红石原理》中介绍过一种竖直信号的传递——半砖上传,但是其只能将信号向上传输。现在,我们对于垂直信号传递有了更加丰富的实现方式,而在这一点中,粘液块和观察者功不可没。

1-4-21

下面介绍一种不太常用的信号传输方式——气泡柱。

气泡柱于1.13被引入游戏,其会在灵魂沙或岩浆块上的水源产生。气泡柱是一个方块,因此气泡柱和水源之间的转换可以由观察者检测到。

1-4-22

通过活塞移动灵魂沙,可以在竖直方向上产生或消除气泡柱,从而在竖直方向上传递信号。气泡柱的产生和消除依赖流体的NTE事件,无论气泡柱的长度,产生气泡柱需要20gt,消除气泡柱是瞬时的。

1-4-23

气泡柱是一种只能向上不能向下的信号传递方式,但其延迟不随高度差而变化。脚手架也可以被用来传递竖直传递信号,同样只能由下到上。


article_txt
目录