2020年1月26日日曜日

岩盤に到達したらプログラムを終える(成功編)

前回失敗したプログラムを考え直しました。岩盤は凸凹しているので出現場所はわかりません。そこで今回はタートルは、下を調べながら前に進む、岩盤を見つけたらチェストに戻りプログラムを終える、このようにプログラムを組み替えました。





--今回のプログラム
local DOWNcount=0--定義DOWNcountは「0」
local YOKOcount=0--定義YOKOcountは「0」
local OWARU=0--定義OWARUは「0」
for HUKASA=1,100 do--一面を百回掘るループHUKASA
    for OUHUKU=1,2 do--ループOUHUKUは、1~2まで実行
        if OWARU==0 then--もしも定義OWARUが「0」なら
            turtle.digDown()--下を掘る
            turtle.down()--下に行く
            DOWNcount=DOWNcount+1--定義DOWNcountに「+1」
        end--もしもの終わり
        for YOKO=1,8 do--ループYOKOは、1~8まで実行
            for TATE=2,8 do--ループTATEは、1~8まで実行
                turtle.dig()--前を壊す
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
                local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と違うなら
                if NANIGA.name~="minecraft:bedrock" then
                     turtle.forward()--前に行く
                else--もしも違うなら
                    OWARU=OWARU+1--定義OWARUに「+1」
                    turtle.forward()--前に行く
                end--もしもの終わり
            end--ループTATEの終わり
            if YOKO==8 then--もしもループYOKOが「8」なら
                if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
                    else--もしも違うなら
                        turtle.turnRight()--右を向く
                        turtle.turnRight()--右を向く
                end--もしもの終わり
            elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
                turtle.turnRight()--右を向く
                turtle.dig()--前を壊す
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
                local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と違うなら
                if NANIGA.name~="minecraft:bedrock" then
                     turtle.forward()--前に行く
                else--もしも違うなら
                    OWARU=OWARU+1--定義OWARUに「+1」
                    turtle.forward()--前に行く
                end--もしもの終わり
                turtle.turnRight()--右を向く
                YOKOcount=-1--YOKOcountを「-1」に変更
            elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
                turtle.turnLeft()--左を向く
                turtle.dig()--前を壊す
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
                local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と違うなら
                if NANIGA.name~="minecraft:bedrock" then
                     turtle.forward()--前に行く
                else--もしも違うなら
                    OWARU=OWARU+1--定義OWARUに「+1」
                    turtle.forward()--前に行く
                end--もしもの終わり
                turtle.turnLeft()--左を向く
                YOKOcount=0--YOKOcountを「0」に変更
            end--もしもの終わり 
        end--ループYOKOの終わり
    end--ループOUHUKUの終わり
--ループAGARUは、1~定義DOWNcountまで実行
    for AGARU=1,DOWNcount do
        turtle.up()--上に行く
    end--ループAGARUの終わり
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
    if OWARU==0 then--定義OWARUが「0」なら
--ループSAGARUは、1~定義DOWNcountまで実行
        for SAGARU=1,DOWNcount do
            turtle.down()--下に行く
        end--ループSAGARUの終わり
        turtle.turnRight()--右を向く
        turtle.turnRight()--右を向く
    else--もしも違うなら
        break--プログラムを終わらせます
    end--もしもの終わり
end--ループHUKASA終わり
--今回のプログラムの終わり


プログラムの解説

下のブロックを調べながら進み岩盤ブロックを見つけます。文字「OWARU」を定義して岩盤を見つけたら「OWARU」に数字を加えていきます。

local OWARU=0--定義OWARUは「0」
定義文字の「OWARU」を「0」と設定します


--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
                local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と違うなら
                if NANIGA.name~="minecraft:bedrock" then
              turtle.forward()--前に行く
                else--もしも違うなら
                    OWARU=OWARU+1--定義OWARUに「+1」
                    turtle.forward()--前に行く
                end--もしもの終わり

この if 文を
turtle.forward()--前に行く
の部分と置き換えます

turtle.inspectDown()--下のブロックを調べる
このタートルAPIを使用して、まず下のブロックを調べます
~="minecraft:bedrock" then--岩盤でないなら
「前に行く」
else--岩盤なら
「定義OWARUに+1」「前に行く」

チェストに戻ってアイテムを入れた後に分岐を作ります。定義文字の「OWARU」は、上の if 文で岩盤を見つけたら「1」加算されます。「OWARU」が「0」ならタートルは、チェストにアイテムを入れたら下降してループ「HUKASA」を繰り返します。「OWARU」が「1」以上なら「break」でプログラムを終了します。

if OWARU==0 then--定義OWARUが「0」なら
チェストに戻る前に分岐を作ります

else--定義OWARUが「0」以外なら

break--プログラムを終わらせます
でプログラムを終了します。



タートルのチェストに戻る、採掘に戻るの上下の動きは、今まではループ「HUKASA」の回数x2でしたが、一段目掘り進んだ時にタートルの下のブロックに岩盤が現れたら1ブロック分タートルの位置がチェストの上まで行ってしまいます。
そこで定義で「DOWNcount」を定めタートルがダウンした数をカウントしていきます。

local DOWNcount=0--定義DOWNcountは「0」

プログラム内のタートルがダウンした後にカウントします
turtle.down()--下に行く
DOWNcount=DOWNcount+1--定義DOWNcountに「+1」

ループAGARU、ループSAGARUの終了値を「DOWNcount」までとします
--ループAGARUは、1~定義DOWNcountまで実行
    for AGARU=1,DOWNcount do

--ループSAGARUは、1~定義DOWNcountまで実行
        for SAGARU=1,DOWNcount do


9台のタートルを4x4の範囲で動かしてみました


岩盤まで到達したタートルは、チェストにアイテムを入れて停止


岩盤が出現したところで露天掘りは終了


水浸しでも大丈夫でした


溶岩でも大丈夫でした
9台のタートルは、エラーを起こすことなくプログラムを終了しました。このプログラムでの露天掘りを終える処理は、理論的には問題はないと思いますが、マイクラのワールドは何が起こるかわかりませんので、やはりタートルの位置ずれや失踪は、起こってしまいましたが原因が不明なのでとりあえず成功とします。



次のページ「コンフィグを設定してサイズを可変式に」
前のページ「岩盤に到達したらプログラムを終える(失敗編)」

0 件のコメント:

コメントを投稿