Minecraft红石数电设计及改进方案

2020-02-02 06:46龚汉伯
电子技术与软件工程 2020年15期
关键词:红石中继器矿车

龚汉伯

(宁波财经学院数字技术与工程学院 浙江省宁波市 315175)

1 引言

传统的课堂数电教学大都枯燥无味,因此有些地区开始尝试将游戏与教学结合来提升教学质量,Minecraft 因其开放性强,知名度高,受众面广被成功选中[1-2]。游戏中的红石设定与现实中的数字电路特性相似,可通过红石元件和红石特性产生强弱不同的红石信号,实现延时、比较、放大等功能,因此现实电路移植进游戏成为可能[3-4]。

游戏中的物品特性与现实不同,移植需要适当转化,但游戏物品繁多,初学者很难快速掌握。本文试提炼了部分红石与指令在数电设计中的用法和技巧,用于启发初学者快速入门红石数电设计。

2 电路设计前的准备工作

2.1 游戏带来的额外问题

游戏中的环境与现实相近,有昼夜交替、天气变换、山川河流等。昼夜交替会引起光线强度变化,这导致用到阳光探测器的电路输出的红石信号不稳定。白天的强光让红石线、萤石灯、红石火把等器件的光效不明显,这让红石线和用萤石灯组成的点阵显示器或数码管的故障很难被发现。天气变化会降低能见度。山川河流限制了电路搭建的场地,且草绿色也会降低光效观感。

2.2 解决方法

电路搭建选用中国版Minecraft 版本号为1.13.2 或更高的Java版。创建地图时选择创造模式、超平坦地形和作弊可解决地形问题并为指令提供方便。按T 键或/键打开对话框,键入/gamerule doDaylightCycle false 后按回车键可关闭昼夜交替。同理/time set midnight 将时间设为午夜可增强光效观感。/weather clear 999999将天气改为晴天可消除雨天的视线阻碍。/fill~~10~~50~10~100 minecraft:sandstone 将在天空创建一块长50 宽100 的沙石块电路基板,地形不再是限制且颜色更美观。注意指令参数间用空格分离。

为了获取更多游戏中的信息方便后续设计,可按F3 键打开调试信息。若信息中无坐标数据,可按下ESC 键进入选项中的聊天设置,关闭简化调试信息。

3 基础电路

在数电中,逻辑门电路是最基础的电路之一,它是大型集成电路的最小单位,作用是判断输入信号是否满足条件,满足就通过,不满足则截止。游戏中可利用物品特性搭建逻辑门电路和其它基础电路。

3.1 非门

图1:第一种非门

图2:第二种非门

图3:二输入与门

图4:三输入与门

图5:二输入或门

第一种,当红石火把所插方块被充能时火把熄灭,利用此性质使输入输出相反,如图1所示。第二种,需要阳光探测器、红石比较器和红石中继器。由于在午夜,阳光探测器需要右键切换至反向模式,此时探测器的输出强度只有11,如图2所示。红石比较器有比较和减法模式,这里使用比较模式。比较器三角指向的前端为输出端,后方和两侧为输入端,当两侧输入小于等于后方输入时将无衰减输出后方信号,当两侧输入大于后方输入时将不输出。红石中继器可用于放大信号,外部输入信号经中继器放大后可保证侧方信号强度为15,大于阳光传感器的11,输出变为零实现非门功能。

3.2 与门

现实中与门可由二极管和电阻搭建,而红石中继器的单向特性与二极管相似,自然想到用中继器代换二极管,但实验后发现并不可行。通过分析可知实际电路只要与地相连的均为0,红石中只要与能量源相连的均为1,因此可将红石信号通过非门取反后形成与非门,再通过非门输出形成与门。二输入与门如图3所示,三输入与门如图4所示。

3.3 或门

或门只需红石粉,若输入信号弱,可在两个输入或输出上加中继器。如图5所示。

图6:判断电路

图7:双向红石中继器

图8:原始3/8 线译码器

图9:指令改进型3/8 线译码器

3.4 判断电路

判断电路在指令简化部分非常重要,其结构与第二种非门相似,只需在输入引脚处直接引出输出端即可,该电路实现了对0 和1 的判断。输入0 时只有比较器一端输出1,该输出端为复位端;输入1 时只有直接引出端为1,该输出端为置位端。如图6所示。

3.5 双向中继器

单个红石中继器只能单向增强信号,想要双向通信自然想到再并联一个反向的中继器,但如此连接的两个中继器会相互激活,成为不受控能量源。解决这个问题可以利用中继器的中继锁特性。当红石中继器的侧方有信号输入时会进入保持状态,无论输入端是否有信号,输出端信号不变,该状态的特点是中继器上出现一条横杠。

