2019年7月16日火曜日

40個のチェストに分配輸送

ラージチェストを最大10x4の40個にアイテムを分配してチェストに入れていくプログラムです。コンフィグでアイテムを登録することで、40個の内の20個のチェストに入れるアイテムを指定できます。露天掘りプログラムとの連携を考えていますので、マイニング専用タートルとアイテム輸送タートルの2台のタートルを使用します。

タートルのインベントリが16個なので、今のところ、24x24の露天掘りが限界なのでチェストは20個あれば足ります。やりすぎた感はあるのですが、脱初心者を目指しています、それが今後につながると思っています。


特徴
回収用のチェストにアイテムが入ると輸送タートルが動き出します
燃料用のチェストには、採掘した石炭を入れます
燃料は自分で補給します
1列目の10個のチェストは、すべて同じアイテム
2列目と3列目はひとつのチェストでひとつのアイテムを登録
4列目のチェストは登録していないアイテムを入れます
縦のチェストの数は可変式で最大10までです


このようにチェストを配置します、前のタートルがマイニングタートルで後ろのタートルが配送タートルです。横がアイテム回収チェスト、その横が燃料チェストです。
プログラムスタート時にタートルに多少の燃料を入れておきます。また燃料のチェストに石炭、木炭を5スタックほど入れておきます。


アイテム回収用のチェストにアイテムが入っていないと輸送タートルは動き出しません。


マイニングタートルがアイテム回収用のチェストにアイテムを入れると輸送タートルが動き出します。


チェスト番号とタートルの配置、採掘場所はこのようになります




--####コンフィグ
local CHEST=10--縦方向のチェストの数、最大10
local COUNT=0--チェストに移動に関する変数

--####"minecraft:アイテム名"
--1列目
local ITEM1RETU="minecraft:cobblestone"--1列目はすべて丸石
--2列目
local ITEM1="minecraft:dirt"--1~5までは土
local ITEM2="minecraft:dirt"
local ITEM3="minecraft:dirt"
local ITEM4="minecraft:dirt"
local ITEM5="minecraft:dirt"
local ITEM6="minecraft:gravel"--6~7までは砂利
local ITEM7="minecraft:gravel"
local ITEM8="minecraft:stone"--8~10までは石類
local ITEM9="minecraft:stone"
local ITEM10="minecraft:stone"
--3列目
local ITEM11="minecraft:sand"--1~3までは砂
local ITEM12="minecraft:sand"
local ITEM13="minecraft:sand"
local ITEM14="minecraft:sandstone"--4~5までは砂岩
local ITEM15="minecraft:sandstone"
local ITEM16="minecraft:redstone"--6番目はレッドストーン
local ITEM17="minecraft:iron_ore"--7番目は鉄鉱石
local ITEM18="minecraft:gold_ore"--8番目は金鉱石
local ITEM19="minecraft:diamond"--9番目はダイヤモンド
local ITEM20="minecraft:emerald"--10番目はエメラルド

--####アイテム回収分別プログラム
turtle.up()--上に行く                     
turtle.turnLeft()--左を向く                       
turtle.forward()--前に行く                       

--####メインの処理                     

--採掘アイテムの回収
for MAIN=1,200 do--MAINの処理を1~200回ループ
    turtle.select(1)--スロット1を選択
    while true do--無限ループの開始
        if turtle.suckDown() then--もしもスロット1にアイテムを回収できたら
           break--無限ループの終わり
           else os.sleep(10)--アイテム回収できなかったら10秒停止
        end--もしもアイテム回収できたらの終わり
    end--無限ループの終わり
    for A=2,16 do--タートルのスロットを2~16までループ変数は、「A」                 
        turtle.select(A)--タートルはスロット変数「A」を選択               
        turtle.suckDown()--下からのアイテムを吸収
    end--スロットのループ「A」の終わり
 
--燃料のチェストに石炭を入れる
    turtle.forward()--前に行く                   
    turtle.forward()--前に行く                   
    for A=1,16 do--タートルのスロットを1~16までループ変数は、「A」                 
        turtle.select(A)--タートルはスロット変数「A」を選択           
        local DATA=turtle.getItemDetail()--関数「DATA」を定義して実行           
        if DATA then--もしもタートルのスロットに「DATA」があるなら           
            if DATA.name=="minecraft:coal" then--もしも「DATA」が石炭なら   
                turtle.dropDown()--下に落とす     
            end--もしもの終わり         
        end--もしもの終わり             
    end--スロットのループ「A」の終わり                             

--1列目ににアイテムを入れる                   
    for B=1,CHEST do--ループ「B」はチェストを移動                     
        turtle.forward()             
        turtle.forward()                 
        for A=1,16 do                 
            turtle.select(A)             
            local DATA=turtle.getItemDetail()             
            if DATA then             
                if DATA.name==ITEM1RETU then       
                   turtle.dropDown()     
                end       
            end           
        end               
    end                   
 
--次の列への移動
    turtle.turnRight()                   
    turtle.forward()                     
    turtle.forward()                     
    turtle.forward()                     
    turtle.turnRight()                   
 
--2列目の一番目のチェストにアイテムを入れる
    for A=1,16 do                 
        turtle.select(A)             
        local DATA=turtle.getItemDetail()             
        if DATA then             
            if DATA.name==ITEM1 then       
               turtle.dropDown()     
            end       
        end           
    end                           

