2020年2月17日月曜日

パイプの役割のタートルを追加して効率を上げる

今までの露天掘りプログラムは、1台のタートルが「露天掘り」「チェストにアイテムを入れる」を繰り返しましたが、採掘を掘り進んでいくとタートルが「チェストに戻る」「採掘場所に戻る」この時間に時間が掛かりすぎます。そこでもう1台輸送用のタートルを増やして2台のタートルで連携して露天掘りのプログラムを考えます。



タートルとチェストの配置です



--露天掘りのタートルのプログラム

--今回のプログラム
--露天掘りサイズのコンフィグ
local TATEsize=8--縦のサイズ
local YOKOsize=8--横のサイズ
local HUKASAsize=100--掘る深さ
--定義文字の設定
local YOKOcount=0--定義YOKOcountは「0」
local OWARU=0--定義OWARUは「0」
--タートルが前に行く関数の定義
function SIRABETEMAENIIKU()--岩盤を調べながら絶対に前に行く関数
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
    local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と違うなら
    if NANIGA.name~="minecraft:bedrock" then
        if turtle.forward() then--もしも①前に行けたら終わり
        else--もしも①違うなら
            while true do--無限ループを実行
                turtle.attack()--前を攻撃
                if turtle.forward() then--もしも②前に行けたら終わり
                    break--無限ループを終える
                end--もしも②の終わり
            end--無限ループの終わり
        end--もしも①の終わり
    else--もしも違うなら
        OWARU=OWARU+1--定義OWARUに「+1」
    end--もしもの終わり
end--関数の定義の終わり
--メイン処理
--ループHUKASAは、1~HUKASAsize/2まで実行
for HUKASA=1,HUKASAsize/2 do
--タートルの露天掘り
    for OUHUKU=1,2 do--ループOUHUKUは、1~2まで実行
        if OWARU==0 then--もしも定義OWARUが「0」なら
            turtle.digDown()--下を掘る
            turtle.down()--下に行く
        end--もしもの終わり
        for YOKO=1,YOKOsize do--ループYOKOは、1~YOKOsizeまで実行
            for TATE=2,TATEsize do--ループTATEは、2~TATEsizeまで実行
                turtle.dig()--前を壊す
                SIRABETEMAENIIKU()--岩盤を調べながら前に行く
            end--ループTATEの終わり
            if YOKO==YOKOsize then--もしもループYOKOが「YOKOsize」なら
                if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
                    else--もしも違うなら
                        turtle.turnRight()--右を向く
                        turtle.turnRight()--右を向く
                end--もしもの終わり
            elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
                turtle.turnRight()--右を向く
                turtle.dig()--前を壊す
                SIRABETEMAENIIKU()--岩盤を調べながら前に行く
                turtle.turnRight()--右を向く
                YOKOcount=-1--YOKOcountを「-1」に変更
            elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
                turtle.turnLeft()--左を向く
                turtle.dig()--前を壊す
                SIRABETEMAENIIKU()--岩盤を調べながら前に行く
                turtle.turnLeft()--左を向く
                YOKOcount=0--YOKOcountを「0」に変更
            end--もしもの終わり
        end--ループYOKOの終わり
    end--ループOUHUKUの終わり
--露天掘りを続けるか、終えるかの分岐
    if OWARU==0 then--定義OWARUが「0」なら
        turtle.turnRight()--右を向く
        turtle.turnRight()--右を向く
--アイテムの受け渡しの為にプログラムを一時停止
--定義、上を調べる、ARUは、何がある、NANIGAは、ブロック名
        while true do       
            local ARU,NANIGA=turtle.inspectUp()        
--もしもブロック名がアドバンスタートルなら
            if NANIGA.name=="computercraft:turtle_advanced" then
                os.sleep(1)
            else
                break--無限ループを終える
            end--もしもの終わり
       end--無限ループの終わり
--タートルが露天掘りを終える
    else--もしも違うなら
        break--プログラムを終わらせます
    end--もしもの終わり
end--ループHUKASA終わり
--今回のプログラムの終わり


「チェストに戻ってアイテムをチェストに入れる」「露天掘り場所に戻る」この部分を削除して輸送タートルにアイテムを渡す時間を設定しました。また絶対に上に行く、下に行くの関数を削除して定義「DOWNcount=1」を削除しています。



--アイテムの受け渡しの為にプログラムを一時停止
--定義、上を調べる、ARUは、何がある、NANIGAは、ブロック名
        while true do       
            local ARU,NANIGA=turtle.inspectUp()        
--もしもブロック名がアドバンスタートルなら
            if NANIGA.name=="computercraft:turtle_advanced" then
                os.sleep(1)
            else
                break--無限ループを終える
            end--もしもの終わり
       end--無限ループの終わり

露天掘りタートルは、ループHUKASAの一番最初の下を掘るの前に上のブロックを無限ループで調べます。もしもアドバンスタートルなら1秒停止、違うなら「break」で無限ループを抜けます。

単純に「os.sleep(5)」などを使用すると採掘範囲が広いとアイテムの受け渡し切れない、狭いと序盤ですぐに輸送タートルが戻って来てしまいます。確実なプログラムを考えると輸送タートルが上がったら露天掘りを再開が妥当です。




--輸送タートルのプログラム