双向中继器包含两个中继器和两个比较器,比较器用于控制红石线走向并作为中继锁开关。由于中继器的延时特性,在用于放大的中继器在产生信号前,另一个中继器先进入锁止状态使输出保持为零,这样每次只有一个中继器工作,避免了相互激发。如图7所示。

4 纯红石电路搭建

大型电路由基础电路组成,以3/8 线译码器为例,根据逻辑式画出逻辑图后直接用基础电路搭建即可。搭建时注意红石线间的间隔,相邻的红石线会自动相连,可用比较器或中继器进行隔离。如图8所示。

4.1 纯红石电路的弊端

红石信号衰减速度与电路体积相比还是太快,长距离铺设需大量使用中继器,代价是产生较大延迟和总线的时序混乱,这会导致多个集成电路通信时的数据错误,处理速度也难以提高。

庞大的体积导致搭建和改动非常耗时。搭建前需要计算好间隔,否则空间不足可能导致红石信号相互干扰。总之设计者将花大量时间在搭建上而不是数电设计上,这与游戏学习的初衷相违背。

4.2 原因分析

电路规模庞大和红石线的某些特性无法直接控制有关:临近的红石线会自动相连,想要独立走线必须增大间距或用特殊器件改变走向;红石线要依附方块才能铺设且只能依附于方块上方,因此电路无法双面走线且飞线时要浪费大量空间铺设方块;红石线无法直接在垂直方向铺设,需要用实心方块或半砖搭建楼梯后再在其上铺红石线。

4.3 解决方法

红石信号强度通过某些方法确实能提高,但红石线的其他特性无法改变,不使用红石线长距离传输是根本办法,下文的无线红石能基本解决这个问题,其中指令起了关键作用。

5 基础指令

丰富的指令是Minecraft 开放的一个重要原因,指令能帮玩家实现正常游戏无法实现的功能,也为自动化提供了便利。指令分为两个重要部分:指令本身和数据标签,数电入门不必全部知晓,掌握关键几个即可。了解个别指令后就能制作简易无线红石。

5.1 /fill

格式:/fill 起点坐标 终点坐标 方块名称[方块状态]可选参数。该指令可批量填充方块,平面立体均可填充。可选参数可忽略,默认值为replace。

5.2 /setblock

格式:/setblock 坐标 方块名称[方块状态]{数据标签} 可选参数。该指令可更改指定位置的方块。要删除指定位置的方块可用air 方块填充。可选参数可忽略,默认值为replace。

5.3 /clone

格式:/clone 被复制区域的开始坐标 被复制区域的结束坐标 新位置坐标 可选参数一 可选参数二。该指令可复制指定空间内包括空气在内的方块至新的位置,两坐标为被复制空间的对角坐标,两个可选参数均可忽略,默认值分别为replace 和normal。注意命令方块内的指令也将被复制。

5.4 /summon

格式:/summon 实体名称 坐标 {数据标签}。该指令可在指定位置召唤实体,实体包括但不限于具有速度、位置、角度、生命值等特征,占据一定空间并受重力影响的物体。其中下落的方块falling_block 较为特殊,与数据标签配合能转变成其他方块。

5.5 /kill

格式:/kill 目标[目标选择器]。用于清除实体,例如/kill @e[type=command_block_minecart,distance=..2]的效果是清除所有命令方块矿车,@e 表示所有实体,type 选择具体的实体类型,distance控制选择范围,点点2为距指令发出者小于两个方块的实体。

6 纯红石电路的初次简化

6.1 简易无线红石的原理

数字信号的特点给无线红石带来了极大便利,无须知道红石线的具体能量强度,只要红石线上有能量则代表1,无能量则代表0。无线红石传递的不是红石强度信号而是直接远程放置红石源,放置则为1,不放则为0。

将上文的判断电路稍加改装:在两个输出端各放一个命令方块,两方块内均使用setblock 指令且坐标相同,区别是置位端的方块种类为redstone_block 的红石块或其他红石源,而复位端为air 空气。输入为1 时将激活置位端的命令方块,坐标处被放置红石源,这样高电平信号就能无线传递到指定位置。输入0 时激活复位端的命令方块,坐标处被填充空气使红石块移除即传递低电平信号。如图10所示。

图9为使用指令简化的3/8 线译码器,相比原始译码器,改进型体积更小且线路更简洁。三位输入端的右位使用连锁型无线红石,其余两位使用OOC 无线红石。

6.2 简易无线红石的弊端

