2020年3月1日日曜日

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

前回の失敗を踏まえてプログラムを大幅に変更しました。これで「露天掘りを極める」は終了となります。とにかくエラーが発生しないこととプログラムの終了時のタートルの位置は、スタート時と同じになることを重視してプログラムは組まれています。

タートルとチェストの設置用のプログラムも作成しました。地面より6ブロック分高く設置するので露天掘りの場所を整地する必要がありません。
※露天掘りの範囲の水抜きは必要です



条件
タートルの燃料は、コンフィグにて必要なし
アドバンスマイニングタートルを使用しています
定義文字は、大文字やローマ字を使用しています

露天掘りのサイズ:64x64
深さ:Y値70以下が妥当です
露天掘りタートル:32台
輸送タートル:32台
ラージチェスト:32個x三段

※無限水源の処理と溶岩の処理は、プレーヤーが行わなければなりません


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


露天掘りタートルのプログラムのポイント

露天掘りタートルの位置ずれは、致命的なエラーでタートルは失踪してしまいます。「前に行けなかったら」「前を攻撃、前を壊す」を無限ループで繰り返します。前に行けたらループを終えます。この関数MAENIIKUをプログラム内の trtle.forward() と置き換えます。これでMOBと砂利を対策できます。

--絶対前に行く関数function MAENIIKU()--関数名MAENIIKU
    if turtle.forward() then--もしも①前に行けたらendまで飛ぶ
    else--もしも①前に行けなかったら
        while true do--無限ループを実行
            turtle.attack()--前を攻撃
            turtle.dig()--前を壊す
            if turtle.forward() then--もしも②前に行けたら
                break--前に行けたら無限ループを終わらせる

Y値が低くなると輸送タートルの移動距離が長くなりアイテムの受け渡し地点に露天掘りタートルの方が早く着く可能性もあるので、露天掘りタートル無限ループで上のブロックが輸送タートルでない場合は一時停止します。

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

露天掘りの再開は、「輸送タートルが上にある」「アイテムを受け渡す」「輸送タートルが上に上がる」「プログラムを終えない」この順番で考えています。

--定義、上を調べる、ARUは、何がある、NANIGAは、ブロック名
        local ARU,NANIGA=turtle.inspectUp()        
--もしもブロック名がアドバンスタートルでないなら
        if NANIGA.name~="computercraft:turtle_advanced" then
                break--無限ループを終わらせる
            end--もしもの終わり
       end--無限ループの終わり

プログラムの終了点は、ループHUKASAの終わりか岩盤がタートルの下に出現した場合になります。定義OWARUが「1」以上になった場合、ループHUKASAを抜けてチェストまで戻って来ます。180秒のプログラムの停止は、輸送タートルがプログラムを終了してスタート地点まで戻るまでの待機時間です。

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

--プログラムを終了するかの分岐
    if OWARU~=0 then--もしも定義OWARUが「0」でないなら
        os.sleep(180)--180秒プログラムの停止




--輸送タートルのプログラム
--定義文字の設定
local DOWNcount=0--定義DOWNcountは「0」
local OWARU=0--定義OWARUは「0」
--絶対下に行く関数
function SITANIIKU()--関数名SITANIIKU
    if turtle.down() then--もしも①下に行けたらendまで飛ぶ
    else--もしも①下に行けなかったら
        while true do--無限ループを実行
            turtle.attackDown()--下を攻撃
            turtle.digDown()--下を攻撃
            if turtle.down then--もしも②下に行けたら
                break--無限ループを終わらせる
            end--もしも②の終わり
        end--無限ループの終わり
    end--もしも①の終わり
end--関数の定義の終わり
--絶対上に行く関数
function UENIIKU()--関数名UENIIKU
    if turtle.up() then--もしも①上に行けたらendまで飛ぶ
    else--もしも②上に行けなかったら
        while true do--無限ループを実行
            turtle.attackUp()--上を攻撃
            turtle.digUp()--上を攻撃
            if turtle.up then--もしも②上に行けたら
                break--無限ループを終わらせる
            end--もしも②の終わり
        end--無限ループの終わり
    end--もしも①の終わり