--今回のプログラム
--定義文字の設定
local DOWNcount=1--定義DOWNcountは「1」
--タートルの位置を合わせる動き
turtle.turnLeft()--左を向く
turtle.forward()--前に行く
turtle.turnLeft()--左を向く
--メイン処理
for PIPE=1,100 do--ループPIPEは、1~100まで実行
--採掘アイテムを受け取りに行く
--ループSAGARUは、1~DOWNcountまで実行
    for SAGARU=1,DOWNcount do
        turtle.down()--下に行く
    end--ループSAGARUの終わり
--露天掘りタートルが下に来たらアイテムを吸い上げる
    while true do--無限ループ
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
        local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名がアドバンスタートルなら
        if NANIGA.name=="computercraft:turtle_advanced" then
            for SLOT=1,16 do--ループSLOTは、1~16まで実行
                turtle.select(SLOT)--タートルスロットは、SLOTを選択
                turtle.suckDown()--下からアイテムを吸い上げる
            end--ループSLOTの終わり
            break--無限ループを終える
        end--もしもの終わり
    end--無限ループの終わり
--アイテムを入手できなければプログラムを終える
    if turtle.getItemCount(1)==0 then--もしもスロット1のアイテムが0なら
        break--プログラムを終える
    end--もしもの終わり
--チェストに戻る
--ループAGARUは、1~DOWNcountまで実行
    for AGARU=1,DOWNcount do
        turtle.up()--上に行く
    end--ループAGARUの終わり
--チェストにアイテムを入れる
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロットは、SLOTを選択
        turtle.drop()--前にアイテムを落とす
    end--ループSLOTの終わり
--タートルの上下移動に数値を追加
    DOWNcount=DOWNcount+2--DOWNcountに「+2」追加
end--ループPIPEの終わり
--今回のプログラムの終わり


プログラムの概要

左に露天掘りタートル、右に輸送タートル、後ろにラージチェストを配置
露天掘りタートルからプログラムをスタート


輸送タートルはアイテム回収場所で待ちます
採掘範囲が4x4など狭いと輸送タートルの上下の動きが間に合わなくなります


露天掘りタートルが下に来ると吸い上げの開始
露天掘りタートルは、1ブロック下に掘る前に6秒停止しますので、その間に輸送タートルは吸い上げます


輸送タートルはチェストまで上がりチェストにアイテムを入れます
輸送タートルのスロット1から16まで「turtle.drop()」でチェストに入れます
露天掘りタートルは採掘を再開します

これを岩盤が出現するまで繰り返します
プログラムの終了時のタートルは、このようになります


アドバンスタートルのブロックIDを調べます

アドバンスタートルの上にタートルを設置してアドバンスタートルのブロックIDを調べます 、上のタートルに以下のように打ち込みます


lua エンター
turtle.inspectDown() エンター

「computercraft:turtle_advanced」
これがアドバンスタートルのブロックIDです


プログラムの内容

露天掘りタートルが下に来たらアイテムを吸い上げる
輸送タートルは、無限ループで露天掘りタートルが下にあるかどうかを調べて、もしも露天掘りタートルがあるならアイテムを吸い上げ、無限ループを終えます。

--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
        local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名がアドバンスタートルなら
        if NANIGA.name=="computercraft:turtle_advanced" then
            for SLOT=1,16 do--ループSLOTは、1~16まで実行
                turtle.select(SLOT)--タートルスロットは、SLOTを選択
                turtle.suckDown()--下からアイテムを吸い上げる
            end--ループSLOTの終わり
            break--無限ループを終える
        end--もしもの終わり
    end--無限ループの終わり




アイテムを入手できなければプログラムを終える
プログラムの終了ポイントがないと輸送タートルは、下がることができませんのでループ「PIPE」の回数x2ブロックずつ上にチェストを通り過ぎてしまいます。

露天掘りタートルは、岩盤まで到達するプログラムを終えます、輸送タートルのプログラムが続いていくと下がることができません


チェストに戻る位置が上方向に2ブロックずつずれていきます


終了ポイントには、アイテムを受け取れなかったらの「if」文を使用します。

if turtle.getItemCount(1)==0 then--もしもスロット1のアイテムが0なら
    break--プログラムを終える
end--もしもの終わり

露天掘りタートルのインベントリが空なら輸送タートルは、アイテムの吸い上げができませんので、もしもスロット1が「0」なら「break」でプログラムを終了できます。

※この時に輸送タートルが下がれないというエラーが気になりますがスルーします



チェストまで上がる
チェストの位置まで戻るために「DOWNcount」分だけ上がります。

--ループAGARUは、1~DOWNcountまで実行
    for AGARU=1,DOWNcount do
        turtle.up()--上に行く
    end--ループAGARUの終わり


アイテムの受け渡しが終われば輸送タートルはチェストに行き、露天掘りタートルは採掘を再開します


チェストにアイテムを入れる
輸送タートルはチェストにアイテムをすべて入れます

for SLOT=1,16 do--ループSLOTは、1~16まで実行
    turtle.select(SLOT)--タートルスロットは、SLOTを選択
    turtle.drop()--前にアイテムを落とす
end--ループSLOTの終わり



上昇下降するブロック数をを加算していく露天掘りは一面を二回掘るプログラムなので、一回のループで二段ずつ掘り下がるので「+2」ずつ加算していきます。

DOWNcount=DOWNcount+2--DOWNcountに「+2」追加


次のページ「チェストの数を増やしてよりリアルな露天掘りにして完成」
前のページ「MOBによるタートルの位置ずれを防止する」

0 件のコメント:

コメントを投稿