由于一个命令方块只能存一条简易指令,一个判断电路只能控制一个坐标的数据传输,若一条红石线有多个分支就要多个判断电路,这种设计任然较为复杂。

6.3 原因分析

判断电路的作用是鉴别红石线的电平高低,而相连的分支线路的电平应是相同的,所以不需要多个判断电路,只需一个能同时执行多个setblock 指令,能在多个坐标同时放置红石源的方法。

6.4 解决方法

如图11所示,多条指令可用连锁命令方块执行,使用时需将第二个以及后方的命令方块的模式调至连锁且保持开启,方块上的箭头指向的是下一个将被触发的连锁方块[5]。每个方块中都有一条setblock 指令且坐标不同,由于指令简单所以执行速度很快,效果接近同时执行。

这种方法可称为连锁型无线红石。该种方法执行效率最高且稳定性最好但仍有缺陷,从图9可看出与用OOC 无线红石的其它两个端输入端相比,连锁型的体积仍然较大。使用下文的OOC 可以再次简化红石电路。

7 数据标签

NBT(Named Binary Tags)又称数据标签是游戏中一种储存数据的格式,可在指令中设定方块的各项参数。想要执行复杂指令甚至编写程序比如OOC,就需要了解NBT。

7.1 BlockState

格式:BlockState:{Name:方块名称,Properties:{方块状态1:值1,方块状态2:值2…}}。该标签用于下落的方块,Name 和Properties为BlockState 的子标签,前者用于指定下落方块将转变成的类型且不可省略,后者用于设定方块状态可以省略,大多方块的状态仅朝向起作用,若召唤的是连锁命令方块就需要用该状态控制朝向。

7.2 Time

图10:改装后的判断电路

图11:连锁型命令方块

格式:Time:数值。用于下落的方块,表示已存在的时刻数(一刻为0.05 秒),若没有该标签下落方块将瞬间消失。和summon 指令配合时建议设置为1。

7.3 TileEntityData

格式:TileEntityData:{其他标签}。该标签用于下落的方块,当下落的方块接触到其它方块变为实体时,标签内的数据会被复制到实体中。

7.4 Command与auto

这两标签用于命令方块且常与TileEntityData 配合使用。TileEntityData{ auto:1,Command:"完整指令"}},Command 为往命令方块写入的指令,auto 为命令方块是否保持开启,1 开启0 关闭,开启后方块无需红石信号也能立即运行。

7.5 Passengers

格式:Passengers:[{id:方块名称,其它标签},{id:方块名称},...]。骑乘标签,该标签召唤的实体将骑在前一个实体上,标签中的id为并列关系即多个实体骑在同一个实体上,但执行每个id 的顺序有先后。若要按顺序骑乘即后一个骑在前一个之上,可在id 后方继续嵌套骑乘标签如Passengers:[{id:…,Passengers :[{…}]},{...}]。该标签用于实体,对普通方块不起作用。

8 一键命令方块

一键命令方块亦称OOC(Only One Command),主体只有一个命令方块,与之前的简易指令不同,有了数据标签的加入,方块内可存入多条能连续执行的指令,只需将载体命令方块激活,指令将自动运行。OOC 对于电路简化以及代码化传播有非常大的帮助。

8.1 堆叠型OOC

堆叠型程序比较繁琐但思路清晰,适合新手巩固命令和数据标签的语法。原理是利用Passengers 标签不断嵌套指令召唤出命令方块,同时用Command 标签在每个命令方块内存入指令并运行,最后填充空气消除所有召唤出的方块来结束程序。以下为模板。

/summon falling_block~1~1~{BlockState:{Name:command_blo ck},Time:1,TileEntityData:{auto:1,Command:"命令1"},

Passengers:[{id:falling_block,BlockState:{Name:command_block},Time:1,TileEntityData:{auto:1,Command:"命令2"},

Passengers:[{id:falling_block,BlockState:{Name:command_block},Time:1,TileEntityData:{auto:1,Command:"命令3"},

Passengers:[{id:falling_block,BlockState:{Name:command_block},Time:1,TileEntityData:{auto:1,Command:"命令..."},

Passengers:[{id:falling_block,BlockState:{Name:command_block},Time:1,TileEntityData:{auto:1,Command:"/fill~~~~~-4~air"},

}]}]}]}]}

8.2 矿车型OOC

命令方块矿车于Java1.7 版加入游戏,矿车型程序利用了矿车的叠加特性,即多个矿车使用骑乘标签叠加在一起却不会掉落,以下为模板。

