2020年2月17日月曜日

チェストの数を増やしてよりリアルな露天掘りにして完成

露天掘りの範囲を20x20と拡大、ラージチェストの数を16個まで増やします。それに対応する輸送タートルのプログラムを考えます。これでクアーリーを再現するプログラムの完成です。

タートルのインベントリが16スロットと少ないので露天掘りサイズをあまり大きくできません。二段掘りでは、20x20が限界だと思います。


--輸送タートルのプログラム
--今回のプログラム
--定義文字の設定
local DOWNcount=1--定義DOWNcountは「1」
local YOKOcount=0--定義YOKOcountは「0」
--タートルの位置を合わせる動き
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の終わり
--チェストの上に行く    
    turtle.up()--上に行く
    turtle.forward()--前に行く
--チェスト上を移動しながらアイテムを入れる
    for YOKO=1,4 do--ループYOKOは、1~4まで実行
        for TATE=1,4 do--ループTATEは、1~4まで実行
            for SLOT=1,16 do--ループSLOTは、1~16まで実行
                turtle.select(SLOT)--タートルスロットは、SLOTを選択
                turtle.dropDown()--下にアイテムを落とす
            end--ループSLOTの終わり
            if TATE<4 then--もしもループTATEが「4」より小さいなら
                turtle.forward()--前に行く
                turtle.forward()--前に行く
            end--もしもの終わり
        end--ループTATEの終わり
        if YOKO==4 then--もしもループYOKOが「4」なら
            turtle.turnLeft()--左を向く
            for MODORU=1,9 do--ループMODORUは、1~9まで実行
                turtle.forward()--前に行く
            end--ループMODORUの終わり
            turtle.turnLeft()--左を向く
            turtle.back()--バックする
            YOKOcount=0--YOKOcountを「0」にする
        elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
            turtle.turnLeft()--左を向く
            turtle.forward()--前に行く
            turtle.forward()--前に行く
            turtle.forward()--前に行く
            turtle.turnLeft()--左を向く
            YOKOcount=-1--YOKOcountを「-1」にする
        elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
            turtle.turnRight()--右を向く
            turtle.forward()--前に行く
            turtle.forward()--前に行く
            turtle.forward()--前に行く
            turtle.turnRight()--右を向く
            YOKOcount=0--YOKOcountを「0」にする
        end--もしもの終わり
    end--ループYOKOの終わり
--チェストの横まで戻る
    turtle.down()--下に行く
--タートルの上下移動に数値を追加
    DOWNcount=DOWNcount+2--DOWNcountに「+2」追加
end--ループPIPEの終わり
--今回のプログラムの終わり




プログラムは長くなってしまいましたが基本的な動作は、露天掘りの一面を掘りぬくです。チェストの設置には、1ブロック離す必要があるので「turtle.forward()」が多くなっています。

タートルは「1」から「16」までチェストを移動して最後に「1」まで戻ります

縦方向のチェスト上の移動は、ループTATEが「4より小さい」で実行、「4」で終える分岐としています

            if TATE<4 then--もしもループTATEが「4」より小さいなら
                turtle.forward()--前に行く
                turtle.forward()--前に行く
            end--もしもの終わり

列の移動は、ループYOKOが「4」なら露天掘り開始位置に戻ります

        if YOKO==4 then--もしもループYOKOが「4」なら
            turtle.turnLeft()--左を向く
            for MODORU=1,9 do--ループMODORUは、1~9まで実行
                turtle.forward()--前に行く
            end--ループMODORUの終わり
            turtle.turnLeft()--左を向く
            turtle.back()--バックする

定義文字に「0」「-1」を代入することで右回りにチェストの移動、左回りのチェストの移動と分岐します
local YOKOcount=0--定義YOKOcountは「0」

YOKOcountが「0」なら左回りにチェストを移動

        elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
            turtle.turnLeft()--左を向く
            turtle.forward()--前に行く
            turtle.forward()--前に行く
            turtle.forward()--前に行く
            turtle.turnLeft()--左を向く

            YOKOcount=-1--YOKOcountを「-1」にする

YOKOcountが「-1」なら右回りにチェストを移動

        elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
            turtle.turnRight()--右を向く
            turtle.forward()--前に行く
            turtle.forward()--前に行く
            turtle.forward()--前に行く
            turtle.turnRight()--右を向く
            YOKOcount=0--YOKOcountを「0」にする

        end--もしもの終わり

チェストの上を移動するのでタートルの上下移動を組み込んでいます
--チェストの上に行く
    turtle.up()--上に行く

--チェストの横まで戻る
    turtle.down()--下に行く

チェストの配置は上に積み上げるや縦一列など色々と考えられますが、今回は一面を掘り抜くの応用として4x4の基本的な配置としています。またコンフィグを設定することでチェストの数が増えても簡単に対応可能となります。今回の輸送タートルプログラムにはMOBによる位置ずれ防止を考えていませんので問題が発生する可能性があります。


今回作成した輸送タートルのプログラムと露天掘りタートルのプログラムの組み合わせで2台のタートルでの露天掘りの動画です

タートルの配置とラージチェストの配置
条件
マイニングタートルを使用
燃料は補給済み、またはMODコンフィグにて燃料不要に設定
採掘範囲は、縦20x横20x深さ100
ユーザーの定義文字はわかりやすくするために大文字やローマ字を多用しています
プログラムエディタの Sublime Text を使用

--露天掘りのタートルのプログラム
--今回のプログラム
--露天掘りサイズのコンフィグ
local TATEsize=20--縦のサイズ
local YOKOsize=20--横のサイズ
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終わり
--今回のプログラムの終わり


次のページ「64台のタートルを動かして64x64を掘り抜く 失敗編」
前のページ「パイプの役割のタートルを追加して効率を上げる」

0 件のコメント:

コメントを投稿