UU看書

第四十四章 在Minecraft用指令算1+1=?

天才一秒記住【UU看書】地址:www.uukanshu.co

(注意:這一章很燒腦,建議在空閒時間大腦容量充足時閱讀,最好閱讀時在遊戲內實地操作)

我們知道,記分板中所計入的玩家分數都是變數。既然是變數,那麼多個變數是否可以互相運算呢?

答案當然是可以。Mojang也為這個運算功能單獨提供了一個子命令:operation(操作)

operation的格式如下:

scoreboardplayersoperationlt被跟蹤的玩家或非玩家A:目標選擇器gtlt計分項agtlt計算方式gtlt被跟蹤的玩家或非玩家B:目標選擇器gtlt計分項bgt

看著是不是有點迷糊?簡單來說,使用operation子命令的具體運算過程是這樣的:

第一步:使用目標選擇器指定目標A

第二步:指定計分項甲

(上面兩步相當於將目標A在計分項甲中的分數作為輸入a。比如,假設目標A是張三,計分項甲是dummy型的“違法次數”,張三的違法次數是12,那麼輸入a的值就是張三的違法次數的值,即a12。)

第三步:指定計算方式(或者說是指定操作)

第四步:使用目標選擇器指定目標B

第五步:指定計分項乙

(上面的四、五步和一、二步同理,將目標B在計分項乙中的分數作為輸入b)

第六步:將輸入a和輸入b兩個量按照指定的操作進行運算。

第七步:按照指定的操作更改輸入a的和輸入b的值。(大部分操作只會更改輸入a的值,即把運算得出的值覆蓋原本輸入a的值)

舉一個簡單的例子:

scoreboardplayersoperation張三gold李四gold

假設張三在gold計分項中的分數是1,李四也一樣。那麼這串指令執行過後張三在gold計分項中的分數將會變成2(11),但李四的分數還是1。

這個例子中,採用的操作(運算方式)是,即“求和”。具體是將輸入a(張三的gold分數)和輸入b(李四的gold分數)相加,得到結果c,並將結果c的值覆蓋原本輸入a的值。也就是說,這個“求和”是這麼算的:

輸入a結果c輸入a輸入b

(注意,這不是正常的數學等式。在這裡有一個運算的時間先後。即最左邊的輸入a是運算完成時的輸入a,並不等於最右邊剛開始運算時“輸入a輸入b”中的輸入a,兩者是一新一舊,不能將它們認為是同一個“輸入a”)

操作不止有求和(),它一共有九種:

(注:“⌊⌋”指向下取整。如⌊312⌋3,⌊482⌋5)

——求和

——求差(輸入a結果c輸入a輸入b)

(如:21,結果就是211)

——求積(輸入a結果c輸入a×輸入b)

(如:23,結果就是2×36)

——求商(輸入a結果c⌊輸入a÷輸入b⌋)

(如:2412,結果就是24÷122;1713,結果就是⌊17÷13⌋1)

——求餘(輸入a結果c輸入amod輸入b輸入a⌊輸入a÷輸入b⌋×輸入b。簡單點的說法就是:輸入a輸入a÷輸入b的餘數)

注:Java1131版本更新中,的內部程式碼運算採用的某個方法從原本的改成了MathfloorMod。不知道這會造成什麼影響。我尚未在1131和以上版本中進行相關實驗。

(如:1713,結果就是17⌊17÷13⌋×13171×1317134)

——賦值(輸入a結果c輸入b。即把輸入b的值覆蓋到輸入a上)注Java18以下版本沒有

(如:156,結果就是6)

lt——取較小值(如果輸入a≥輸入b,輸入a結果c輸入b;如果輸入a≤輸入b,輸入a結果c輸入a)注Java18以下版本沒有

(如:17lt13,結果就是13)

gt——取較大值(如果輸入a≥輸入b,輸入a結果c輸入a;如果輸入a≤輸入b,輸入a結果c輸入b)注Java18以下版本沒有

(如:13gt17,結果就是17)

gtlt——互相交換值(輸入a和輸入b值互換)注Java18以下版本沒有

(如4gtlt19,結果是“輸入a19,輸入b4”)

這似乎有點燒腦?沒關係,下面還有更燒腦的。operation實際上是個很複雜的東西,將其瞭解透後你的邏輯運算能力應該能變強幾分。

我們知道,目標選擇器可以選擇多個目標。而你有沒有注意到,剛才我們所瞭解的不過都是輸入a和輸入b均都為1個的情況。那麼如果輸入a有多個,或是輸入b有多個,甚至是輸入a和輸入b都有多個的時候,operation又會怎樣運算?

由於接下來的內容MinecraftWiki並未記載(注:英文MinecraftWiki有兩行記載,但講得過於簡略),網上也搜不到相關內容,下面內容都是作者在Java1122版本中實驗得出的。如果你對此很感興趣,你也可以自己嘗試去做做實驗,看看在其他版本下或其他情況下結果是否一樣。

①當輸入a有多個分數,而輸入b僅有一個分數時

