1.16.5日本語化リソースパック配布

302個のMODの翻訳が完了したので YouTube にて配布いたします 。翻訳の内容など不備はありますが、無いよりはましだと思って使ってください。翻訳したMODの詳細については、まとめるのが面倒くさいので止めておきます。このリソースパックを導入することがマイクラMOD攻略の近道...

2020年2月18日火曜日

64台のタートルを動かして64x64を掘り抜く 失敗編

一番の問題は、タートルの動きが遅いってことです。そこをカバーするには、タートルの数を増やすのが最良だと言えます。同じプログラムをタートルに組み込み動作させることでこの問題を解決します。

露天掘りのタートルを32台、輸送のタートルを32台、ラージチェストを64個で採掘範囲64x64の露天掘りを行います。

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


露天掘りの範囲

露天掘りタートル1台で二列掘りぬきます



--露天掘りのタートルのプログラム
--今回のプログラム
--露天掘りサイズのコンフィグ
local TATEsize=64--縦のサイズ
local HUKASAsize=100--掘る深さ
--定義文字の設定
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まで実行
for HUKASA=1,HUKASAsize do
--タートルの露天掘り
    if OWARU==0 then--もしも定義OWARUが「0」なら
        turtle.digDown()--下を掘る
        turtle.down()--下に行く
    end--もしもの終わり
    for TATE=2,TATEsize do--ループTATEは、2~TATEsizeまで実行
        turtle.dig()--前を壊す
        SIRABETEMAENIIKU()--岩盤を調べながら前に行く
    end--ループTATEの終わり
    turtle.turnRight()--右を向く
    turtle.dig()--前を壊す
    SIRABETEMAENIIKU()--岩盤を調べながら前に行く
    turtle.turnRight()--右を向く
    for TATE=2,TATEsize do--ループTATEは、2~TATEsizeまで実行
        turtle.dig()--前を壊す
        SIRABETEMAENIIKU()--岩盤を調べながら前に行く
    end--ループTATEの終わり
    turtle.turnRight()--右を向く
    turtle.forward()--前に行く
    turtle.turnRight()--右を向く
--露天掘りを続けるか、終えるかの分岐
    if OWARU==0 then--定義OWARUが「0」なら
--アイテムの受け渡しの為にプログラムを一時停止
--定義、上を調べる、ARUは、何がある、NANIGAは、ブロック名
        while true do--無限ループ    
            local ARU,NANIGA=turtle.inspectUp()        
--もしもブロック名がアドバンスタートルなら
            if NANIGA.name=="computercraft:turtle_advanced" then
                os.sleep(1)--1秒プログラムを停止
            else--もしもアドバンスタートルでないなら
                break--無限ループを終わらせる
            end--もしもの終わり
       end--無限ループの終わり
--タートルが露天掘りを終える
    else--もしも違うなら
        break--プログラムを終わらせる
    end--もしもの終わり
end--ループHUKASA終わり
--今回のプログラムの終わり




--輸送タートルのプログラム
--今回のプログラム
--定義文字の設定
local DOWNcount=0--定義DOWNcountは「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の終わり
--1段目のチェストにアイテムを入れる     
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロットは、SLOTを選択
        turtle.drop()--前にアイテムを落とす
    end--ループSLOTの終わり
--2段目のチェストにアイテムを入れる
    turtle.up()--上に行く
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロットは、SLOTを選択
        turtle.drop()--前にアイテムを落とす
    end--ループSLOTの終わり
    turtle.down()--下に行く
--タートルの上下移動に数値を追加
    DOWNcount=DOWNcount+1--DOWNcountに「+1」追加
end--ループPIPEの終わり
--今回のプログラムの終わり

何も考えないで動かしてみたところ


数台の露天掘りタートルが砂利に行く手を阻まれていました


採掘場は水源で水浸しになりました

64x64の露天掘りとなると整地をする、水源をできるだけ消す必要があります

砂利への回避策としては
前に行く関数に「turtle.attack()--前を攻撃」の後に「turtle.dig()--前を壊す」を追加するか、露天掘り開始位置を露天掘り場所の一番高くにすることで回避できそうです。ただ輸送タートルがアイテムを受け取れないとプログラムを終えてしまいます。

輸送タートルの位置ずれの可能性が
これだけのタートルを動かすとMOBに阻まれて下降や上昇ができないことも想定に入れなければならないようです。以前使用した関数で回避する必要があります。上昇の回数は、チェストを見つけたら止まるプログラムの方が効率がよさそうです。

64x64の露天掘りをする前に整地とタートルとチェストを設置するプログラムを先に考えた方がよさそうです。あとは64台のタートルにプログラムの呼び出しをするのが大変です。

次のページ「64台のタートルを動かして64x64を掘り抜く 成功編」
前のページ「チェストの数を増やしてよりリアルな露天掘りにして完成」

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を掘り抜く 失敗編」
前のページ「パイプの役割のタートルを追加して効率を上げる」

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

