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