end--関数の定義の終わり
--タートルの位置を合わせる動き
turtle.turnLeft()--左を向く
turtle.forward()--前に行く
turtle.turnLeft()--左を向く
--メイン処理
for PIPE=1,100 do--ループPIPEは、1~100まで実行
--採掘アイテムを受け取りに行く
--ループSAGARUは、1~DOWNcountまで実行
    for SAGARU=1,DOWNcount do
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
        local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名がタートルであり
        if NANIGA.name=="computercraft:turtle_advanced" and
            PIPE>50 then--ループPIPEが「50」より大きいなら
            OWARU=1--定義OWARUを「1」にする
            break--ループSAGARUを終える
        else--もしもタートルでないなら
            SITANIIKU()--絶対下に行く関数
        end--もしもの終わり
    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」でないなら
        OWARU=0--定義OWARUを「0」にする
    end--もしもの終わり
--チェストに戻る
--ループAGARUは、1~100まで実行
    for AGARU=1,100 do
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
        local ARU,NANIGA=turtle.inspect()
--もしもブロック名がチェストなら
        if NANIGA.name=="minecraft:chest" then
            break--ループAGARUを終わらせる
        else--もしもチェストでないなら
            UENIIKU()--絶対上に行く関数
        end--もしもの終わり
    end--ループAGARUの終わり
--プログラムを終了するかの分岐
    if OWARU==0 then--もしも①定義OWARUが「0」なら
--1,2,3段目のチェストにアイテムを入れる
        for CHEST=1,3 do--ループCHESTは、1~3まで実行
            for SLOT=1,16 do--ループSLOTは、1~16まで実行
                turtle.select(SLOT)--タートルスロットは、SLOTを選択
                turtle.drop()--前にアイテムを落とす
            end--ループSLOTの終わり
            if CHEST<3 then--もしもループCHESTが「3」より小さいなら
                turtle.up()--上に行く
            end--もしもの終わり
        end--ループCHESTの終わり
        turtle.down()--下に行く
        turtle.down()--下に行く
    else--もしも定義OWARUが「0」でないなら
--スタート位置に戻る動き
        turtle.turnLeft()--左を向く
        turtle.forward()--前に行く
        turtle.turnLeft()--左を向く
        break--ループHUKASAを終えてプログラムの終了
    end--もしもの終わり  
--タートルの下移動に数値を追加
    DOWNcount=DOWNcount+1--DOWNcountに「+1」追加
end--ループPIPEの終わり
--輸送タートルのプログラムの終わり


輸送タートルのプログラムのポイント

上下移動しかしない輸送タートルは、エラーが出ないと思っていましたが何が起こるかわからないのがマイクラです。「絶対下に行く関数」と「絶対下に行く関数」が必要となります。

--絶対下に行く関数
function SITANIIKU()--関数名SITANIIKU
    if turtle.down() then--もしも①下に行けたらendまで飛ぶ
    else--もしも①下に行けなかったら
        while true do--無限ループを実行
            turtle.attackDown()--下を攻撃
            turtle.digDown()--下を攻撃
            if turtle.down then--もしも②下に行けたら
                break--無限ループを終わらせる

--絶対上に行く関数
function UENIIKU()--関数名UENIIKU
    if turtle.up() then--もしも①上に行けたらendまで飛ぶ
    else--もしも②上に行けなかったら
        while true do--無限ループを実行
            turtle.attackUp()--上を攻撃
            turtle.digUp()--上を攻撃
            if turtle.up then--もしも②上に行けたら
                break--無限ループを終わらせる

プログラムの終了点は「下のブロックが露天掘りタートルである」「ループHUKASAが50より大きい」「アイテムの受け渡し後スロット1が空である」この3条件でプログラムを終えるようにしています。

下のブロックがタートル and ループPAIPE>50
定義OWARUを「1」にします

スロット1のアイテムが「0」でないなら
定義OWARUを「0」に戻します

定義OWARUが「1」なら
ループPIPEを抜けてスタート地点に戻ります


--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
        local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名がタートルであり
        if NANIGA.name=="computercraft:turtle_advanced" and
            PIPE>50 then--ループPIPEが「50」より大きいなら
            OWARU=1--定義OWARUを「1」にする
            break--ループSAGARUを終える
        else--もしもタートルでないなら
            SITANIIKU()--絶対下に行く関数
        end--もしもの終わり
    end--ループSAGARUの終わり