今までの露天掘りプログラムは、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によるタートルの位置ずれを防止する」

2020年2月6日木曜日

関数を使用してメイン処理を簡略化

今まで作り込んだ露天掘りプログラムは、長くなってしまいタートルの動きの(メイン処理)の部分が読みづらいですので、関数を作成して読みやすいプログラムに変更します。関数というと難しく思うかもしれませんが、タートルAPIを自作すると考えてよいと思います。

関数の定義
function␣関数()
処理内容、何行でもOK
end


--タートルが上に64ブロック積み上げる関数「UPPLACE()」を定義します

function UPPLACE()--関数UPPLACE
    for UE=1,64 do--ループUEは、1~64まで実行
        turtle.up()--上に行く
        turtle.placeDown()--下に行く
    end--ループUEの終わり
end--関数UPPLACAの終わり

--関数「UPPLACE()」を使用してプログラムを作ります

UPPLACE()--関数UPPLACE
turtle.select(2)--タートルはスロット2を選択
UPPLACE()
turtle.select(3)--タートルはスロット3を選択
UPPLACE()



タートルは「64ブロック積み上げる」「スロットを変更」これを繰り返します。このようにプログラム内に何度か出てくる部分を関数としてまとめます。




--今回のプログラム
--露天掘りサイズのコンフィグ
local TATEsize=8--縦のサイズ
local YOKOsize=8--横のサイズ
local HUKASAsize=100--掘る深さ
--定義文字の設定
local DOWNcount=0--定義DOWNcountは「0」
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
        turtle.forward()--前に行く
    else--もしも違うなら
        OWARU=OWARU+1--定義OWARUに「+1」
        turtle.forward()--前に行く
    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()--下に行く
            DOWNcount=DOWNcount+1--定義DOWNcountに「+1」
        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の終わり
--タートルがチェストに戻る
--ループ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の終わり
    if OWARU==0 then--定義OWARUが「0」なら
--タートルが露天掘り場所に戻る
--ループSAGARUは、1~定義DOWNcountまで実行
        for SAGARU=1,DOWNcount do
            turtle.down()--下に行く
        end--ループSAGARUの終わり
        turtle.turnRight()--右を向く
        turtle.turnRight()--右を向く
--タートルが露天掘りを終える
    else--もしも違うなら
        break--プログラムを終わらせます
    end--もしもの終わり
end--ループHUKASA終わり
--今回のプログラムの終わり


「turtle.forward()--前に行く」の部分は、下のブロックが岩盤かどうか調べながらタートルは、前に行くプログラムとなっていますので長くなってしまっています。これを3回使用しているので関数として定義します。

関数名は「SIRABENAGARAMAENIIKU()」とします

function SIRABETEMAENIIKU()--関数の定義
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
    local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と違うなら
    if NANIGA.name~="minecraft:bedrock" then
        turtle.forward()--前に行く
    else--もしも違うなら
        OWARU=OWARU+1--定義OWARUに「+1」
        turtle.forward()--前に行く
    end--もしもの終わり
end--関数の定義の終わり


プログラム内の当てはまる部分を関数と置き換えますSIRABETEMAENIIKU()--岩盤を調べながら前に行く

プログラム内のタートルAPI、if 文、for 文などで作られた部分で何度か出てくる同じ部分を関数とすることでタートルの動き(メイン処理)の部分をわかりやすくすることができます。


次のページ「MOBによるタートルの位置ずれを防止する」
前のページ「コンフィグを設定してサイズを可変式に」

MOBによるタートルの位置ずれを防止する

無敵のタートルなんですが、動物やモンスターを壁際まで押し込み前に行けずに位置ずれ起こしてしまいます。そこで無限ループを使用して攻撃、前に行けたら無限ループを終了というプログラムを関数で定義して確実にチェストに戻ってくるようにします。またタートルは上下移動でのエラーを起こさないように移動のAPIを関数化します。


MOBがたくさんいますがエラーを出しません


最下部は岩盤になりタートルは仕事を終えてチェストに戻って来ました


無限ループ
while␣true␣ do
処理内容
break--無限ループを終える時
end


--今回のプログラム
--露天掘りサイズのコンフィグ
local TATEsize=8--縦のサイズ
local YOKOsize=8--横のサイズ
local HUKASAsize=100--掘る深さ
--定義文字の設定
local DOWNcount=0--定義DOWNcountは「0」
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--関数の定義の終わり
--タートルが下に行く関数の定義
function SITANIIKU()--絶対に下に行く関数
    if turtle.down() then--もしも①下に行けたら終わり
    else--もしも①違うなら
        while true do--無限ループを実行
            turtle.attackDown()--下を攻撃
            if turtle.down() then--もしも②下に行けたら終わり
              break--無限ループのブレーク
            end--もしも②の終わり
        end--無限ループの終わり
    end--もしも①の終わり
