2019年7月23日火曜日

より高度な自動植林

チェスト1個での自動植林の第2弾です。タートルのインベントリAPIを駆使して完成度が上がりました。苗木や骨粉の補充、燃料補給、伐採開始、伐採終了の各タイミングを調整しています。



ただしチェストの中の13スロットまでしかアクセスできないので、伐採した原木が増えてくるとこのプログラムは機能しなくなります。あくまでもタートルのスロットを制するのが目的なので、気にしないでことにします。


ラージチェストの横にタートルを配置します
タートルのインベントリには何も入れません


ラージチェスト内は骨粉多めで入れておきます
13スロット目までしかタートルはアクセスしてくれません

※チェストのインベントリをフル活用するために中身を全部出すことも考えましたが、見た目の問題で却下しました。


スロット1に苗木、スロット2に骨粉、スロット3に木炭が入ります
残りのアイテムはチェストに戻します


苗木を植えて苗木が育つまで骨粉を散布します


原木になったら伐採をスタート、原木部分がなくなるまで伐採


回転しながら葉を破壊して下降します
地上まで下降したら苗木を1回転して回収します


苗木と木炭が5個、骨粉が10個を下回るとチェストに行って補充します

スロット1.2.3に違うアイテムが入ってしまうとプログラムは機能しなくなります

燃料の補給はタートルの燃料値が、80より少なくなったら行います

自動植林 その1では、タートルは前進しませんでしたが、今回は1歩前進しますので、苗木が育ったら伐採を開始するプログラムを加えています。これがないとタートルの位置ずれが発生することがありました。




--####自動植林プログラム
while true do--メイン処理の無限ループ
local COUNT=0--上昇の変数の定義
    turtle.turnLeft()
    while true do--アイテム補充の無限ループの実行
        if turtle.getItemCount(1)<5 or--スロット1のアイテム数が5個か
            turtle.getItemCount(2)<10 or--スロット2がアイテム数が10個か
            turtle.getItemCount(3)<5 then--スロット3がアイテム数が5個なら
            for A=4,16 do--スロット4~16までアイテムをチェストから入手
                turtle.select(A)
                turtle.suck()
                local SLOT=turtle.getItemDetail()
                if SLOT then
                    if SLOT.name=="minecraft:sapling" then--苗木なら
                        turtle.transferTo(1)--スロット1に入れる
                    elseif SLOT.name=="minecraft:dye" then--骨粉なら
                        turtle.transferTo(2)--スロット2に入れる
                    elseif SLOT.name=="minecraft:coal" then--木炭なら
                        turtle.transferTo(3)--スロット3に入れる
                    end
                end
            end
            for A=4,16 do--スロット4~16までのアイテムをチェストに戻す
                turtle.select(A)
                turtle.drop()
            end
        else break--アイテムの補充の無限ループを終える
        end
    end
    turtle.turnRight()
    if turtle.getFuelLevel()<80 then--タートルの燃料が80より少ないなら
        turtle.select(3)
        turtle.refuel(1)--燃料の補給
    end
    turtle.forward()
    turtle.select(1)
    turtle.place()--苗木を植える
    turtle.select(2)
    while true do--骨粉を巻く無限ループの実行
        local ARU,NANIGA=turtle.inspect()
        if ARU then
            if NANIGA.name=="minecraft:log" then--前が原木なら
            break--骨粉を巻く無限ループを終える
            else--原木でないなら
                turtle.place()--骨粉散布
                os.sleep(1)
            end
        end
    end
    for A=1,20 do--原木伐採のループの実行
        local ARU,NANIGA=turtle.inspect()
        if ARU then
            if NANIGA.name=="minecraft:log" then--前が原木なら
                turtle.dig()--原木を破壊
                if turtle.up() then
                    COUNT=COUNT+1--上昇できたら+1
                else--上昇できなければ
                    turtle.digUp()--上の葉を破壊
                    turtle.up()
                    COUNT=COUNT+1--上昇出来たら+1
                end
            else break--原木でないなら原木伐採ループを終える
            end
        end
    end
    turtle.dig()
    turtle.forward()
    for A=1,COUNT do--上昇した分だけ下降
        for A=1,4 do--回転しながら葉を破壊
            turtle.dig()
            turtle.turnRight()
        end
        turtle.down()
    end
    for A=1,4 do--1回転して苗木を回収
        turtle.turnRight()
        turtle.suck()
    end
    turtle.back()
    turtle.back()
end--メイン処理の無限ループの終わり



なぜだか頂上で前に行けずにフリーズすることがありました、原因不明のため、前に行くを無限ループとしたり、COUNT=0の位置を工夫しましたが改善されず、どこかしらのブレークに問題があるのかなとか思います。ただまだ確認が不完全です。※確認できました

原木伐採の無限ループのブレークが全プログラム終了となってしまうことが、あったようです。骨粉散布の無限ループは「もしも原木ならブレーク」、原木伐採は「もしも原木じゃないならブレーク」と真逆なので意味合いが違います。「if not~」を使ってみましたが上手くいきませんでした。

このように変更したらプログラムが止まることがなくなりました。

while true do--原木伐採の無限ループの実行
else break--原木でないなら原木伐採の無限ループを終える
    ↓
for A=1,20 do--原木伐採のループの実行
else break--原木でないなら原木伐採のループを終える

lua 言語はシンプルなのかもしれませんが、単純に考えたらできるってパターンが多いです。プログラムを書くことよりも読むことを重視したら「プログラム=難しい」の無限ループから抜け出せる気がします。


チェスト2個のプログラムです、右に原木回収のチェストを置きます

上記のプログラムの最後から2行目の「end」の前に入れることで機能します

turtle.turnRight()
    for A=4,16 do
        turtle.select(A)
        local SLOT=turtle.getItemDetail()
        if SLOT then
            if SLOT.name=="minecraft:log" then
                turtle.drop()
            end
        end
    end
turtle.turnLeft()


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

0 件のコメント:

コメントを投稿