--アイテムを受け取ったか、受け取らなかったか
    if turtle.getItemCount(1)~=0 then--スロット1のアイテムが「0」でないなら
        OWARU=0--定義OWARUを「0」にする
    end--もしもの終わり

--プログラムを終了するかの分岐
    if OWARU==0 then--もしも①定義OWARUが「0」なら

露天掘りタートルは、岩盤を見つけても一面は掘るのでインベントリ内にアイテムがありますので輸送タートルは、一度チェストにアイテムを入れに行きます。次のループでアイテムを入手できなければスタート地点に戻ります。

チェストに戻る動きのループAGARUは、定義DOWNcountの数だけ上がるのではなく「前のブロックがチェストなら」としています。絶対上に行く関数と合わせて使用することでエラー回避できます。

--チェストに戻る
--ループAGARUは、1~100まで実行
    for AGARU=1,100 do
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
        local ARU,NANIGA=turtle.inspect()
--もしもブロック名がチェストなら
        if NANIGA.name=="minecraft:chest" then
            break--ループAGARUを終わらせる
        else--もしもチェストでないなら
            UENIIKU()--絶対上に行く関数
        end--もしもの終わり
    end--ループAGARUの終わり


MODとの連携

スーパーフラットで露天掘りをしても面白くはありません。マイクラの自然生成のワールドでは、64X64の広範囲の露天掘りを行うとなると場所が問題となります。タートルにポンプ機能がないので水源があると露天掘りした場所が水浸しになってしまいますし、タートルとチェストを設置する場所の決めるのも難しいです。


プログラムを組んでタートルで整地をしてもいいんですが、やはり水源が問題となりそうなので、MODの力で整地します。

使用するMODは、Additional Enchanted Miner



Chunk Destroyer で採掘範囲を可視化します


GUIを開いて範囲を指定します、4x4で設定


改良型ランドマークを4隅に設置して右クリックで赤のラインが出ます


改良型ランドマークの横に改良型露天採掘機を設置


採掘機を右クリックでGUIを開き、無限エネルギーモジュールと液体回収モジュールを入れると動き出します


採掘機レベル設定用具で採掘機を右クリック


採掘する深さを設定できます、Y値70まで整地します


露天掘り用と輸送用のタートルとチェストを設置


結果は無限水源によって失敗に終わりました、水流を見つけたら手遅れになる前に処理する必要があります。そもそもクアーリーで整地するならそのまま露天掘りでタートルは、必要ありません、これは茶番です。


設置タートルのプログラム

何度も整地をしてタートルとチェストを大量に設置してプログラムを起動するのは、面倒くさいので整地と設置のプログラムを考えます。
地面より高い位置から露天掘りを開始すれば整地の必要がありません。

local TAKASA=6

この数値で露天掘りを開始する高さを変更できますが、Y値が大きくなると輸送タートルの上下移動の距離が長くなり効率が悪くなりますので地面から10ブロック以下の妥当です。

大量のタートルとチェストを自動で設置


タートルは空中にブロックを設置できるので整地することなく露天掘りをスタート

設置タートルの設置と露天掘りの場所の関係は、図のようになります


設置タートルのインベントリ
スロット1:露天掘りタートル32台
スロット2:輸送タートル32台
スロット3,4,5:チェスト64個


露天掘りタートルと輸送タートルとチェストの設置のイメージ図です


--設置タートルのプログラム
local TAKASA=6
turtle.turnRight()
for AGARU=1,TAKASA do
    turtle.up()
end
for TURTLE=1,32 do
    turtle.turnLeft()
    turtle.select(1)
    turtle.placeDown()
    turtle.turnRight()
    turtle.forward()
    turtle.turnLeft()
    turtle.select(2)
    turtle.placeDown()
    turtle.turnRight()
    turtle.forward()
end
turtle.back()
turtle.back()
turtle.turnRight()
turtle.forward()
turtle.turnRight()
turtle.down()
for DAN=1,3 do
    turtle.up()
    turtle.select(DAN+2)
    for LARGE=1,2 do
        turtle.placeDown()
        for CHEST=1,31 do
            turtle.forward()
            turtle.forward()
            turtle.placeDown()
        end
        turtle.turnLeft()
        turtle.forward()
        turtle.turnLeft()
    end
end

0 件のコメント:

コメントを投稿