目前不接受任何形式的转载
Principles of redstone circuits
红石电路是Minecraft中特有的电路系统,其在某些方面表现出与现实电路的一致性,例如红石中继器与二极管相似、红石火把与非门相似等;但它同样具有独特之处,例如活塞与投掷器等难以类比到现实中的红石元件,且对布线的较高要求等,正是这些独特之处,铸就了红石电路的魅力,让许多玩家走上了红石研究的道路,并开发出许多优秀的红石作品。
开设本专栏,目的是帮助对Minecraft有一定了解,但又没有任何红石基础的玩家能够明白各种红石元件的基本性质并建造一些基本的红石电路,同时考虑到Minecraft Wiki中的内容并非特别适合新手入门,并且关于红石元件性质的覆盖并不全面和具体。进阶的内容不会在本文集中涉及,但它们会被我写在其他的文集中,当您遇到一些您无法理解的红石现象或者希望学习这些内容提升红石水平时,可以去查阅它们,当我认为讲完某一部分的基础内容后您已经可以去了解某些进阶内容时,我会在文末附上相应的链接。
请注意,本文编写使用的版本为Java 1.16.4,请放心,后续的版本变动对红石电路的影响应该不会很大,版本的变动更大的可能只是增加红石元件,而不会影响现有的红石元件及其机制。如果你使用手机或使用Win 10版进行游戏(即基岩版),那么十分抱歉,由于Java版与基岩版的红石电路系统存在巨大差距,本文对您学习红石电路没有任何帮助,甚至会对您的红石水平产生负面影响。
红石电路(Redstone Circuit):由红石元件组成的,能实现某一特定功能的Minecraft电路系统。
游戏刻(Game Tick,gt):如果您对编程有过了解,那您就能明白游戏在代码层面是由主循环构成的,Minecraft也不例外,它的一个循环被称为游戏刻,在每个游戏刻中,Minecraft都要经历相同的处理流程,并且这些处理流程是按照确定顺序进行的,例如:处理计划刻(NTE)事件,处理Block Event(BE)事件,处理Tile Entity(TE)事件,接收玩家信息(NU)。显然,红石电路也必须要遵循游戏刻的原则,一般而言,红石电路的最小时间单位即为一个游戏刻。
在此处需要消除一个常见的误区:游戏刻并非红石电路的普朗克时间,单纯认为讨论1gt以内的红石电路的性质是无意义的观点是错误的,正如上段所描述,一个游戏刻中也有不同的阶段划分,它们会对实际的红石电路造成影响,并且这些阶段的先后顺序实际上是可被红石电路利用的,这些内容将会在进阶的教程中详细介绍。
此外,标准的游戏刻的时间长度为0.05s,这并不会因为您的电脑性能而改变,但如果您的电脑性能太差以至于处理器无法在1s内完成20次游戏刻循环,那么Minecraft会被迫增加每个游戏刻的时间长度。
我们一般习惯使用gt描述游戏刻,在本文集中也是如此。
红石刻(Redstone Tick,rt):1红石刻=2游戏刻=无卡顿的Minecraft运行0.1s,Minecraft中的绝大多数红石元件的运行延迟是游戏刻的偶数倍,所以红石刻对于延迟计算和玩家沟通来说比较方便,但是在某些精确控制延迟的电路中,使用游戏刻描述更方便和准确。
我们一般习惯于使用t而不是rt描述红石刻,在本文集中也是如此。
需要指出的是,在红石电路中,1刻通常表示1红石刻,但在Mod中,1刻表示1游戏刻。
TPS(Tick Per Second):每秒运行的游戏刻数,游戏正常运行时的TPS应为20,TPS的改变会相应地影响Minecraft本身的运行速度,如果您需要仔细慢放观察一个红石电路的运行过程,或是加快一个运行速度极慢的红石电路,那么可以尝试Carpet Mod,通过 /tick rate [tps数值] 命令以调整游戏运行的速度,或者通过 /tick freeze 命令冻结游戏(玩家仍可正常运动),并且该Mod自身不会影响红石电路的运行机制。
更新(Update):在此处,我们只对更新的定义及其功能进行最基本的描述,它实际上有较为复杂的机制,这属于进阶的内容,并不适合新手了解。
您是否思考过这样的问题:为什么放下了一桶水之后,水会向低处流动或在平地分散开,在箱子的旁边再放一个箱子,就会形成一个大箱子?理解这些现象形成的原因与理解红石电路工作的机制同等重要。
显然,在您的思维中应该首先出现这样一种处理方法:每个游戏刻检测所有方块的状态,如果发现需要动作的方块,如水的流动和箱子的合并,则对其进行相应的操作。但实际上这样的操作对于Minecraft的三维世界来说,需要消耗的算力过于庞大,以至于现代的处理器难以承担,并且接下来的内容也会说明这种全局检测的方法毫无必要。
如果您再思考上述的方法,您就会发现大量的算力被用在了毫无意义的检测上,因为Minecraft中绝大多数方块都不需要在每个游戏刻动作,其实,在Minecraft本身的运行机制中可以抽象出如下的规律:在大多数时候,只有自身状态改变的方块及其周围的方块需要动作,导致该方块自身状态改变的原因可能是玩家的操作或是它附近方块状态的改变。因此,游戏只需要检测发生状态改变的方块及其周围的方块,如果发现周围方块的状态也需要发生改变,则按照相同的规律检测下去,这就是更新的机制。下面通过一个例子向您阐明这一结论:
在自然生成的浮空沙的相邻位置插上一支火把,那么浮空沙将会落下,这是因为插下的火把会更新它周围的方块,浮空的沙子开始检测它自身的状态,它发现它处于悬空状态,于是在2gt后开始下落的动作,同时它自身的状态发生改变,因此也会更新周围的方块,如果它的周围也有浮空沙,那么周围被更新的浮空沙也会开始下落并更新更大范围的浮空沙,以此循环下去,直到被更新到的浮空沙都落下。
绝大多数情况下,方块更新的范围只有它附近直接相邻的六个方块,因为在Minecraft中,您难以发现有什么方块状态发生改变后,会影响到其他不与其直接相邻的方块。但在红石电路中,这种特例比较多,即部分红石元件的更新范围会比一般情况大,在介绍具体的红石元件时,我们会将其列出并指出这样做的必要性以及导致的问题。
实际上,更新的类型并非只有一种,不同类型的更新对红石电路的影响也不尽相同,本文集只会在必要时进行简单区分,在学完基础内容我会附上相应教程供您详细了解。
红石元件:在红石电路中具有功能性目的的方块或实体,按照功能可以分为三类,即红石源、传输元件和机械元件。
类似于现实中的电源,红石源为红石电路提供“电能”,通过“导线”连接至“用电器”,使后者能够正常工作。在红石电路中,“导线”和“用电器”就分别对应着传输元件和机械元件。
红石信号:红石信号类似于上段中提及的“电能”,它由红石源提供,但与现实中不同的是,红石信号不会消耗能量,如同火把一样,红石源提供的红石信号永远不会消失或衰减。
同样的类比,不难理解传输元件的功能是传递红石信号,而机械元件则是一类接收到红石信号会做出特定反应的红石元件。
红石信号强度:红石信号强度类似于电流强度,但它的取值一般只能是0至15的整数(特殊情况会在之后讲到),几乎所有机械元件受到任意强度的红石信号后都会做出一致的反应(即它本身做出的反应不会因为红石信号的强度而改变,只会因为红石信号的有无而改变),这一点与下文的充能性质表现出一致性。
充能:红石信号作用的实体方块会被充能,被充能的方块会激活它六个面上直接相邻的机械元件,红石信号作用在方块上的规则与红石元件本身的性质有关,在介绍具体的红石元件时会详细解释。充能分为强充能和弱充能,强充能在激活机械元件的基础上,还能激活红石线。
新手在认识充能时通常会陷入一些常见误区,在此处列举部分:
充能的对象是方块,并且是实体方块,换言之,非实体方块不能被充能。一般来说,碰撞箱完整的方块实体方块,但也有不少例外,特别地,玻璃、信标、移动中的活塞、未伸出的活塞、红石块、侦测器不是实体方块;灵魂沙是实体方块。在其中,您需要记住玻璃、活塞、红石块、侦测器不是实体方块,这些性质在红石电路中经常会被用到。
区分充能与激活的关系。激活的对象是红石元件,当描述一个红石元件被激活时,可能是一个红石源被玩家操作而开始工作并发出红石信号,也可能是一个机械元件因为它与一个充能方块相邻而被激活,做出相应动作。而充能的对象是实体方块,当然,实体方块中也包含部分红石元件,如投掷器和发射器,当它们被充能的同时,也会相应地被激活,这是因为它们直接被红石信号作用,而倘若一个充能方块不是红石原件而只是一个单纯的实体方块时,它本身的外在表现不会因为充能而表现出不同,唯一的区别只是它能够激活周围的机械元件而已。
这部分文字中没有描述使方块被充能的方法(即没有详细描述红石信号作用的具体实例),因为其内容相对较多且复杂,但您需要明白,不只是红石源能充能方块,传输元件传输红石信号的具体体现便是它们也能够充能方块。
强充能和弱充能都是充能,它们都能激活机械元件,并且激活的形式不会有任何的区别,它们之间的唯一区别只是前者能激活红石线。
充能在Minecraft的代码中并不存在,它只是一种红石玩家发现的可以准确描述红石电路状态的概念而已。红石电路工作的本质是上文所讲的更新,例如一个被激活的红石源,会更新它周围的方块,如果附近有一个机械元件满足被激活的条件而且被更新到,那么它就会做出反应。在很多时候,一个红石源或传输元件可能要间隔一个方块来激活机械元件,这也就是一些红石元件的更新范围不限于它相邻的六个方块的原因。
QC充能(Quasi-connectivity) :QC充能是Java版独有的一种特殊充能方式,它直观地表现为部分机械元件上方的一个方块相邻位置有充能方块的话,那么这些机械元件也会被激活,QC充能的运用十分广泛,可以用来制作方块更新感应器(BUD,Block Update Detector)和其他常见结构,由于QC充能的更新作用和充能原理较为复杂,故在本章不详细介绍。
充能等级:不难理解,被充能的方块需要有红石信号作用,而红石信号具有强度,反应到充能中,便有了充能等级,被多少强度的红石信号作用的实体方块,就具有多少等级的充能。充能等级一般不会影响机械元件的工作效果。您也可以用充能强度代替它,它们都能被红石玩家理解。
特别地指出,红石信号等级和充能强度虽然不会影响绝大多数机械元件的效果,但它对红石线和红石比较器有十分重要的作用。大部分时候,您只需要考虑红石信号的有无,而在大量使用红石线和红石比较器的电路中,需要对红石信号强度的具体数值进行考虑。
红石脉冲:一个较短的红石信号从无到有再到无或从有到无在到有的过程,前者称为正脉冲,后者称为负脉冲,产生红石脉冲的电路称为脉冲发生器,脉冲发生器在红石电路中具备十分重要的作用,稍微复杂的处理流程都需要使用到脉冲发生器,它们将会在一个独立的章节中被详细讲解。
上边沿与下边沿:上边沿是指红石信号从无到有的瞬间,下边沿是指红石信号从有到无的瞬间,上边沿与下边沿统称为双边沿。这是从现实中引入的概念,但在Minecraft中也十分重要,边沿信号的处理和边沿的思想,在红石电路中能取到很大的作用。边沿也可以叫做边缘。
延迟(Latency):延迟是电路中一个十分重要的概念,在Minecraft这点更为重要。如果您使用过科学计算器进行一些复杂的超越函数运算,您会发现它需要零点几毫秒的时间才能显示结果,这是因为超越函数通常需要转化为较多代数函数运算,因此,电信号在门电路或寄存器之间需要经过较长时间的周转,因此会产生较大的延迟。在Minecraft中,绝大多红石数元件都有延迟,并且与现实相比,Minecraft中的延迟高的可怕,正如前面讲到的红石刻,绝大多数元件的延迟都以红石刻为基准单位,而一个红石刻对应0.1s,因此,大型的红石电路会在Minecraft中产生庞大的延迟,这对于交互性强的电路来说并非好事 。
延迟并非全部是坏处,利用延迟可以实现复杂的电路逻辑或是简化电路结构,熟练的红石玩家,应该能够精确计算延迟,并尽量规避延迟的坏处,利用延迟的优势。
实际上,通过对部分红石元件特殊性质的利用,可以实现无延迟电路,其中运用最广泛的便是0t电路,无延迟电路的设计往往更为复杂,因为需要操作游戏刻级别的优先级,所以远没有一般电路直观,并且体积也十分庞大。
红石电路的分类:
实际上,红石电路在Minecraft中的运用十分广泛,其被划分为较多不同的分支,并且不同的分支构建红石电路的思维和红石电路的结构存在十分庞大的差别。如果您希望能深入学习红石电路,那么我建议您选择一到两个分支发展,并且最好是一个最喜欢的分支,因为每个分支都具有相当的深度。
机械电路(简称械电):利用活塞和粘性活塞进行方块的移动,进而实现一些机械功能。
械电的首要实例便是活塞门,关于活塞门的定义不需要详细解释,通过下面的图片及视频链接您可以直观地理解。活塞门可分为高压活塞门和高速活塞门。高压活塞门追求最小的体积,而不考虑运行的速度;相对地,高速活塞门追求最快的速度,而在此基础上尽可能的压缩体积。此外,活塞门还有传统活塞门与观察者活塞门的分类。传统活塞门表示没有使用观察者的活塞门,因为观察者的使用会使得械电到达一个无比简单的地步,显然一个使用观察者的高压活塞门和一个传统高压活塞门没有任何比较意义。活塞门也有很多种类,它们会在一个独立的章节中被介绍。
当然,械电不只是做活塞门,它还有其他很多方面的运用,例如活塞递归,0t电路等。
有关与械电的一个常见误区便是将械电代入实际生存中考量,实际上,几乎所有械电都不是为生存打造的,对材料和生存实用的考量在械电中是在最末尾的位置或者完全不考虑。械电的比拼在于实现最小的体积或是最快的速度,而不是它在生存里有多好用。
数字电路(简称数电):用红石信号的有无代表1和0,来处理二进制信号。您对二进制的直观印象便是1和0,1表示有,0表示无,红石信号便满足了这一点,因此,它可以代表二进制信号,同时,Minecraft中的红石元件可以很好地实现现实中逻辑器件的功能,因此,在Minecraft中实现现实的数字电路成为了可能。
实际上,不只是数字电路,其他红石电路的分支也会使用到数字逻辑的思想,很多时候,利用数字电路中的门电路和触发器可以很好地实现一些特定的功能,它们也会在一个独立的章节中被详细介绍。
数电的覆盖范围十分广泛,您可以尝试在Minecraft中制造一个能够进行四则运算的计算器,并把最终结果显示在显示器上,更进一步,您可以制作一个能够运算超越函数甚至是所有初等函数的运算器。或者说,您对计算机敢兴趣,红石电路对于触发器的优秀契合,使得ROM,RAM等的制造都较为简单,通过制作一个ALU,编写简单的指令集或者使用现有的指令集,实现一个简单的CPU也并非难事。
由于Minecraft以方块为单位,所以实现大规模的数字电路,布线会成为很高的要求。数电中的布线主要分为三类,即横式布线、竖式布线和斜式布线,它们分别被称为横教,竖教和斜教。三者各有其优缺点,此处不一一列举。
模拟电路(简称模红):利用红石信号强度表示模拟信号进行运算。模拟电路可分为强信号强度模拟电路(处理的红石信号强度大于15,简称强模)和弱信号强度模拟电路(处理的红石信号强度小于等于15,简称弱模)。
实际上,模拟红石电路在现实中并不存在其对应物,因为现实中的模拟信号是连续的,而红石信号强度必然是整数,其分布式离散的。但是与数电相比,模红处理的信号却有一点“连续性”(即使是弱模,它也能处理0-15共16种红石信号强度,相比之下,数电只处理两种信号强度),在加上模红的思维模式和布线方法与其他电路存在较大区别,所以使用与数电相对的模红来作为这一电路种类的名称。
一般地,通过常规方法只能产生强度最大为15的红石信号,但是通过强制堆叠不可堆叠物品或使用指令,可以产生强度超过15的红石信号(也称为强模信号),但是除去它本身产生条件困难以外,它在红石电路中的存储和处理也需要更为苛刻的条件,关于这一点,会在介绍红石比较器详细介绍。当然,强模的优势是十分巨大的,强模信号的最大值是INT_MAX=2^31-1,这意味着强模能够处理的信号数量远比弱模多,相应地,一些复杂的进位或编码问题能够被轻松解决。
模红的优势在于它能够将体积压缩到十分可观的地步,同时能够很巧妙地将一些复杂的逻辑结构进行大幅的简化,但总的来说,它的直观性并没有其他电路强,入门成本会更高一些。目前,只研究模红的人数较少,但在其他电路中模红的结构和思路还是比较常见的。
生存电路(简称生电):利用红石电路建设利于生存的设施,实现某些重复劳动的自动或半自动化。
生电的唯一应用场景便是生存环境,因此,它的设计理念应该尽可能满足单人生存或服务器生存的需求。例如,电路应该更多地考虑减小对计算资源的占用,从而避免影响玩家的生存体验和电路的实际效率;电路应该具有一定的鲁棒性,即在意外卡顿或退出、玩家意外操作时不会影响电路本身的工作;对于一些前中期生存需要使用到的电路,应该尽可能的减少耗材和工作量等。
生电需要玩家对Minecraft本身的工作机制有充分的了解,因为许多自动化的机械都需要使用这些机制,在本文中不会深度讨论这些内容,您可以前往Minecraft Wiki查阅。
如同字面上的意义,全自动说明一个机器即使在玩家在进行其他活动,只要机器在游戏的加载范围内,那么机器就会一直工作并生产产品,可能某些机器还需要定时补充原材料,此时现实中的玩家可以将游戏放入后台并进行其他任务;而半自动机器则需要玩家的参与,但是此时的玩家只需要挂机进行重复的操作,例如长按右键或者左键连点,此时必须保持当前的窗口为Minecraft,玩家可以离开电脑,但不能对电脑进行其他操作。
例如,一个半自动钓鱼机,需要玩家手持鱼竿,对着机器长按右键(可以通过用物品压住鼠标右键实现),此时游戏内玩家钓到鱼后不必进行任何操作即可自动收钩,实现了资源获取的半自动化,但现实的玩家必须让Minecraft为当前窗口,否则无法对机器右键,实现半自动钓鱼的效果。
红石电路的一般设计思路:本小节主要面向新手玩家,首次面对一个较大的体系可能会无从下手,故给出设计思路,希望可以实现启蒙的效果。
提出功能,并思考功能是否能在Minecraft中实现,如果能够实现,思考具体的实现方法。例如:在Minecraft中制造一个全自动刷石机,那么第一步肯定是制造石头或圆石,随后在把这些石头或圆石摧毁成掉落物,并通过收集装置送到容器中,并且由于需要全自动,这些步骤都不能有玩家的参与。首先,水和岩浆流的混合能产生石头或圆石,并且通过活塞机械将它们移出原本位置后,新的石头或圆石能够生成,这便满足了第一步的要求;随后,需要把这些被移出的石头或圆石摧毁,可以借助TNT或凋灵来摧毁它们,并且前者可以使用全自动TNT复制器,后者可以建造凋零笼困住凋灵,并借助凋零破坏方块但不摧毁掉落物的性质获得掉落物,至此,第二步的全自动也实现了;最后只需要在掉落物的下方铺上漏斗或利用水流即可做到全自动收集了。因此,在Minecraft中制造全自动刷石机是完全可行的。
提出并尝试优化电路架构确认可行后,应该思考红石电路的架设方法。继续沿用上段的例子:应该如何摆放岩浆源和水源的位置让他们能在流动过程中相遇生成方块,而不会使得岩浆源或水源方块本身被破坏,活塞机械应该如何摆放和工作,才既不会阻挡岩浆和水的相遇,又能把生成的方块移出;TNT复制器或凋零笼应该如何摆放和设计,才能够摧毁被移出的方块,而又不会破坏其他电路,对于TNT复制器的方法,还应该尽可能地减小TNT爆炸连同摧毁方块掉落物的概率;最后,收集装置如何设计能减小卡顿,如果刷石的效率过高,是否需要增加收集装置的效率等。很多时候,首次提出的架构是存在问题的,可能需要更换实现方法或者采用其他架构,对于能够正常工作的架构,应该尝试优化它,可以尝试减小体积或运行时间、计算资源占用等。
布线在上一步中,您只是在脑海中或游戏中把大致的实现方案实现了,那么,是时候用红石电路真正实现您想要的功能了。继续沿用上段的例子,您应该设计一个检测装置,当发现石头或圆石生成后,激活活塞机械把它们推出;或者设计一个时钟电路,每过确定的时间间隔就把它们推出,当然,这个时间间隔应该大于或等于生成圆石或石头所需要的时间;您可能需要在检测到推出的石头或圆石的数量达到一定程度时,激活TNT复制机,或者同样使用时钟电路。总之,这涉及到具体的布线操作,对于初学的玩家来说,不宜过深讲解。
调试设计红石电路很容易忽略一些难以被发现的问题,即使是红石大佬也难以避免,因此在布线过程中或布线完毕后应该调试检验需要实现的功能是否正确。
*关于设计红石电路的一些有用的工具:
WorldEdit 它可以以模组的形式装入客户端或以插件的形式装入服务端,是一个世界内编辑工具,同时也能以文件的形式保存和加载结构,相比于结构方块或命令,它具有非常大的优势,可以很轻松实现电路的各种编辑操作,并且上手十分简单,您可以花上几分钟的时间学习基本编辑指令并装上插件使用,它的效果绝不会让您失望。您还可以安装WorldEdit CUI以获得界面效果。
Carpet Mod 这是一个Fabric模组,它提供了十分强大的红石功能,例如修改TPS,暂停游戏(玩家可以移动,但红石电路和其他事件保持当前状态),以游戏刻为单位步进,创造穿墙等操作,此外,它还提供了一系列的生电指令供使用,在调试时能起到很大的帮助。
Litematica 也叫投影模组,如同他的名字,Litematica允许玩家将结构投影到世界中,也能将选择的结构保存为投影文件,并且允许在游戏内对投影进行编辑修改,是一款优秀的地图编辑工具,此外,它还能在生存中使用。
G4meSpeed Mod 这是一款修复活塞运动动画的Mod,由国外械电大佬G4me4u制作,它修复了活塞运动过程中的消失或是动作异常的情况。
Replay Mod 这主要用于录制您的红石作品或其他作品,如果您看过一些制作优秀的红石视频,并且好奇它们是如何剪辑的,那么不妨尝试Replay Mod,它能优秀地满足制作一个炫酷的红石视频的需要,一般地,我们习惯于把这类视频称为Showcase。