現在我們假設輸入a有三個:

a₁1

a₂0

a₃1

輸入b有一個:

b3

我們對這三個輸入a和輸入b進行(求和)操作,最終得出來結果是:

a₁c₁a₁b134

a₂c₂a₂b033

a₃c₃a₃b132

因此不難發現,當有多個輸入a但只有一個輸入b時,遊戲將會把每個輸入a均與輸入b進行一次運算操作。

(注:這不是真正的實驗過程,這已經被大大簡化了)

②當輸入a有一個分數,而輸入b有多個分數時

我們假設輸入a1,輸入b有三個:

b₁2

b₂3

b₃4

我們對這個輸入a和三個輸入b進行操作,最終得出結果是:

acab₁b₂b₃12342

不難發現,當輸入a只有一個但輸入b有多個時,輸入a將與每個輸入b都進行一次運算操作,再把最終得出的結果覆蓋到原本的輸入a上。

③當輸入a和輸入b均為多個分數時(該情況MinecraftWiki並未記載):

我們假設輸入a有兩個:

a₁1

a₂0

輸入b也有兩個:

b₁3

b₂2

我們也對它們進行操作,最終得出的結果竟然是:

a₁c₁a₁b₁134

a₂c₂a₂b₁033

沒錯!輸入a和輸入b多個的情況下,遊戲只會選擇一個輸入b來參與運算。也就是說,在其他條件相同的情況下,該結果跟輸入a多個但輸入b只有一個的結果一模一樣。

這應該算是個Bug吧

對了,既然遊戲只會選擇一個輸入b來參與運算,那麼這個輸入b會選擇誰呢?

根據作者的測試,遊戲會選擇目標選擇器排列的第一個輸入b,這時候就要看你用的目標選擇器。如果用的是p、e、a,就是就近原則;如果是r,則是隨機。

這個排列順序在operation中不只是用於選擇輸入b,它還用於在情況①下決定輸入a們與輸入b運算的先後順序和情況②中決定輸入a和哪些輸入b先運算,哪些輸入b後運算。

瞭解這些後,我們就可以來看一種升級版的情況①:

當輸入a有多個,輸入b有一個且這個輸入b也是一個輸入a時

這個情況是啥意思呢?簡單來說,現在有張三李四王五,我們拿他們三的分數作為三個輸入a,並把張三的分數也作為輸入b。是不是複雜了起來?

我們假設有三個輸入a,分別是:

a₀2

a₁1

a₂3

(按照下標數字從小到大參與運算)

而輸入b就是a₁。

我們對它們兩按照該情況進行運算,最終得出來以下結果:

a₀ⁿᵉʷc₀a₀ᵒˡᵈa₁ᵒˡᵈ211

a₁ⁿᵉʷc₁a₁ᵒˡᵈa₁ᵒˡᵈ112

a₂ⁿᵉʷc₂a₂ᵒˡᵈa₁ⁿᵉʷ325

上面兩個式子中,為了讓大家方便理解,我特別標上了old(舊)和new(新)來代表未運算和已運算的兩個不同的量。

不難發現,當輸入a有多個,並且輸入b是眾多輸入a中的一個時,如果某個輸入a與輸入b運算時這個輸入b所關係的輸入a還沒有運算,那麼這個輸入a將會與舊的輸入b進行運算;如果某個輸入a與輸入b運算時這個輸入b所關係的輸入a已運算完成,那麼這個輸入a將會與新的輸入b進行運算。

這讀起來有點繞口啊。沒關係,雖然現在你不一定看得懂,但只要你在遊戲中實地做過實驗你估計就懂了。

本章就到這裡了?

剛才的四個探究中,我們都在探究operation在有多個輸入和多個輸出情況下會如何計算。一般來說,進行這種研究會用到命令方塊。你知道的,命令方塊執行指令成功後會輸出結果,這個結果可能會影響到命令方塊輸出的紅石訊號強度。比如我們之前講到的testfor指令,探測到有多少個實體就輸出多強紅石訊號。

那麼operation在命令方塊中執行成功是否會影響到命令方塊輸出的紅石訊號強度呢?

答案是:能!

經過作者的測試,operation執行一次輸出的紅石訊號強度,等於該次operation計算的次數。比如情況①中,如果指令是在命令方塊中執行,那麼執行成功後命令方塊將輸出3級紅石訊號,因為operation運算了3次。情況②輸出的訊號也一樣,別看作者給出的只是一行式子,但是operation仍然確確實實運算了3次。

這是一個冷門到極致的知識,冷門到連MinecraftWiki也沒有記載。當然我也不確定在新版本是否還有這個功能,也許已經被移除了呢?

如遇章節錯誤,請點選報錯(無需登陸)

新書推薦

帶顆華子穿越網遊世界 穿越八零:從極品肥妻到團寵 網遊之靈武者傳說 網遊之我是神偷 網遊:我在達瓦拉大陸當火神 網遊之無敵從殺雞開始 絕殺!我得到了超巨系統?