end--関数の終わり
--タートルが上に行く関数の定義
function UENIIKU()--絶対に上に行く関数
    if turtle.up() then--もしも①上に行けたら終わり
    else--もしも①違うなら
        while true do--無限ループを実行
            turtle.attackUp()--上を攻撃
            if turtle.up() then--もしも②上に行けたら終わり
              break--無限ループのブレーク
            end--もしも②の終わり
        end--無限ループの終わり
    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()--下を掘る
            SITANIIKU()--絶対に下に行く関数
            DOWNcount=DOWNcount+1--定義DOWNcountに「+1」
        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の終わり
--タートルがチェストに戻る
--ループAGARUは、1~定義DOWNcountまで実行
    for AGARU=1,DOWNcount do
        UENIIKU()--絶対に上に行く関数
    end--ループAGARUの終わり
--タートルがチェストにアイテムを入れる
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
    if OWARU==0 then--定義OWARUが「0」なら
--タートルが露天掘り場所に戻る
--ループSAGARUは、1~定義DOWNcountまで実行
        for SAGARU=1,DOWNcount do
            SITANIIKU()--絶対に下に行く関数
        end--ループSAGARUの終わり
        turtle.turnRight()--右を向く
        turtle.turnRight()--右を向く
--タートルが露天掘りを終える
    else--もしも違うなら
        break--プログラムを終わらせます
    end--もしもの終わり
end--ループHUKASA終わり
--今回のプログラムの終わり




前回定義した関数を改良してMOBに行く手を阻まれた時でも、攻撃をして前に行けるまで何度でも攻撃、前に行くを無限ループを組み込みました。

if turtle.forward() then--もしも①前に行けたら終わり
else--もしも①違うなら
    while true do--無限ループを実行
        turtle.attack()--前を攻撃
        if turtle.forward() then--もしも②前に行けたら終わり
            break--無限ループを終える
        end--もしも②の終わり
    end--無限ループの終わり
end--もしも①の終わり

上記を関数「SIRABETEMAENIIKU()」の「turtle.forward()--前に行く」2か所を置き換えることで下の岩盤ブロックを調べながら確実に前に行けるようになります。

もしも①で前に行けたら最後の「end」まで進みます
もしも①で前に行けなかったら「while true do」で無限ループを実行します
タートルは「turtle.attack()--前を攻撃」
もしも②の前に行けたら「break」で無限ループを終わります
もしも②で前に行けなかったら「while true do」でこれを繰り返します


同じように下に行く関数、上に行く関数も定義します。考え方は前に行くと同じです

--タートルが下に行く関数の定義
function SITANIIKU()--絶対に下に行く関数
    if turtle.down() then--もしも①下に行けたら終わり
    else--もしも①違うなら
        while true do--無限ループを実行
            turtle.attackDown()--下を攻撃
            if turtle.down() then--もしも②下に行けたら終わり
              break--無限ループのブレーク
            end--もしも②の終わり
        end--無限ループの終わり
    end--もしも①の終わり
end--関数の終わり

この関数を--タートルの露天掘り部分と--タートルが露天掘り場所に戻るの部分の
「turtle.down()--下に行く」と置き換えます


--タートルが上に行く関数の定義
function UENIIKU()--絶対に上に行く関数
    if turtle.up() then--もしも①上に行けたら終わり
    else--もしも①違うなら
        while true do--無限ループを実行
            turtle.attackUp()--上を攻撃
            if turtle.up() then--もしも②上に行けたら終わり
              break--無限ループのブレーク
            end--もしも②の終わり
        end--無限ループの終わり
    end--もしも①の終わり
end--関数の終わり


--タートルがチェストに戻るの部分の「turtle.up()--上に行く」と置き換えます


無限ループで「attack」で攻撃しているので位置ずれは発生しません。適正ツールを考えると右手にダイヤ剣かダイヤ斧、左手にダイヤツルハシの両手持ちで自動使い分けをしてくれます。

ツールの取り外しコマンド

右手にツールを持たせる
equip スロットNO right

左手にツールを持たせる
equip スロットNO left

右手のアイテムを外す
unequip right

左手のアイテムを外す
unequip left


これで今の私の頭で考えた露天掘りプログラムは終わりです。岩盤でプログラムを終えるぐらいから、やり過ぎた感があるんですが、「考える力」を身に付けることができました。「素晴らしいMOD」って実感できました。

露天掘りの部分はこれで終わりなんですが、目指すのはビルドクラフトのクアーリーですので、これからはアイテム輸送を考えていきます。


次のページ「パイプの役割のタートルを追加して効率を上げる」
前のページ「関数を使用してメイン処理を簡略化」

関連コンテンツ