2020年1月25日土曜日

往復の採掘でクアーリーの動きを再現

今までのプログラムでは、タートルは一面を掘りぬいた後スタート地点に戻って二段目を掘りぬく、またスタート地点に戻るを繰り返していましたが、今回のプログラムは一面を掘りぬいた後に「下を掘り、一段下がる」「戻りながら掘り進んでいく」ように改良してクアーリーの露天掘りに近づけます。

タートルのAPIはこちらで確認できます

--前回のプログラム
local YOKOcount=0--定義YOKOcountは「0」
for HUKASA=1,100 do--一面を百段掘るループHUKASA
    turtle.digDown()--下を掘る
    turtle.down()--下に行く
    for YOKO=1,8 do--ループYOKOは、1~8まで実行
        for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
        end--ループTATEの終わり
        if YOKO==8 then--もしもループYOKOが「8」なら
            turtle.turnRight()--右を向いてスタート方向を向く
            for HOME=2,8 do--ループHOMEは、2~8まで実行
                turtle.forward()--前に行く
            end--ループHOMEの終わり
            YOKOcount=0--YOKOcountを「0」に変更
        elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
            turtle.turnRight()--右を向く
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
            turtle.turnRight()--右を向く
            YOKOcount=-1--YOKOcountを「-1」に変更
        elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
            turtle.turnLeft()--左を向く
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
            turtle.turnLeft()--左を向く
            YOKOcount=0--YOKOcountを「0」に変更
        end--もしもの終わり
    end--ループYOKOの終わり
    turtle.turnLeft()--左を向く(チェストの方を向く)
    for AGARU=1,HUKASA do--ループAGARUは、1~ループHUKASAまで実行
        turtle.up()--上に行く
    end--ループAGARUの終わり
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
    for SAGARU=1,HUKASA do--ループSAGARUは、1~ループHUKASAまで実行
        turtle.down()--下に行く
    end--ループSAGARUの終わり
    turtle.turnRight()--右を向く
    turtle.turnRight()--右を向く
end--ループHUKASA終わり
--前回のプログラムの終わり




改良します

--今回のプログラム
local YOKOcount=0--定義YOKOcountは「0」
for HUKASA=1,100 do--一面を百段掘るループHUKASA
    for OUHUKU=1,2 do--ループOUHUKUは、1~2まで実行
        turtle.digDown()--下を掘る
        turtle.down()--下に行く
        for YOKO=1,8 do--ループYOKOは、1~8まで実行
            for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
                turtle.dig()--前を壊す
                turtle.forward()--前に行く
            end--ループTATEの終わり
            if YOKO==8 then--もしもループYOKOが「8」なら
                if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
                else--違うなら次の処理をしてループOUHUKUの2回目を処理
                    turtle.turnRight()--右を向く
                    turtle.turnRight()--右を向く
                end--もしもの終わり
            elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
                turtle.turnRight()--右を向く
                turtle.dig()--前を壊す
                turtle.forward()--前に行く
                turtle.turnRight()--右を向く
                YOKOcount=-1--YOKOcountを「-1」に変更
            elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
                turtle.turnLeft()--左を向く
                turtle.dig()--前を壊す
                turtle.forward()--前に行く
                turtle.turnLeft()--左を向く
                YOKOcount=0--YOKOcountを「0」に変更
            end--もしもの終わり    
        end--ループYOKOの終わり
    end--ループOUHUKUの終わり
--ループAGARUは、1~ループHUKASAx2まで実行
    for AGARU=1,HUKASA*2 do
        turtle.up()--上に行く
    end--ループAGARUの終わり
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
--ループSAGARUは、1~ループHUKASAx2まで実行 
    for SAGARU=1,HUKASA*2 do
        turtle.down()--下に行く
    end--ループSAGARUの終わり
    turtle.turnRight()--右を向く
    turtle.turnRight()--右を向く
end--ループHUKASA終わり
--今回のプログラムの終わり

ループOUHUKUを設置して2回実行するようにします。1回目処理でタートルは、「64」の位置で「右を向く」を2回行い、一段下に下がり「63」から「1」まで逆方向に掘り進んでいきます。それに伴い、列の移動方法も右左が逆になりますので、YOKOcountの部分を考える必要があります。またループOUHUKUの2回目の終わりを「if」文で設定します。



※プログラムのポイント
一面を掘りぬくループOUHUKUを2回繰り返して二面を掘りぬきます。ループOUHUKU先頭に「一段下を掘り、下がる」を含ませることが重要です。

for OUHUKU=1,2 do--ループOUHUKUは、1~2まで実行
    turtle.digDown()--下を掘る

    turtle.down()--下に行く
~一面を掘りぬくループYOKO~
end--ループOUHUKUの終わり

※プログラムのポイント
一面を掘りぬく処理を往復しますので、スタート位置に戻る必要がなくなります。一番目の分岐「ループYOKOが終わりなら右を向いてスタート位置まで戻る」を変更します。

if YOKO==8 then--もしもループYOKOが「8」なら
    turtle.turnRight()--右を向いてスタート方向を向く
    for HOME=2,8 do--ループHOMEは、2~8まで実行
        turtle.forward()--前に行く
    end--ループHOMEの終わり

    YOKOcount=0--YOKOcountを「0」に変更
   ↓if YOKO==8 then--もしもループYOKOが「8」なら
    if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
    else--違うなら次の処理をしてループOUHUKUを終える
        turtle.turnRight()--右を向く
        turtle.turnRight()--右を向く
    end--もしもの終わり

if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
ループOUHUKUが2回目の処理ならループOUHUKUが終わり、チェストの座標まで上がることになります。ここでのポイントは、もしも正しいならの処理はありません。ただループOUHUKUが終わるだけとなります。

else--違うなら次の処理をしてループOUHUKUの2回目を処理
一面目は「64」の位置で掘り終わりますので「右を向くx2」行い「63」を向きループOUHUKUの2回目の処理の先頭に戻ります。

YOKOcount=0--YOKOcountを「0」に変更
二段目の最初の列の移動は左回りとなりますので、YOKOcountは「-1」のままでよいのでこの部分は削除します。


※プログラムのポイント
ループHUKASAは、1回の処理でですが、ループOUHUKUの処理で「一段下を掘り、下がる」が2回行われていますので、チェストのY値は「HUKASAx2」となります。注意点は掛け算の場合 Lua 言語では「HUKASA*2」と書きこむ必要があります。

チェストへ上がる
--ループAGARUは、1~ループHUKASAx2まで実行
    for AGARU=1,HUKASA*2 do

採掘再開場所へ下がる
--ループSAGARUは、1~ループHUKASAx2まで実行
    for SAGARU=1,HUKASA*2 do


次のページ「岩盤に到達したらプログラムを終える(失敗編)」
前のページ「if 文で多重分岐で列の移動を管理」

0 件のコメント:

コメントを投稿