--2列目の2番目以降のチェストにアイテムを入れる             
    for B=1,CHEST-1 do--ループ「B」はチェストを移動                   
        turtle.forward()                 
        turtle.forward()
        COUNT=COUNT+1--ループ「1回」の処理でCOUNT+1
        for A=1,16 do                 
            turtle.select(A)             
            if COUNT==1 then--もしもCOUNTがループ1回目なら
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM2 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==2 then--もしもCOUNTがループ2回目なら
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM3 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==3 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM4 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==4 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM5 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==5 then
                local DATA=turtle.getItemDetail()             
                if DATA then   
                    if DATA.name==ITEM6 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==6 then
                local DATA=turtle.getItemDetail()             
                if DATA then 
                    if DATA.name==ITEM7 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==7 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM8 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==8 then
                local DATA=turtle.getItemDetail()             
                if DATA then 
                    if DATA.name==ITEM9 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==9 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM10 then       
                       turtle.dropDown()                                             
                    end       
                end           
            end--もしもCUNT...の終わり               
        end--ループ「A」の終わり
    end--ループ「B」の終わり
    COUNT=0--COUNTのリセット

--次の列への移動
    turtle.turnLeft()
    turtle.forward()                     
    turtle.forward()                     
    turtle.forward()
    turtle.turnLeft()
 
--3列目の1番目のチェストにアイテムを入れる
    for A=1,16 do                 
        turtle.select(A)             
        local DATA=turtle.getItemDetail()             
        if DATA then             
            if DATA.name==ITEM11 then       
               turtle.dropDown()     
            end       
        end           
    end                           

--3列目の2番目以降のチェストにアイテムを入れる         
    for B=1,CHEST-1 do                   
        turtle.forward()                 
        turtle.forward()
        COUNT=COUNT+1
        for A=1,16 do                 
            turtle.select(A)             
            if COUNT==1 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM12 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==2 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM13 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==3 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM14 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==4 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM15 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==5 then
                local DATA=turtle.getItemDetail()             
                if DATA then   
                    if DATA.name==ITEM16 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==6 then
                local DATA=turtle.getItemDetail()             
                if DATA then 
                    if DATA.name==ITEM17 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==7 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM18 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==8 then
                local DATA=turtle.getItemDetail()             
                if DATA then 
                    if DATA.name==ITEM19 then       
                       turtle.dropDown()
                    end
                end
            elseif COUNT==9 then
                local DATA=turtle.getItemDetail()             
                if DATA then
                    if DATA.name==ITEM20 then       
                       turtle.dropDown()                                             
                    end       
                end           
            end               
        end
     
    end
COUNT=0 
--次の列に移動
    turtle.turnRight()                   
    turtle.forward()                     
    turtle.forward()                     
    turtle.forward()                     
    turtle.turnRight()
 
--4列目の1番目のチェストにアイテムを入れる
    for A=1,16 do                 
        turtle.select(A)             
        turtle.dropDown()       
    end                           

--4列目の2番目以降のチェストにアイテムを入れる             
    for B=1,CHEST-1 do--ループ「B」はチェストを移動                   
        turtle.forward()                 
        turtle.forward()                 
        for A=1,16 do                 
            turtle.select(A)             
            turtle.dropDown()     
        end       
    end--ループ「B」の終わり           
                 
--1番最初のチェストに戻る
    turtle.turnRight()
    for C=1,9 do--ループ「C」は、1のチェストに移動
        turtle.forward()
    end--ループ「C」の終わり
 
--燃料チェストで燃料の補給
    turtle.turnLeft()
    turtle.forward()
    turtle.forward()
    turtle.suckDown(1)
    turtle.refuel()
 
--採掘アイテムチェストへ移動
    turtle.forward()
    turtle.forward()
    turtle.turnRight()
    turtle.turnRight()
end--ループ「MAIN」の終わり


Y値75で24x24で露天掘りした結果

単純計算で、24x24x(75-5)=40320個のアイテム回収
※岩盤位置はY値5ですので「-5」
ラージチェストの容量は、6x9x64=3456
回収した丸石の数はラージチェスト8個弱
3456x8=27648個の丸石
露天掘り範囲を広げていくとチェストは、丸石で圧迫されてしまいます

Y値70で256x256を露天掘りをすると
単純計算で、256x256(70-5)=4259840個のアイテム回収
ラージチェストの容量は、6x9x64=3456
4259840÷3456=約1233個のラージチェストが必要となります

いちばん簡単なプログラムであるのなら、1直線にチェストを配置して順番にアイテムを入れていけばいいんですが、それではロマンがないと考えていますので、複雑なプログラムになってしまいました。




縦に40個チェストを並べてアイテムをチェストに入れるだけのプログラムです

turtle.up()
turtle.turnLeft()                 
turtle.forward()
turtle.select(1)
for MAIN=1,200 do
    for A=1,16 do               
        turtle.select(A)             
        turtle.suckDown()
    end
    turtle.forward()
    turtle.forward()
    turtle.suckDown(2)
    turtle.refuel()
    for B=1,40 do               
        turtle.forward()               
        turtle.forward()               
        for A=1,16 do               
            turtle.select(A)           
            turtle.dropDown()   
        end     
    end
    turtle.turnLeft()
    turtle.turnLeft()
    for B=1,40 do               
        turtle.forward()
        turtle.forward()
    end
    turtle.forward()
    turtle.forward()
    turtle.turnLeft()
    turtle.turnLeft()
end

効率を考えると「os.sleep(秒)」をMAINの処理の前に入れた方がいいですね

関連サイト

0 件のコメント:

コメントを投稿