2019年8月14日水曜日

チェストに戻り元の位置から再開

プログラムに縦方向と横方向の動きをカウントさせて、燃料が規定値を下回るとチェストに行って燃料を補給して元居た場所に戻っていきます。タートルの位置の把握することが重要となります。


範囲は8x8で設定しています
※自動農業でのタートルの動きを想定したプログラムです、実際に植え付けや収穫は行いません、燃料が規定値を下回ったら補給するだけです


タートルのインベントリは空にします


タートルの燃料レベルは、0です


前のチェストに木炭1スタック用意します




プログラムのタートルの動き

タートルはチェストから木炭を1入手して燃料を補給します
燃料レベルは80となります
タートルの動き
前に7ブロック進み、列を移動して、7ブロック戻るを3回繰り返します
前に7ブロック進み、列を移動して、7ブロック戻り、スタート地点に戻ります
どの位置にいても燃料レベルが40を下回るとチェストに戻って燃料を1補給します
燃料が40を下回った地点まで戻り移動を開始します

タートルの燃料値の下限
if turtle.getFuelLevel()<40 then

列の移動の変数を無限ループ1回毎にリセット
local Line=0

列の移動をしたときに+1を加えます
Line=Line+1

前に進む変数をループ毎にリセット
local Forward=0

1ブロック前に進んだときに+1を加えます
Forward=Forward+1

戻ってくる変数をループ毎にリセット
local Uturn=7

1ブロック戻ってときに-1を引きます
Uturn=Uturn-1


--####燃料低でチェストに戻り元の場所に戻るプログラム
turtle.select(1)
turtle.suck(1)
turtle.refuel(1)
turtle.up()
turtle.forward()
turtle.forward()
while true do
    local Line=0
    for A=1,3 do 
        local Forward=0
        for A=1,7 do
            local FuelLevel=turtle.getFuelLevel()
            print("FuelLevel:",FuelLevel)
            if turtle.getFuelLevel()<40 then
                turtle.turnLeft()
                for A=1,Line do
                    turtle.forward()
                end
                turtle.turnLeft()
                for A=1,Forward do
                    turtle.forward()
                end
                turtle.forward()
                turtle.select(1)
                turtle.suckDown(1)
                turtle.refuel(1)
                turtle.turnRight()
                turtle.turnRight()
                turtle.forward()
                for A=1,Forward do
                    turtle.forward()
                end
                turtle.turnRight()
                for A=1,Line do
                    turtle.forward()
                end
                turtle.turnLeft()
            end
            turtle.forward()
            Forward=Forward+1
            print("Forward:",Forward)
        end
        turtle.turnRight()
        turtle.forward()
        Line=Line+1
        print("Line:",Line)
        turtle.turnRight()
        local Uturn=7
        for A=1,7 do
            local FuelLevel=turtle.getFuelLevel()
            print("FuelLevel:",FuelLevel)
            if turtle.getFuelLevel()<40 then
                turtle.turnRight()
                for A=1,Line do
                    turtle.forward()
                end
                turtle.turnLeft()
                for A=1,Uturn do
                    turtle.forward()
                end
                turtle.forward()
                turtle.select(1)
                turtle.suckDown(1)
                turtle.refuel(1)
                turtle.turnRight()
                turtle.turnRight()
                turtle.forward()
                for A=1,Uturn do
                    turtle.forward()
                end
                turtle.turnRight()
                for A=1,Line do
                    turtle.forward()
                end
                turtle.turnRight()
            end
            turtle.forward()
            Uturn=Uturn-1
            print("Uturn:",Uturn)
        end
        turtle.turnLeft()
        turtle.forward()
        Line=Line+1
        turtle.turnLeft()
    end
    local Forward=0
    for A=1,7 do
        local FuelLevel=turtle.getFuelLevel()
        print("FuelLevel:",FuelLevel)
        if turtle.getFuelLevel()<40 then
            turtle.turnLeft()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnLeft()
            for A=1,Forward do
                turtle.forward()
            end
            turtle.forward()
            turtle.select(1)
            turtle.suckDown(1)
            turtle.refuel(1)
            turtle.turnRight()
            turtle.turnRight()
            turtle.forward()
            for A=1,Forward do
                turtle.forward()
            end
            turtle.turnRight()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnLeft()
        end
        turtle.forward()
        Forward=Forward+1
        print("Forward:",Forward)
    end
    turtle.turnRight()
    turtle.forward()
    Line=Line+1
    print("Line:",Line)
    turtle.turnRight()
    local Uturn=7
    for A=1,7 do
        local FuelLevel=turtle.getFuelLevel()
        print("FuelLevel:",FuelLevel)
        if turtle.getFuelLevel()<40 then
            turtle.turnRight()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnLeft()
            for A=1,Uturn do
                turtle.forward()
            end
            turtle.forward()
            turtle.select(1)
            turtle.suckDown(1)
            turtle.refuel(1)
            turtle.turnRight()
            turtle.turnRight()
            turtle.forward()
            for A=1,Uturn do
                turtle.forward()
            end
            turtle.turnRight()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnRight()
        end
        turtle.forward()
        Uturn=Uturn-1
        print("Uturn:",Uturn)
    end
    turtle.turnRight()
    for A=1,7 do
        turtle.forward()
    end
    turtle.turnRight()