/summon falling_block~~1~{BlockState:{Name:redstone_block},Time:1,

Passengers:[{id:falling_block,BlockState:{Name:activator_rail},Time:1,

Passengers:[{id:command_block_minecart,Command:"命令1"},

{id:command_block_minecart,Command:"命令2"},

{id:command_block_minecart,Command:"命令3"},

{id:command_block_minecart,Command:"命令..."},

{id:command_block_minecart,Command:"/setblock~~2~command_block{auto:1,Command:"fill~~~~~-3~air"}"},

{id:command_block_minecart,Command:"/kill@e[type=command_block_minecart,distance=..2]"}]}]}

8.3 两种OOC的优点

堆叠型的方块种类单一,且能严格按照骑乘顺序执行指令,因此程序执行不易出错,可靠性高。矿车型程序的主体为命令方块矿车,因其本身为实体,所以无须用falling_block 做中间转换而省去了BlockState 的大量代码,也无须嵌套大量Passenger 标签就能连续运行,程序执行效率远超堆叠型。

8.4 堆叠型OOC的弊端

程序代码冗长,实际执行的只有Command 后方的指令,其余代码只为保持程序的自动运行,这导致程序运行速度不高。单个OOC 中若有多条指令,执行过程中方块将叠加到很高的高度,这会影响多层电路的设计。

8.5 堆叠型弊端分析

一是由于summon 指令与Passenger 标签只能用于实体,普通方块想要被召唤和骑乘必须经过falling_block 这一实体媒介转换,而转换的代码较长因此耗费较多时间且代码显得冗长。二是为了程序的连续运行,每添加一条指令须嵌套一个骑乘标签,这也降低了程序执行效率。三是被召唤的方块的空间若被其它方块占用,则召唤方块将变成掉落物,其携带的指令也无法执行,所以堆叠型OOC 上方不能有障碍物。

8.6 矿车型OOC的弊端

程序最后kill 指令里的distance 标签用于控制清除范围。范围太小容错率低,矿车可能不会全部清除,范围大又会误删附近的程序矿车。程序中独立放置的命令方块不会严格按照程序顺序执行,当电路速度很快时,前一个未执行的方块将影响下一个将要放置的方块。

8.7 矿车型弊端分析

由于命令方块矿车需要激活才能运行,所以下方要放置用红石块充能的激活铁轨。矿车出现到被铁轨激活有一定的时间,若附近有多条OOC 同时执行,未激活的矿车被附近范围设定错误的kill指令清除,那么矿车搭载的指令将无法执行。

独立放置命令方块是为了解决方块与实体无法用一条指令清除的问题。如果按顺序运行kill 和fill 指令,无论哪个先执行都将破坏另一条的触发环境,只有将其中一条转移至外部独立运行才能解决这个问题。

由于两种OOC 主要依靠游戏特性实现,所以弊端无法避免,只能在设计电路时灵活运用。

9 纯红石电路的再次简化

将判断电路输出端的命令方块中的简易指令换成OOC 即可,所有Command 标签后均为setblock 指令只是坐标不同,这样只需一个命令方块就能向多个坐标传数据。

由于OOC 的弊端不可不免,设计时最好根据实际情况选择合适的无线红石,或者将连锁型与OOC 结合使用来弥补各自短板,例如将堆叠型程序拆成两部分别放在两个连锁方块中,这样能将堆叠高度降低一半。

10 设计程序化

为方便设计的传播,可将设计好的电路写成OOC 程序。集成电路多由基础电路组合而成,编写时可先放置基础电路,之后大量使用clone 指令复制已放置好的部分能提高编写效率。

编写带有程序的命令方块时注意,一对双引号间若还有引号则每个引号都须用反斜杠/转义,如同矿车型放置fill 指令一样。若嵌套层数过多,反斜杠自身也需要反斜杠转义。为了避免过多的符号转义,可将普通方块和程序方块分开编写,用不同的OOC 放置。

11 结论

红石数电入门并不难,在了解部分红石特性并学习少量基础电路后,利用数电模块化特点搭建大型电路不再困难,搭建时利用指令优化电路不仅效率高,还能降低电路搭建难度。将电路编写成OOC,电路就能以代码的形式储存和传播,极大方便了红石数电的交流和学习。

猜你喜欢
红石中继器矿车
红石岩上的悲壮战歌
红石岩上的悲壮战歌
矿车路线迷宫
长方体剑士莱特 之寻找巅峰红石
煤矿井下矿车维修效率的提升途径的分析
坐在矿车上的国家
一种矿车拉力检验装置的研制与应用
新疆哈密红石铜矿控矿构造研究
双层无线传感器网络的中继器放置问题
单层网络中继器放置的2-连通问题及算法