2019年8月15日木曜日

こだわりの自動農業

同じ畑にジャガイモとニンジンの2種類を植える自動農業となっています。燃料の下限値で農地からチェストに戻り燃料補給、アイテムドロップとアイテム入手を行い、作業途中の場所に戻り作業再開する流れとなります。タートルのスロットはディティールで自動判別、インスペクトで植え付け作物を判断、メタデータで収穫時期か骨粉散布かを判断します。はっきり言ってやりすぎ感が強いプログラムとなっています。

turtle.getItemDetail()--選択スロットのアイテムを調べる
turtle.inspectDown()--下のブロックを調べる
この2個のAPIを使いこなすことが、CC攻略のカギとなります

ニンジンとジャガイモを1列ずつ植えます



主な分岐
インスペクトとディティールの組み合わせで複雑な分岐を作っています、インスペクトで下のブロックを調べてメタデータで収穫か骨粉散布化を分岐、アイテム名で収穫作物を調べてディティールでタートルのスロットを選択するようにしています。

local There,What=turtle.inspectDown()--下のブロックを調べる
    if There then
        if What.metadata==7 then--収穫時期なら
            if What.name=="minecraft:carrots" then--ニンジンなら
                turtle.digDown()--収穫
                for Slot=1,16 do
                    turtle.select(Slot)--ニンジンのスロットを選ぶ
                    local What=turtle.getItemDetail()
                    if What then
                        if What.name=="minecraft:carrot" then
                            turtle.placeDown()--ニンジンを植える


            else
                if What.name=="minecraft:potatoes" then--ジャガイモなら
                    turtle.digDown()--収穫
                    for Slot=1,16 do
                        turtle.select(Slot)--ジャガイモのスロットを選ぶ
                        local What=turtle.getItemDetail()
                        if What then
                            if What.name=="minecraft:potato" then
                                turtle.placeDown()--ジャガイモを植える
                         

        else--収穫時期でないなら
            for Slot=1,16 do
                turtle.select(Slot)--骨粉のスロットを選ぶ
                local What=turtle.getItemDetail()
                if What then
                    if What.name=="minecraft:dye" then
                        turtle.placeDown()--骨粉を散布
               
燃料補給
燃料の下限値でチェストに戻ります、タートルの位置を把握するために進んだブロック数、列を移動したブロック数、戻ったブロック数を変数としています。リセットする位置も重要となります。

local FuelLevel=25--燃料の下限値
if turtle.getFuelLevel()<FuelLevel then--燃料の下限値

local Line=0--列の移動数のリセット
Line=Line+1--列の移動数に+1をカウント
local Forward=0--進んだブロック数のリセット
Forward=Forward+1--進んだブロック数に+1をカウント
local Uturn=7--折り返して進んだブロック数のリセット
Uturn=Uturn-1--折り返して進んだブロック数に-1をカウント




プログラムの流れ
初期動作
  燃料の補給
  ジャガイモ32個を入手
  ニンジン32個を入手
  骨粉を4スタック入手
1周目
  1.3.5.7列目を耕しながらニンジンを植え付け
  2.4.6.8列目を耕しながらジャガイモを植え付け
2周目以降
  骨粉を巻きながら収穫時期を調べて収穫
  収穫した作物と同じ作物を植え付け
  燃料値が25より少なくなるとチェストへ移動
  燃料のチェストで木炭を1補給
  ジャガイモのチェストにジャガイモをドロップ
  ニンジンのチェストにニンジンをドロップ
  骨粉のチェストに骨粉をドロップ
  骨粉を4スタック入手
  骨粉を入手できなければ待機
  燃料値が25より少なくなった地点に戻り作業再開


プログラムスタート前の設定
8x8の農地、


ラージチェスト4個とファーミングタートルを配置


タートルのスロットは空


タートルの前に木炭を数スタック


次のチェストにジャガイモを32個


次のチェストにニンジンを32個


農地の横のチェストに骨粉を満タン



--ニンジンとジャガイモの自動農業プログラム
--燃料レベルでチェストに移動、元の位置から作業再開
local FuelLevel=25--燃料の下限値
turtle.select(1)
turtle.suck(1)
turtle.refuel(1)--燃料補給
turtle.up()
turtle.forward()
turtle.forward()
turtle.forward()
turtle.suckDown(32)--ジャガイモ補給
turtle.forward()
turtle.forward()
turtle.suckDown(32)--ニンジン補給
turtle.forward()
turtle.forward()
for Slot=3,6 do
    turtle.select(Slot)
    turtle.suckDown()--骨粉補給
