第九十三章 邏輯門 上
(此章節(jié)已于2022年7月27日重寫)
我們都知道,execute的條件子命令可以是『條件成立即執(zhí)行』,也可以是『條件不成立才執(zhí)行』,但是testfor指令就不行了。
假設(shè)現(xiàn)在我們要在基巖版實(shí)現(xiàn)一個(gè)功能:如果以執(zhí)行地點(diǎn)為中心,半徑2米內(nèi)沒(méi)有任何的鉆石掉落物,就在此處生成一個(gè)鉆石。
至于怎樣生成一個(gè)鉆石,我們不用管(本章不討論這個(gè))?,F(xiàn)在的問(wèn)題是,怎樣使得半徑2米內(nèi)沒(méi)有任何鉆石掉落物時(shí)才會(huì)激活用來(lái)生成鉆石的命令方塊呢?
答案很簡(jiǎn)單:制作一個(gè)非門。
非門是什么?在了解非門之前,我們得先了解一個(gè)東西:邏輯電路。
邏輯電路(Logic Circuit),簡(jiǎn)單來(lái)說(shuō),就是一個(gè)你往里面輸入一些信號(hào),它就會(huì)返回特定信號(hào)的電路。比如你往里面輸入一個(gè)1,它就給你返回0;往里面輸入一個(gè)0,它就給你返回1。
最基本的邏輯電路被稱之為邏輯門(Logic Gate)。邏輯門其實(shí)并不是指一個(gè)門,它只是一個(gè)很簡(jiǎn)單的紅石電路而已。邏輯門有很多種,每種邏輯門都擁有不同的作用。這一章,我們就來(lái)了解一些基本的邏輯門。
非門(NOT Gate),又稱之為『反相器』,是一種會(huì)反轉(zhuǎn)輸入信號(hào)的邏輯門。它的結(jié)構(gòu)很簡(jiǎn)單,如下:
?█?(插圖93-1)
?······未激活的拉桿(輸入)
█······任意完整方塊
?······開啟的紅石火把(輸出)
為了方便,我們暫且把拉桿?這邊的輸入,叫做R,紅石火把?這邊的輸出,叫做C。拉桿按下,R=1,否則R=0。紅石火把開啟,C=1,否則C=0。
現(xiàn)在的狀態(tài)是拉桿沒(méi)有拉下,紅石火把開啟,也就是:
R=0 C=1
讓我們改變一下拉桿的狀態(tài),拉下欄桿,然后你就會(huì)發(fā)現(xiàn):
〇█
〇······R拉下的拉桿
······C關(guān)閉的紅石火把
R=1 C=0
整理一下,我們就會(huì)發(fā)現(xiàn),當(dāng)我們給非門輸入一個(gè)信號(hào)時(shí),非門會(huì)把這個(gè)信號(hào)反轉(zhuǎn)。體現(xiàn)在游戲中,就是你拉下拉桿,反倒關(guān)閉了紅石火把;不拉下拉桿,反倒開啟了紅石火把。
說(shuō)了這么多,那么這東西對(duì)我們有何幫助?
我們可以把『強(qiáng)度等級(jí)大于0的紅石信號(hào)』視作1,『強(qiáng)度等級(jí)為0的紅石信號(hào)』視為0。testfor指令執(zhí)行成功后返回的執(zhí)行成功次數(shù)總會(huì)是一個(gè)大于0的值,紅石比較器轉(zhuǎn)化后的強(qiáng)度等級(jí)也肯定大于0,也就是輸出1。反之,testfor執(zhí)行失敗也就是輸出0。看到這個(gè)1、0,你想到了什么?
二進(jìn)制?
非門吶!反轉(zhuǎn)信號(hào)啊!我們只需要在輸出后面接上一個(gè)非門反轉(zhuǎn)一下信號(hào),不就可以實(shí)現(xiàn)『testfor執(zhí)行成功輸出0,失敗輸出1』了嗎?讓我們來(lái)試一試:
?□┠█??(插圖93-2)
□······重復(fù)型命令方塊(testfor @e[r=2,name=鉆石,type=item])\\檢測(cè)半徑二米內(nèi)是否有鉆石掉落物\\
┠······R朝向東的紅石比較器(比較模式)
?······C開啟的紅石火把
拉下拉桿,命令方塊開始執(zhí)行,但由于周圍并沒(méi)有鉆石,指令執(zhí)行失敗,紅石比較器沒(méi)有輸出信號(hào),導(dǎo)致R輸入一直為0,C輸出自然就一直反轉(zhuǎn)成1,紅石火把便一直亮著。
讓我們?cè)谂赃吶右活w鉆石看看:
?〇□┠█(插圖93-3)
你會(huì)發(fā)現(xiàn)紅石火把熄滅了。
這是為什么?因?yàn)槊罘綁K檢測(cè)到了鉆石,成功次數(shù)大于0,紅石比較器將成功次數(shù)轉(zhuǎn)化為紅石信號(hào)后強(qiáng)度也就不等于0,同時(shí)轉(zhuǎn)化后的紅石信號(hào)也被輸入到了非門中,也就是非門的R=1。紅石火把接受到紅石信號(hào)后就進(jìn)入關(guān)閉狀態(tài),也就是非門的C=0。這樣子,我們就成功地將testfor指令的執(zhí)行結(jié)果反轉(zhuǎn),使得接下來(lái)的操作能夠加以進(jìn)行。
下面是完整版的『鉆石生成裝置』:
?〇A→?┠█!B→C→D→(插圖93-4和93-5)
圖例
〇······拉下的拉桿
A→······循環(huán)型命令方塊,寫有『testfor @e[r=2,name=鉆石,type=item]』
┠?······紅石比較器
█······任意完整方塊
!······紅石火把(可能是亮也可能是不亮,故這邊用感嘆號(hào))
B→······脈沖型命令方塊,寫有『summon armor_stand diamond 84.47 -60.00 -91.30』
C→······連鎖型命令方塊,寫有『replaceitem entity @e[name=diamond,type=armor_stand] slot.weapon.mainhand 0 diamond』
D→······連鎖型命令方塊,寫有『kill @e[type=armor_stand,name=diamond]』
整個(gè)裝置的運(yùn)行流程如下:
如果半徑2米內(nèi)有鉆石,就
→啥也不干
否則,就
→①生成一個(gè)盔甲架
→②讓盔甲架拿著一顆鉆石
→③然后殺死盔甲架,鉆石就掉落了
非常簡(jiǎn)單是不是?這就是『非門』在指令中的主要用途。只不過(guò)隨著execute指令的升級(jí),非門也就慢慢地在指令圈中步入了歷史。
......
所以邏輯門就這一種?肯定不是。
接下來(lái)我會(huì)快速介紹其他的一些門,這些門由于在指令中的使用頻率會(huì)比非門少很多,我們就不詳細(xì)講解。如果你對(duì)紅石感興趣,我記得TIS(Trinity Union,中國(guó)最厲害的生電服務(wù)器,你應(yīng)該有聽說(shuō)過(guò))他們的B站賬號(hào)好像有在做紅石教程,還有明月莊主好像也有教程。
與門(AND Gate),翻譯成中文就是『當(dāng).....和.....都成立時(shí),才會(huì).......』。也就是說(shuō),與門是用來(lái)判斷兩個(gè)或兩個(gè)以上的條件,當(dāng)這些條件都成立時(shí),輸出C才會(huì)等于1。在編程語(yǔ)言中,與門也就是邏輯運(yùn)算中的『且』,符號(hào)常常使用『&』或『&&』。
在Minecraft中,與門有N多種做法,這邊就列出一個(gè)最簡(jiǎn)單的一種:
?◆⊕(這里的拉桿為R1)
空┊!┈(插圖93-6)
??◆⊕(這里的拉桿為R2)
┊······紅石線,在這邊紅石線下面要有任意完整方塊,使得它和旁邊兩個(gè)紅石火把齊平
?⊕······一個(gè)完整方塊上面插著紅石火把的結(jié)構(gòu)
??!······C輸出用紅石火把
┈······紅石線
?◆······R輸入用拉桿
空······空氣,沒(méi)有任何東西
與門有如下的特性:
當(dāng)R1=0 R2=0時(shí) C=0
當(dāng)R1=1 R2=0時(shí) C=0
當(dāng)R1=0 R2=1時(shí) C=0
當(dāng)R1=1 R2=1時(shí) C=1
也就是說(shuō),與門要全部輸入都為1時(shí),才會(huì)輸出1。也就是要所有條件都為真(true)時(shí),才會(huì)返回真(true)。
或門(OR Gate),翻譯成中文就是『當(dāng)......或......中有一個(gè)成立時(shí),就......』。也就是說(shuō),或門同樣也是用來(lái)判斷兩個(gè)或兩個(gè)以上的條件。只不過(guò)和與門不一樣的是,或門只需要部分條件成立就可以返回真,也就是輸出C=1。在編程中,或門也就是邏輯運(yùn)算中的『或』,符號(hào)常常用『|』或『||』來(lái)表示。
或門也有N多種做法,這邊也是用最簡(jiǎn)單的一種:
◆┊(這里的拉桿為R1)
空┊┈(插圖93-7)
◆┊(這里的拉桿為R2)
┊······紅石線
┈······C輸出紅石線
◆······R輸入用拉桿
空······空氣,沒(méi)有任何東西
或門有如下的特性:
當(dāng)R1=0 R2=0時(shí) C=0
當(dāng)R1=1 R2=0時(shí) C=1
當(dāng)R1=0 R2=1時(shí) C=1
當(dāng)R1=1 R2=1時(shí) C=1
也就是說(shuō),或門只要部分輸入為1時(shí),就會(huì)輸出1。也就是當(dāng)部分條件為真(true)時(shí),就會(huì)返回真(true)。
這就是本章的全部?jī)?nèi)容,你會(huì)發(fā)現(xiàn)其實(shí)還是蠻簡(jiǎn)單的。如果你看不懂,那這邊推薦你去找?guī)讉€(gè)紅石教程,本書講紅石確實(shí)是有點(diǎn)......比較不適合。