end
--####燃料低でチェストに戻り元の場所に戻るプログラムの終わり




プログラムには print() を使用して燃料値、移動カウントをタートル画面に表示するようにしていますが、省略すればより短くなります。また新たにチェストでのタートルの動きを  function MoveChesu() と関数とすればさらに短くなります。ただし燃料値が低くなりチェストに戻る動作を関数化すると変数を反映させることが難しくなります。

新たに関数処理を加えるとメイン処理とのつながりで、タートルの位置ずれが起こることが判明しました。turtle.forward() だけのような早い処理の場合は、os.sleep(秒) などを関数の最後に入れることで解消されるようです。

--####短くしたプログラム
--####燃料低でチェストに戻り元の場所に戻るプログラム
turtle.select(1)
turtle.suck(1)
turtle.refuel(1)
turtle.up()
turtle.forward()
turtle.forward()
function MoveChest()
    turtle.forward()
    turtle.select(1)
    turtle.suckDown(1)
    turtle.refuel(1)
    turtle.turnRight()
    turtle.turnRight()
    turtle.forward()
end
while true do
    local Line=0
    for A=1,3 do 
        local Forward=0
        for A=1,7 do
            if turtle.getFuelLevel()<40 then
                turtle.turnLeft()
                for A=1,Line do
                    turtle.forward()
                end
                turtle.turnLeft()
                for A=1,Forward do
                    turtle.forward()
                end
                MoveChest()
                for A=1,Forward do
                    turtle.forward()
                end
                turtle.turnRight()
                for A=1,Line do
                    turtle.forward()
                end
                turtle.turnLeft()
            end
            turtle.forward()
            Forward=Forward+1 
        end
        turtle.turnRight()
        turtle.forward()
        Line=Line+1
        turtle.turnRight()
        local Uturn=7
        for A=1,7 do
            if turtle.getFuelLevel()<40 then
                turtle.turnRight()
                for A=1,Line do
                    turtle.forward()
                end
                turtle.turnLeft()
                for A=1,Uturn do
                    turtle.forward()
                end
                MoveChest()
                for A=1,Uturn do
                    turtle.forward()
                end
                turtle.turnRight()
                for A=1,Line do
                    turtle.forward()
                end
                turtle.turnRight()
            end
            turtle.forward()
            Uturn=Uturn-1 
        end
        turtle.turnLeft()
        turtle.forward()
        Line=Line+1
        turtle.turnLeft()
    end
    local Forward=0
    for A=1,7 do
        if turtle.getFuelLevel()<40 then
            turtle.turnLeft()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnLeft()
            for A=1,Forward do
                turtle.forward()
            end
            MoveChest()
            for A=1,Forward do
                turtle.forward()
            end
            turtle.turnRight()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnLeft()
        end
        turtle.forward()
        Forward=Forward+1 
    end
    turtle.turnRight()
    turtle.forward()
    Line=Line+1
    turtle.turnRight()
    local Uturn=7
    for A=1,7 do
        if turtle.getFuelLevel()<40 then
            turtle.turnRight()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnLeft()
            for A=1,Uturn do
                turtle.forward()
            end
            MoveChest()
            for A=1,Uturn do
                turtle.forward()
            end
            turtle.turnRight()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnRight()
        end
        turtle.forward()
        Uturn=Uturn-1 
    end
    turtle.turnRight()
    for A=1,7 do
        turtle.forward()
    end
    turtle.turnRight()
end
--####燃料低でチェストに戻り元の場所に戻るプログラムの終わり

関連サイト
コンピュータークラフトを極める その3

0 件のコメント:

コメントを投稿