end
turtle.forward()
function PlaceDownCarrot()--ニンジンの植え付け関数
    for Slot=1,16 do
        turtle.select(Slot)
        local What=turtle.getItemDetail()
        if What then
            if What.name=="minecraft:carrot" then
                turtle.placeDown()
                break
            end
        end
    end
end
function PlaceDownPotato()--ジャガイモの植え付け関数
    for Slot=1,16 do
        turtle.select(Slot)
        local What=turtle.getItemDetail()
        if What then
            if What.name=="minecraft:potato" then
                turtle.placeDown()
                break
            end
        end
    end
end
for A=1,3 do--1~6列目までを耕しながら植え付ける
    turtle.digDown()
    PlaceDownCarrot()
    for A=1,7 do
        turtle.forward()
        turtle.digDown()
        PlaceDownCarrot()
    end
    turtle.turnRight()
    turtle.forward()
    turtle.turnRight()
    turtle.digDown()
    PlaceDownPotato()
    for A=1,7 do
        turtle.forward()
        turtle.digDown()
        PlaceDownPotato()
    end
    turtle.turnLeft()
    turtle.forward()
    turtle.turnLeft()
end
turtle.digDown()--7列目
PlaceDownCarrot()
for A=1,7 do
    turtle.forward()
    turtle.digDown()
    PlaceDownCarrot()
end
turtle.turnRight()
turtle.forward()
turtle.turnRight()
turtle.digDown()--8列目
PlaceDownPotato()
for A=1,7 do
    turtle.forward()
    turtle.digDown()
    PlaceDownPotato()
end
turtle.turnRight()--農地のスタート地点に戻る
for A=1,7 do
    turtle.forward()
end
turtle.turnRight()
function MoveChestDropSuck()--チェストにアイテムドロップと補給の関数
    for A=1,7 do--燃料のチェストに移動
        turtle.forward()
    end
    turtle.suckDown(1)--燃料の補給
    for Slot=1,16 do
        turtle.select(Slot)
        local What=turtle.getItemDetail()
        if What then
            if What.name=="minecraft:coal" then
                turtle.refuel(1)
            end
        end
    end       
    turtle.turnRight()
    turtle.turnRight()
    for A=1,2 do--ジャガイモのチェストに移動
        turtle.forward()
    end
    for Slot=1,16 do--ジャガイモをチェストへドロップ
        turtle.select(Slot)
        local What=turtle.getItemDetail()
        if What then
            if What.name=="minecraft:potato" or
                What.name=="minecraft:poisonous_potato" then
                turtle.dropDown()
            end
        end
    end
    for A=1,2 do--ニンジンのチェストへ移動
        turtle.forward()
    end
    for Slot=1,16 do--ニンジンをチェストへドロップ
        turtle.select(Slot)
        local What=turtle.getItemDetail()
        if What then
            if What.name=="minecraft:carrot" then
                turtle.dropDown()
            end
        end
    end
    for A=1,2 do--骨粉のチェストへ移動
        turtle.forward()
    end
    for Slot=1,16 do--余った骨粉をドロップ
        turtle.select(Slot)
        turtle.dropDown()
    end
    while true do--骨粉入手の無限ループ
        turtle.select(1)--スロット1に
        if turtle.suckDown(64) then--骨粉入手
            break
        else--もし骨粉を入手できなかったら
            print("ItemSupply:OsSleep_60ms")
            os.sleep(60)--スリープ
        end
    end
    while true do--骨粉入手の無限ループ
        turtle.select(2)--スロット2に
        if turtle.suckDown(64) then--骨粉入手
            break
        else--もし骨粉を入手できなかったら
            print("ItemSupply:OsSleep_60ms")
            os.sleep(60)--スリープ
        end
    end
    while true do--骨粉入手の無限ループ
        turtle.select(3)--スロット3に
        if turtle.suckDown(64) then--骨粉入手
            break
        else--もし骨粉を入手できなかったら
            print("ItemSupply:OsSleep_60ms")
            os.sleep(60)--スリープ
        end
    end
    while true do--骨粉入手の無限ループ
        turtle.select(4)--スロット4に
        if turtle.suckDown(64) then--骨粉入手
            break
        else--もし骨粉を入手できなかったら
            print("ItemSupply:OsSleep_60ms")
            os.sleep(60)--スリープ
        end
    end
    turtle.forward()--農地へ移動
end
function InspectDownPlace()--植え付けと骨粉散布の関数
    local There,What=turtle.inspectDown()--下のブロックを調べる
    if There then
        if What.metadata==7 then--収穫時期なら
            if What.name=="minecraft:carrots" then--ニンジンなら
                turtle.digDown()--収穫
                for Slot=1,16 do
                    turtle.select(Slot)--ニンジンのスロットを選ぶ
                    local What=turtle.getItemDetail()
                    if What then
                        if What.name=="minecraft:carrot" then
                            turtle.placeDown()--ニンジンを植える
                            break
                        end
                    end
                end
            else
                if What.name=="minecraft:potatoes" then--ジャガイモなら
                    turtle.digDown()--収穫
                    for Slot=1,16 do
                        turtle.select(Slot)--ジャガイモのスロットを選ぶ
                        local What=turtle.getItemDetail()
                        if What then
                            if What.name=="minecraft:potato" then
                                turtle.placeDown()--ジャガイモを植える
                                break
                            end
                        end
                    end
                end
            end
        else--収穫時期でないなら
            for Slot=1,16 do
                turtle.select(Slot)--骨粉のスロットを選ぶ
                local What=turtle.getItemDetail()
                if What then
                    if What.name=="minecraft:dye" then
                        turtle.placeDown()--骨粉を散布
                        break
                    end
                end
            end
        end
    end
end
while true do--収穫とチェストへのドロップとアイテム入手の無限ループ
    local Line=0--列の移動数のリセット
    for A=1,3 do--1~6列目まで
        local Forward=0--進んだブロック数のリセッ
        for A=1,7 do
            InspectDownPlace()--植え付けと骨粉散布の関数
            if turtle.getFuelLevel()<FuelLevel then--燃料の下限値
                turtle.turnLeft()
                for A=1,Line do--列の移動数を戻る
                    turtle.forward()
                end
                turtle.turnLeft()
                for A=1,Forward do--進んだブロック数を戻る
                    turtle.forward()
                end
                MoveChestDropSuck()--チェストにアイテムドロップと補給の関数
                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--進んだブロック数に+1をカウント
            InspectDownPlace()--植え付けと骨粉散布の関数
        end
        turtle.turnRight()--列の移動
        turtle.forward()
        Line=Line+1--列の移動数に+1をカウント
        turtle.turnRight()
        local Uturn=7--折り返して進んだブロック数のリセット
        for A=1,7 do
            InspectDownPlace()
            if turtle.getFuelLevel()<FuelLevel then
                turtle.turnRight()
                for A=1,Line do
                    turtle.forward()
                end
                turtle.turnLeft()
                for A=1,Uturn do--折り返して進んだブロック数を戻る
                    turtle.forward()
                end
                MoveChestDropSuck()
                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--折り返して進んだブロック数に-1をカウント
            InspectDownPlace()
        end
        turtle.turnLeft()
        turtle.forward()
        Line=Line+1
        turtle.turnLeft()
    end
    local Forward=0
    for A=1,7 do--7列目
        InspectDownPlace()
        if turtle.getFuelLevel()<FuelLevel then
            turtle.turnLeft()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnLeft()
            for A=1,Forward do
                turtle.forward()
            end
            MoveChestDropSuck()
            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
        InspectDownPlace()
    end
    turtle.turnRight()
    turtle.forward()
    Line=Line+1
    turtle.turnRight()
    local Uturn=7
    for A=1,7 do--8列目
        InspectDownPlace()
        if turtle.getFuelLevel()<FuelLevel then
            turtle.turnRight()
            for A=1,Line do
                turtle.forward()
            end
            turtle.turnLeft()
            for A=1,Uturn do
                turtle.forward()
            end
            MoveChestDropSuck()
            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
        InspectDownPlace()
    end
    turtle.turnRight()
    for A=1,7 do
        turtle.forward()
    end
    turtle.turnRight()
end
--ニンジンとジャガイモの自動農業プログラムの終わり




以前作成した自動農業プログラムでも十分使えるんですが、単なる遊び心でやりすぎ感のある自動農業プログラムを作成しました。もうすぐプログラム歴2か月、独学なんですがコンピュータークラフトの限界に挑戦していきます。

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

0 件のコメント:

コメントを投稿