マインクラフト非公式ユーザーフォーラムからMODをダウンロードする方法

見れなくなった非公式フォーラムからMODをダウンロード、Wayback Machine( ウェイバックマシン)をネット上で使用して消えてしまったサイトを見れるようにしてダウンロードします。ダウンロード方法はMODの保管場所によって変わってきます。 今回試しにダウンロードしたM...

2020年1月26日日曜日

岩盤に到達したらプログラムを終える(成功編)

前回失敗したプログラムを考え直しました。岩盤は凸凹しているので出現場所はわかりません。そこで今回はタートルは、下を調べながら前に進む、岩盤を見つけたらチェストに戻りプログラムを終える、このようにプログラムを組み替えました。





--今回のプログラム
local DOWNcount=0--定義DOWNcountは「0」
local YOKOcount=0--定義YOKOcountは「0」
local OWARU=0--定義OWARUは「0」
for HUKASA=1,100 do--一面を百回掘るループHUKASA
    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,8 do--ループYOKOは、1~8まで実行
            for TATE=2,8 do--ループTATEは、1~8まで実行
                turtle.dig()--前を壊す
--定義、下を調べる、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--ループTATEの終わり
            if YOKO==8 then--もしもループYOKOが「8」なら
                if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
                    else--もしも違うなら
                        turtle.turnRight()--右を向く
                        turtle.turnRight()--右を向く
                end--もしもの終わり
            elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
                turtle.turnRight()--右を向く
                turtle.dig()--前を壊す
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
                local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と違うなら
                if NANIGA.name~="minecraft:bedrock" then
                     turtle.forward()--前に行く
                else--もしも違うなら
                    OWARU=OWARU+1--定義OWARUに「+1」
                    turtle.forward()--前に行く
                end--もしもの終わり
                turtle.turnRight()--右を向く
                YOKOcount=-1--YOKOcountを「-1」に変更
            elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
                turtle.turnLeft()--左を向く
                turtle.dig()--前を壊す
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
                local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と違うなら
                if NANIGA.name~="minecraft:bedrock" then
                     turtle.forward()--前に行く
                else--もしも違うなら
                    OWARU=OWARU+1--定義OWARUに「+1」
                    turtle.forward()--前に行く
                end--もしもの終わり
                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終わり
--今回のプログラムの終わり


プログラムの解説

下のブロックを調べながら進み岩盤ブロックを見つけます。文字「OWARU」を定義して岩盤を見つけたら「OWARU」に数字を加えていきます。

local OWARU=0--定義OWARUは「0」
定義文字の「OWARU」を「0」と設定します


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

この if 文を
turtle.forward()--前に行く
の部分と置き換えます

turtle.inspectDown()--下のブロックを調べる
このタートルAPIを使用して、まず下のブロックを調べます
~="minecraft:bedrock" then--岩盤でないなら
「前に行く」
else--岩盤なら
「定義OWARUに+1」「前に行く」

チェストに戻ってアイテムを入れた後に分岐を作ります。定義文字の「OWARU」は、上の if 文で岩盤を見つけたら「1」加算されます。「OWARU」が「0」ならタートルは、チェストにアイテムを入れたら下降してループ「HUKASA」を繰り返します。「OWARU」が「1」以上なら「break」でプログラムを終了します。

if OWARU==0 then--定義OWARUが「0」なら
チェストに戻る前に分岐を作ります

else--定義OWARUが「0」以外なら

break--プログラムを終わらせます
でプログラムを終了します。



タートルのチェストに戻る、採掘に戻るの上下の動きは、今まではループ「HUKASA」の回数x2でしたが、一段目掘り進んだ時にタートルの下のブロックに岩盤が現れたら1ブロック分タートルの位置がチェストの上まで行ってしまいます。
そこで定義で「DOWNcount」を定めタートルがダウンした数をカウントしていきます。

local DOWNcount=0--定義DOWNcountは「0」

プログラム内のタートルがダウンした後にカウントします
turtle.down()--下に行く
DOWNcount=DOWNcount+1--定義DOWNcountに「+1」

ループAGARU、ループSAGARUの終了値を「DOWNcount」までとします
--ループAGARUは、1~定義DOWNcountまで実行
    for AGARU=1,DOWNcount do

--ループSAGARUは、1~定義DOWNcountまで実行
        for SAGARU=1,DOWNcount do


9台のタートルを4x4の範囲で動かしてみました


岩盤まで到達したタートルは、チェストにアイテムを入れて停止


岩盤が出現したところで露天掘りは終了


水浸しでも大丈夫でした


溶岩でも大丈夫でした
9台のタートルは、エラーを起こすことなくプログラムを終了しました。このプログラムでの露天掘りを終える処理は、理論的には問題はないと思いますが、マイクラのワールドは何が起こるかわかりませんので、やはりタートルの位置ずれや失踪は、起こってしまいましたが原因が不明なのでとりあえず成功とします。



次のページ「コンフィグを設定してサイズを可変式に」
前のページ「岩盤に到達したらプログラムを終える(失敗編)」

岩盤に到達したらプログラムを終える(失敗編)

下方向に掘りぬいていくと岩盤が出現します。ランダムな地形の生成が魅力のマイクラですので、露天掘りをする場所の深さ(Y値)は不明。そこで岩盤に到達したらプログラムを終える方法について考えたいと思います。

使用するタートルAPIは、turtle.inspectDown()--下を調べる

まず前回作成したプログラムの最後、ループHUKASAの終わりの前に以下のプログラムを追加しました。

--1.のプログラム
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
    local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と同じなら
    if NANIGA.name=="minecraft:bedrock" then
--ループAGARUは、1~ループHUKASAx2まで実行
        for AGARU=1,HUKASA*2 do
            turtle.up()--上に行く
        end--ループAGARUの終わり
        break--プログラムを終える
    end--もしもの終わり
--1.のプログラムの終わり

1.のプログラムの考え方
タートルはチェストにアイテムを入れた後に採掘再開まで下降します。その時に下のブロックを調べるタートルAPIを使用して岩盤ならタートルが下がった分だけ上昇してプログラム全体を繰り返すループHUKASAを終了します。


--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
local ARU,NANIGA=turtle.inspectDown()

定義文字に「ARU」「NANIGA」作り、下のブロックを調べます
local␣ ブロックがあるか,何があるか=turtle.inspectDown()
「ARU」「NANIGA」に返り値を当てはめさせます

turtle.inspectDown()--下のブロックを調べる
岩盤の上でタートルに「lua」エンター
turtle.inspectDown()、エンター
こうすると下のブロック情報を調べることができます

まずブロックがある「true」を返します
次にブロックのデータを返します
ブロックのデータの中の「name = "minecraft:bedrok"」と比べて同じならプログラムを終了させます

--もしもブロック名が岩盤と同じなら
if NANIGA.name=="minecraft:bedrock" then
if␣定義名.name=="マインクラフト:ブロックID"␣then
このような形式で書くことでブロック名を比べることができます

break--プログラムを終える
プログラムを終了させることができます。ただこの後に処理がある場合はプログラム全体を終えることはできませんので、ループHUKASAの「end」前に書き込む必要があります。

        for AGARU=1,HUKASA*2 do
            turtle.up()--上に行く
        end--ループAGARUの終わり
        break--プログラムを終える
    end--もしもの終わり
end--ループHUKASA終わり




--今回のプログラム
local YOKOcount=0--定義YOKOcountは「0」
for HUKASA=1,100 do--一面を百段掘るループHUKASA
    for OUHUKU=1,2 do--ループOUHUKUは、1~2まで実行
        turtle.digDown()--下を掘る
        turtle.down()--下に行く
        for YOKO=1,8 do--ループYOKOは、1~8まで実行
            for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
                turtle.dig()--前を壊す
                turtle.forward()--前に行く
            end--ループTATEの終わり
            if YOKO==8 then--もしもループYOKOが「8」なら
                if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
                else--違うなら次の処理をしてループOUHUKUの2回目を処理
                    turtle.turnRight()--右を向く
                    turtle.turnRight()--右を向く
                end--もしもの終わり
            elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
                turtle.turnRight()--右を向く
                turtle.dig()--前を壊す
                turtle.forward()--前に行く
                turtle.turnRight()--右を向く
                YOKOcount=-1--YOKOcountを「-1」に変更
            elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
                turtle.turnLeft()--左を向く
                turtle.dig()--前を壊す
                turtle.forward()--前に行く
                turtle.turnLeft()--左を向く
                YOKOcount=0--YOKOcountを「0」に変更
            end--もしもの終わり    
        end--ループYOKOの終わり
    end--ループOUHUKUの終わりw
--ループAGARUは、1~ループHUKASAx2まで実行
    for AGARU=1,HUKASA*2 do
        turtle.up()--上に行く
    end--ループAGARUの終わり
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
--ループSAGARUは、1~ループHUKASAx2まで実行
    for SAGARU=1,HUKASA*2 do
        turtle.down()--下に行く
    end--ループSAGARUの終わり
    turtle.turnRight()--右を向く
    turtle.turnRight()--右を向く
--1.のプログラム
--定義、下を調べる、ARUは、何がある、NANIGAは、ブロック名
    local ARU,NANIGA=turtle.inspectDown()
--もしもブロック名が岩盤と同じなら
    if NANIGA.name=="minecraft:bedrock" then
--ループAGARUは、1~ループHUKASAx2まで実行
        for AGARU=1,HUKASA*2 do
            turtle.up()--上に行く
        end--ループAGARUの終わり
        break--ブレークする
    end--もしもの終わり
--1.のプログラムの終わり
end--ループHUKASA終わり
--今回のプログラムの終わり




プログラムを動かした結果
岩盤が整地されていないので「1」の位置の下のブロックに岩盤が必ず最初に現れるとは限らないので失敗でした。岩盤に行く手を阻まれて位置ずれを起こしてしまいました。このプログラムは岩盤が平たん化されていないと使えません。

チェストから採掘開始の位置ブロック目が岩盤でないとプログラムは終わりません


そして岩盤に行く手を阻まれてしまい位置ずれを起こしました


次のページ「岩盤に到達したらプログラムを終える(成功編)」
前のページ「往復の採掘でクアーリーの動きを再現」

2020年1月25日土曜日

露天掘りを極める

コンピュータークラフトでタートルをクアーリーのように動かす究極のプログラムを作成していきます。プログラムの基礎から応用まで、これを見たら誰でも簡単にわかるプログラムとなるようにサイトを目指していきます。

※プログラムに関しては全く知識はありませんので、間違いや勘違いなど多々あるかと思いますが、タートルは目的通りに動いていますので、取りあえず良しとしています。



パート1
基礎
プログラムを組む基本的なことを紹介します。まずはタートルを動かしてみることが重要です。プログラムは難しいの先入観を捨てましょう。

パート2
タートルに組み込まれているAPI(プログラム)の一覧です。turtle.xxxx()このような名前になっています。これをプログラミング言語で組み上げていきます。


パート3
外部ツールを使用してプログラムを書きます。コピペを多用すれば文字入力は少なくてすみますので子供でもプログラミングが可能になります。


パート4
基本となる一列を掘り進むプログラム
タートルの動きを想像して連続した処理は、ループカウンターを設置しましょう。ループカウンターだけでもプログラムは十分書くことができます。




パート5
右回り左回りに列を移動する
折り返し点とスタート側で列の移動を考えていきます。タートルが位置ずれを起こさないようにひとつひとつの動作を考えていきます。


パート6
列の移動のループを作成して一面を掘りぬく
いちばん簡単な一面を掘りぬくプログラムが完成します。この動きが理解できればプログラムで色々なことができるようになります。


パート7
スタート地点に戻りチェストにアイテムを入れる
一面を掘りぬいた後は、また一段下に掘らなければなりません。確実スタート地点に戻って下に掘るループを組み込みます。これで露天掘りプログラムは完成です。


パート8
if 文を使用して列の移動を終える
完成した露天掘りプログラムを改良していきます。if 文を使用して分岐点を作りますが、まだ理解できる範囲だと思いますので頑張ってチャレンジしてもらいたいです。


パート9
if 文で多重分岐で列の移動を管理
local 定義=0 を使用して分岐を増やしていきます。定義の数値を変更することで、タートルの横移動を管理します。


パート10
往復の採掘でクアーリーの動きを再現
一面を掘りぬいた後に二段目は戻りながら掘り進んでいきます。if 文をの中に if 文を入れ込んでループの終わりを組み込みます。


パート11
岩盤に到達したらプログラムを終える(失敗編)
ブロックのデータを調べるタートルAPIを使いこなせればプログラムの幅が大きく広がります。プログラム自体は失敗ですが、ある意味成功です。


パート12
岩盤に到達したらプログラムを終える(成功編)
失敗編から考えて出た結論です。プログラム的には完璧ですが、何があるかはわからないのがマイクラです。とりあえず今は成功としておきます。


パート13
コンフィグを設定してサイズを可変式に
「local␣定義=数値」で縦のサイズ、横のサイズを変更できるようにします。コンフィグ値を変更するだけで簡単にサイズを変えることができます。


パート14
関数を使用してメイン処理を簡略化
ブロックを調べながら前に進む部分を関数として定義、プログラムが読みやすくなり問題点や変更点を見つけやすくなります。


パート15
MOBによるタートルの位置ずれを防止する
タートルはMOBに行く手を阻まれて前に進めなくてもプログラムは実行され続けます。これがタートルの失踪の原因です。「while␣true␣ do」無限ループで回避します。


パート16
パイプの役割のタートルを追加して効率を上げる
露天掘りタートルのチェストに戻る上下移動の時間を短縮します。コンピュータークラフトは、タートルの動きの遅さが弱点です。


パート17
チェストの数を増やしてよりリアルな露天掘りにして完成
16個のラージチェストと露天掘りと輸送の2台のタートルにプログラムを組んで完全自動露天掘りプログラムが完成しました。


パート18
64台のタートルを動かして64x64を掘り抜く 失敗編
露天掘りタートルは砂利に行く手を阻まれ、輸送タートルのエラーが多発、無限水源による水害、タートルの台数が多いと何らかの不具合があることが判明。


パート19
64台のタートルを動かして64x64を掘り抜く 成功編
プログラムをきれいに終わらせることを考えるとエラーを出さないことが重要だと思います。何が起こるかわからないのがマイクラ!やりつくしました。


関連サイト
プログラム脱初心者を目指してシリーズ化しました。マイクラのMODをやりつくした人やこれからプログラムを始めたい人には、お勧めのサイトとなっています。思い通りにタートルが動いたときは、きっと感動するでしょう。

関連サイト
コンピュータークラフトを極める その2
高度なプログラムとして自動植林や農業の自動化などを中心として進めていきます。スロットのAPIで限りあるタートルのスロットの管理やインスペクトAPIでタートルにブロックを調べて何かをするなどが中心となります。

関連サイト
コンピュータークラフトを極める その3
自動農業を中心に考えたプログラムです。メタデータで作物の成長度合いで判別したりタートルのスロット操作を主に取り扱っています。水源の有効範囲が決まっているので、タートルの動きが少なくなり意外と楽かもしれません。

往復の採掘でクアーリーの動きを再現

今までのプログラムでは、タートルは一面を掘りぬいた後スタート地点に戻って二段目を掘りぬく、またスタート地点に戻るを繰り返していましたが、今回のプログラムは一面を掘りぬいた後に「下を掘り、一段下がる」「戻りながら掘り進んでいく」ように改良してクアーリーの露天掘りに近づけます。

タートルのAPIはこちらで確認できます

--前回のプログラム
local YOKOcount=0--定義YOKOcountは「0」
for HUKASA=1,100 do--一面を百段掘るループHUKASA
    turtle.digDown()--下を掘る
    turtle.down()--下に行く
    for YOKO=1,8 do--ループYOKOは、1~8まで実行
        for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
        end--ループTATEの終わり
        if YOKO==8 then--もしもループYOKOが「8」なら
            turtle.turnRight()--右を向いてスタート方向を向く
            for HOME=2,8 do--ループHOMEは、2~8まで実行
                turtle.forward()--前に行く
            end--ループHOMEの終わり
            YOKOcount=0--YOKOcountを「0」に変更
        elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
            turtle.turnRight()--右を向く
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
            turtle.turnRight()--右を向く
            YOKOcount=-1--YOKOcountを「-1」に変更
        elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
            turtle.turnLeft()--左を向く
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
            turtle.turnLeft()--左を向く
            YOKOcount=0--YOKOcountを「0」に変更
        end--もしもの終わり
    end--ループYOKOの終わり
    turtle.turnLeft()--左を向く(チェストの方を向く)
    for AGARU=1,HUKASA do--ループAGARUは、1~ループHUKASAまで実行
        turtle.up()--上に行く
    end--ループAGARUの終わり
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
    for SAGARU=1,HUKASA do--ループSAGARUは、1~ループHUKASAまで実行
        turtle.down()--下に行く
    end--ループSAGARUの終わり
    turtle.turnRight()--右を向く
    turtle.turnRight()--右を向く
end--ループHUKASA終わり
--前回のプログラムの終わり




改良します

--今回のプログラム
local YOKOcount=0--定義YOKOcountは「0」
for HUKASA=1,100 do--一面を百段掘るループHUKASA
    for OUHUKU=1,2 do--ループOUHUKUは、1~2まで実行
        turtle.digDown()--下を掘る
        turtle.down()--下に行く
        for YOKO=1,8 do--ループYOKOは、1~8まで実行
            for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
                turtle.dig()--前を壊す
                turtle.forward()--前に行く
            end--ループTATEの終わり
            if YOKO==8 then--もしもループYOKOが「8」なら
                if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
                else--違うなら次の処理をしてループOUHUKUの2回目を処理
                    turtle.turnRight()--右を向く
                    turtle.turnRight()--右を向く
                end--もしもの終わり
            elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
                turtle.turnRight()--右を向く
                turtle.dig()--前を壊す
                turtle.forward()--前に行く
                turtle.turnRight()--右を向く
                YOKOcount=-1--YOKOcountを「-1」に変更
            elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
                turtle.turnLeft()--左を向く
                turtle.dig()--前を壊す
                turtle.forward()--前に行く
                turtle.turnLeft()--左を向く
                YOKOcount=0--YOKOcountを「0」に変更
            end--もしもの終わり    
        end--ループYOKOの終わり
    end--ループOUHUKUの終わり
--ループAGARUは、1~ループHUKASAx2まで実行
    for AGARU=1,HUKASA*2 do
        turtle.up()--上に行く
    end--ループAGARUの終わり
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
--ループSAGARUは、1~ループHUKASAx2まで実行 
    for SAGARU=1,HUKASA*2 do
        turtle.down()--下に行く
    end--ループSAGARUの終わり
    turtle.turnRight()--右を向く
    turtle.turnRight()--右を向く
end--ループHUKASA終わり
--今回のプログラムの終わり

ループOUHUKUを設置して2回実行するようにします。1回目処理でタートルは、「64」の位置で「右を向く」を2回行い、一段下に下がり「63」から「1」まで逆方向に掘り進んでいきます。それに伴い、列の移動方法も右左が逆になりますので、YOKOcountの部分を考える必要があります。またループOUHUKUの2回目の終わりを「if」文で設定します。



※プログラムのポイント
一面を掘りぬくループOUHUKUを2回繰り返して二面を掘りぬきます。ループOUHUKU先頭に「一段下を掘り、下がる」を含ませることが重要です。

for OUHUKU=1,2 do--ループOUHUKUは、1~2まで実行
    turtle.digDown()--下を掘る

    turtle.down()--下に行く
~一面を掘りぬくループYOKO~
end--ループOUHUKUの終わり

※プログラムのポイント
一面を掘りぬく処理を往復しますので、スタート位置に戻る必要がなくなります。一番目の分岐「ループYOKOが終わりなら右を向いてスタート位置まで戻る」を変更します。

if YOKO==8 then--もしもループYOKOが「8」なら
    turtle.turnRight()--右を向いてスタート方向を向く
    for HOME=2,8 do--ループHOMEは、2~8まで実行
        turtle.forward()--前に行く
    end--ループHOMEの終わり

    YOKOcount=0--YOKOcountを「0」に変更
   ↓if YOKO==8 then--もしもループYOKOが「8」なら
    if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
    else--違うなら次の処理をしてループOUHUKUを終える
        turtle.turnRight()--右を向く
        turtle.turnRight()--右を向く
    end--もしもの終わり

if OUHUKU==2 then--もしもOUHUKUが「2」なら終える
ループOUHUKUが2回目の処理ならループOUHUKUが終わり、チェストの座標まで上がることになります。ここでのポイントは、もしも正しいならの処理はありません。ただループOUHUKUが終わるだけとなります。

else--違うなら次の処理をしてループOUHUKUの2回目を処理
一面目は「64」の位置で掘り終わりますので「右を向くx2」行い「63」を向きループOUHUKUの2回目の処理の先頭に戻ります。

YOKOcount=0--YOKOcountを「0」に変更
二段目の最初の列の移動は左回りとなりますので、YOKOcountは「-1」のままでよいのでこの部分は削除します。


※プログラムのポイント
ループHUKASAは、1回の処理でですが、ループOUHUKUの処理で「一段下を掘り、下がる」が2回行われていますので、チェストのY値は「HUKASAx2」となります。注意点は掛け算の場合 Lua 言語では「HUKASA*2」と書きこむ必要があります。

チェストへ上がる
--ループAGARUは、1~ループHUKASAx2まで実行
    for AGARU=1,HUKASA*2 do

採掘再開場所へ下がる
--ループSAGARUは、1~ループHUKASAx2まで実行
    for SAGARU=1,HUKASA*2 do


次のページ「岩盤に到達したらプログラムを終える(失敗編)」
前のページ「if 文で多重分岐で列の移動を管理」

if 文で多重分岐で列の移動を管理

「if」分を使い「横に列を移動するループを終える」「右回りに列を移動する」「左回りに列を移動する」このように3個の分岐を作ります。コンフィグを設定してタートルの位置によって「0」と「-1」が当てはまるようにコンフィグ値を変更していきます。

岩盤まで掘りぬきましたが当然チェストには、アイテムは入りきれません

タートルのAPIはこちらで確認できます

今までのプログラムでは一面を掘りぬく考え方は、ループYOKOを4回としていましたが、今回は「一列を掘り進む」ループTATEを8回で考えていきます。

基本となる一列を掘り進むループTATE
for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
    turtle.dig()--前を壊す
    turtle.forward()--前に行く
end--ループTATEの終わり

この後の処理を「if」分で3分岐とします
  1番目の分岐:スタート地点に戻るのか
  2番目の分岐:右回りに列を移動するのか
  3番目の分岐:左回りに列を移動するのか

--今回のプログラム
local YOKOcount=0--定義YOKOcountは「0」
for HUKASA=1,100 do--一面を百段掘るループHUKASA
    turtle.digDown()--下を掘る
    turtle.down()--下に行く
    for YOKO=1,8 do--ループYOKOは、1~8まで実行
        for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
        end--ループTATEの終わり
        if YOKO==8 then--もしもループYOKOが「8」なら
            turtle.turnRight()--右を向いてスタート方向を向く
            for HOME=2,8 do--ループHOMEは、2~8まで実行
                turtle.forward()--前に行く
            end--ループHOMEの終わり
            YOKOcount=0--YOKOcountを「0」に変更
        elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
            turtle.turnRight()--右を向く
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
            turtle.turnRight()--右を向く
            YOKOcount=-1--YOKOcountを「-1」に変更
        elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
            turtle.turnLeft()--左を向く
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
            turtle.turnLeft()--左を向く
            YOKOcount=0--YOKOcountを「0」に変更
        end--もしもの終わり
    end--ループYOKOの終わり
    turtle.turnLeft()--左を向く(チェストの方を向く)
    for AGARU=1,HUKASA do--ループAGARUは、1~ループHUKASAまで実行
        turtle.up()--上に行く
    end--ループAGARUの終わり
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
    for SAGARU=1,HUKASA do--ループSAGARUは、1~ループHUKASAまで実行
        turtle.down()--下に行く
    end--ループSAGARUの終わり
    turtle.turnRight()--右を向く
    turtle.turnRight()--右を向く
end--ループHUKASA終わり
--今回のプログラムの終わり






コンフィグの定義
local YOKOcount=0--定義YOKOcountは「0」
ユーザーが文字設定して値を指定するルールを決めるようなものです
local␣定義文字=値
YOKOcountの値を初期値「0」と定めます
右回りに列を移動したら「-1」と変更します
左回りに列を移動したら「0」と変更します
ループYOKOが8回終わったら「0」と変更します


1番目の分岐
if YOKO==8 then--もしもループYOKOが「8」なら
ループYOKOが「8回目を終えたら」でスタート地点に戻ります
タートルの位置は「64」です

turtle.turnRight()--右を向いてスタート方向を向く
for HOME=2,8 do--ループHOMEは、2~8まで実行
    turtle.forward()--前に行く
 end--ループHOMEの終わり

YOKOcount=0--YOKOcountを「0」に変更
YOKOcountは「0」になり、次に「8」の位置でタートルは右回りに列を移動します


2番目の分岐
elseif YOKOcount==0 then--もしもYOKOcountが「0」なら
YOKOcountが「0」なら「右回りに列を移動」
タートルの位置は「8、24、40、56」です

turtle.turnRight()--右を向く
turtle.dig()--前を壊す
turtle.forward()--前に行く
turtle.turnRight()--右を向く

YOKOcount=-1--YOKOcountを「-1」に変更
YOKOcountは「-1」になります


3番目の分岐
elseif YOKOcount==-1 then--もしもYOKOcountが「-1」なら
YOKOcountが「-1」なら「左回りに列を移動」
タートルの位置は「16、32、48」です

 turtle.turnLeft()--左を向く
 turtle.dig()--前を壊す
 turtle.forward()--前に行く
 turtle.turnLeft()--左を向く

YOKOcount=0--YOKOcountに「0」に変更
YOKOcountは「0」になります


※プログラムのポイント
elseif(違うなら、もしもこっちなら)とつなげていくことで、分岐を無限に作っていくことができます。難しくなりますが、タートルにより複雑な動きのコントロールも可能になります。

※プログラムのポイント
一番目の分岐にループYOKOとすることが重要となります。「YOKOcount」の右回り「0」、左回り「-1」は、必ずどちらかが当てはまってしましますので、まず横の移動のループYOKOを終える分岐を最初に書き込む必要があります。

※プログラムの考え方
スタート時は、YOKOcountは「0」
①一段掘り下げる
②YOKOcountが「0」なら右回りに列を移動してYOKOcountを「-1」に変更
③YOKOcountが「-1」なら左回りに列を移動してYOKOcountを「0」に変更
これを8回繰り返して
④ループYOKOが「8」ならスタート地点に戻りYOKOcountを「0」に変更
⑤チェストにアイテムを入れる
これを岩盤まで繰り返します


次のページ「往復の採掘でクアーリーの動きを再現」
前のページ「if 文を使用して列の移動を終える」

if 文を使用して列の移動を終える

露天掘りのプログラムに「if」文を使用して「もしも何々だったらどうする」「何々でなかったらこうする」このような分岐を作ってプログラムを短く簡略化しつつ、より高度なものにします。


1ブロック分タートルがはみ出してしまわないように列の移動を終える分岐 

タートルのAPIはこちらで確認できます

「if」文を使って横の移動を終わらせる


ループYOKOを4回に増やしてループYOKOが4回目なら左回りに列の移動を行わずにスタート位置に戻るプログラムを考えます。

--1.のプログラム
if YOKO<4 then--もしもループYOKOが4より小さいなら
    turtle.turnLeft()--左を向く
    turtle.dig()--前を壊す
    turtle.forward()--前に行く
    turtle.turnLeft()--左を向く
else--もしもが当てはまらないなら
    turtle.turnRight()--右を向いてスタート方向を向く
    for HOME=2,8 do--ループHOMEは、2~8まで実行
       turtle.forward()--前に行く
    end--ループHOMEの終わり
end--もしもの終わり
--1.のプログラムの終わり


※プログラムのポイント
if(もしも)、何々が、then(正、正しい場合)
    Aの処理
else(偽、違う場合)
    Bの処理
end(もしもの終わり)

このような書き方が「if」文の基本形です

※プログラムのポイント
2列を掘り進んでいくとYOKOは、1.2.3.4と増えていきます。「4」よりも値が小さい場合は「左回りに列を移動、ループYOKOを繰り返す」、小さくない(同じ)場合は「右を向いてスタート地点に戻る」となります。




前回のプログラムに「if」分を組み込んだプログラムに変更します

--今回のプログラム
for HUKASA=1,100 do--一面を百段掘るループHUKASA
    turtle.digDown()--下を掘る
    turtle.down()--下に行く
    for YOKO=1,4 do--2列を破壊して進むループを4回繰り返すループYOKO
        for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
        end--ループTATEの終わり
        turtle.turnRight()--右を向く
        turtle.dig()--前を壊す
        turtle.forward()--前に行く
        turtle.turnRight()--右を向く
        for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
        end--ループTATEの終わり
--1.のプログラム
        if YOKO<4 then--もしもループYOKOが4より小さいなら
            turtle.turnLeft()--左を向く
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
            turtle.turnLeft()--左を向く
        else--もしもが当てはまらないなら
            turtle.turnRight()--右を向いてスタート方向を向く
            for HOME=2,8 do--ループHOMEは、2~8まで実行
                turtle.forward()--前に行く
            end--ループHOMEの終わり
        end--もしもの終わり
    end--ループYOKOの終わり
--1.のプログラムの終わり
    turtle.turnLeft()--左を向く(チェストの方を向く)
    for AGARU=1,HUKASA do--ループAGARUは、1~ループHUKASAまで実行
        turtle.up()--上に行く
    end--ループAGARUの終わり
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
    for SAGARU=1,HUKASA do--ループSAGARUは、1~ループHUKASAまで実行
        turtle.down()--下に行く
    end--ループSAGARUの終わり
    turtle.turnRight()--右を向く
    turtle.turnRight()--右を向く
end--ループHUKASA終わり
--今回のプログラムの終わり


※プログラムのポイント
今回は、もしも当てはまらないなら「スタート位置の戻る」としていますが、「else」から「end」までの処理は短くても長くても構いません。

※プログラムのポイント
for YOKO=1,4 do--2列を破壊して進むループを4回繰り返すループYOKO
ループYOKOを3回から4回に増やして「7、8」列目を処理を省いていますので一面を掘りぬくプログラムは短くなりました。

前回のプログラムとタートルの動作は、同じですが「if」文を用いることによってプログラムが短くなりました。次は「if」文の分岐を増やしていきます。


次のページ「if 文で多重分岐で列の移動を管理」
前のページ「スタート地点に戻りチェストにアイテムを入れる」

スタート地点に戻りチェストにアイテムを入れる

下に掘り進んでいくとタートルのインベントリは、いっぱいになってしまい採掘してもアイテム入手ができなくなってしまいます。「一面を掘る」「チェストに戻りアイテムを入れる」「採掘場所に戻り」「一面を掘る」このようなプログラムに変更し露天掘りプログラムを完成させます。



一段を掘ったあとスタート位置に戻るプログラム

一段を全面掘りぬいて「64」の位置で止まったタートルは、右「49」の方向を向いて「1」の位置まで進みます。

ループHOMEで「49.48.33.32.17.16.1」7ブロック分進みます

--1.のプログラム
turtle.turnRight()--右「49」の方向を向く
for HOME=2,8 do--前に行くを7回繰り返すループHOME
    turtle.forward()--前に行く
end--ループHOMEの終わり
--1.のプログラムの終わり



タートルは、スタート地点の「1」の位置の一段下で停止


一面を掘るプログラムをループカウンターで10回繰り返す

最初の「下を掘る、下に行く」「一面を掘る」「スタート位置に戻る」をループカウンター「HUKASA」で繰り返せば露天掘りプログラムが完成します。

1.のプログラムの後に右を向くことでタートルの進行方向を合わせます
turtle.turnRight()--右「2」の方向を向く


--2.のプログラム
for HUKASA=1,10 do--面を十段掘るループHUKASA
    turtle.digDown()--下を掘る
    turtle.down()--下に行く
    for YOKO=1,3 do--2列を破壊して進むループを3回繰り返すルーツYOKO
        for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
        end--ループTATEの終わり
        turtle.turnRight()--右を向く
        turtle.dig()--前を壊す
        turtle.forward()--前に行く
        turtle.turnRight()--右を向く
        for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
        end--ループTATEの終わり
        turtle.turnLeft()--左を向く
        turtle.dig()--前を壊す
        turtle.forward()--前に行く
        turtle.turnLeft()--左を向く
    end--ループYOKOの終わり
    for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
        turtle.dig()--前を壊す
        turtle.forward()--前に行く
    end--ループTATEの終わり
    turtle.turnRight()--右を向く
    turtle.dig()--前を壊す
    turtle.forward()--前に行く
    turtle.turnRight()--右を向く
    for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
        turtle.dig()--前を壊す
        turtle.forward()--前に行く
    end--ループTATEの終わり
--1.のプログラム
    turtle.turnRight()--右「49」の方向を向く
    for HOME=2,8 do--前に行くを7回繰り返すループHOME
        turtle.forward()--前に行く
    end--ループHOMEの終わり
--1.のプログラムの終わり
    turtle.turnRight()--右「2」の方向を向く
end--ループHUKASA終わり
--2.のプログラム




スタート位置のY座標に戻る

画像のようにマイニングタートルとチェストを配置します
--2.のプログラム
for HUKASA=1,10 do--面を十段掘るループHUKASA

このループHUKASAには「1.2.3.4.5.6.7.8.9.10」と1から10までの数字が代入されていきます。ループHUKASAの中にタートルAPIの「turtle.down()--下に行く」が一度しか使用していませんのでループHUKASAの回数がタートルが下に行った回数となります。

HUKASAループの回数=タートルの下がったブロック数

タートルが上に上がるループカウンターAGARUでプログラムを作ります

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

チェストにタートルのインベントリ内のアイテムをすべて入れる

一面を掘りぬいたタートルのスロットには、入手したアイテムが入ります。そのアイテムをすべてチェストに入れるプログラムを考えます。

スロット1から16まで順番にアイテムをチェストに入れていきます。

turtle.select(1)--タートルスロット「1」を選択
turtle.drop()--チェストに入れる
turtle.select(2)--タートルスロット「2」を選択
turtle.drop()--チェストに入れる
turtle.select(3)--タートルスロット「3」を選択
turtle.drop()--チェストに入れる




「タートルスロット選択」「チェストに入れる」を16回行う必要があります

ループ「SLOT」を定義して「turtle.select()」に反映させるプログラムです

--4.のプログラム
for SLOT=1,16 do--ループSLOTは、1~16まで実行
    turtle.select(SLOT)--タートルスロット「SLOT」を選択
    turtle.drop()--チェストに入れる
end--ループSLOTの終わり
--4.のプログラムの終わり


※プログラムのポイント
ループの定義「SLOT」には、「1.2.3....」と1~16まで順番に数字が入ります。これを「turtle.select(SLOT)」とすることでタートルの選択スロットが「1を選び、アイテムを正面に落とす」「2を選び、アイテムを正面に落とす」を繰り返し16スロットまで、すべてのアイテムをチェストに入れることができます。


上がった分だけ下がり採掘場所まで戻る


チェストにアイテムを入れた後に採掘場所に戻ります

ループ「SAGARU」でループ「HUKASA」の実行数だけタートルは下がりますので、逆にループSAGARUを定義して「HUKASA」分だけ下がり採掘の再開位置まで戻ります。

--5.のプログラム
for SAGARU=1,HUKASA do--ループSAGARUは、1~ループHUKASAまで実行
    turtle.down()--下に行く
end--ループSAGARUの終わり
--5.のプログラムの終わり


プログラムを完成させます

--今回のプログラム
--2.のプログラム
for HUKASA=1,100 do--一面を百段掘るループHUKASA
    turtle.digDown()--下を掘る
    turtle.down()--下に行く
    for YOKO=1,3 do--2列を破壊して進むループを3回繰り返すルーツYOKO
        for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
        end--ループTATEの終わり
        turtle.turnRight()--右を向く
        turtle.dig()--前を壊す
        turtle.forward()--前に行く
        turtle.turnRight()--右を向く
        for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
            turtle.dig()--前を壊す
            turtle.forward()--前に行く
        end--ループTATEの終わり
        turtle.turnLeft()--左を向く
        turtle.dig()--前を壊す
        turtle.forward()--前に行く
        turtle.turnLeft()--左を向く
    end--ループYOKOの終わり
    for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
        turtle.dig()--前を壊す
        turtle.forward()--前に行く
    end--ループTATEの終わり
    turtle.turnRight()--右を向く
    turtle.dig()--前を壊す
    turtle.forward()--前に行く
    turtle.turnRight()--右を向く
    for TATE=2,8 do--前を壊す、前に行くを7回繰り返すループTATE
        turtle.dig()--前を壊す
        turtle.forward()--前に行く
    end--ループTATEの終わり
--1.のプログラム
    turtle.turnRight()--右「49」の方向を向く
    for HOME=2,8 do--前に行くを7回繰り返すループHOME
        turtle.forward()--前に行く
    end--ループHOMEの終わり
--1.のプログラムの終わり
    turtle.turnLeft()--左を向く(チェストの方を向く)
--3.のプログラム
    for AGARU=1,HUKASA do--ループAGARUは、1~ループHUKASAまで実行
        turtle.up()--上に行く
    end--ループAGARUの終わり
--3.のプログラムの終わり
--4.のプログラム
    for SLOT=1,16 do--ループSLOTは、1~16まで実行
        turtle.select(SLOT)--タートルスロット「SLOT」を選択
        turtle.drop()--チェストに入れる
    end--ループSLOTの終わり
--4.のプログラムの終わり
--5.のプログラム
    for SAGARU=1,HUKASA do--ループSAGARUは、1~ループHUKASAまで実行
        turtle.down()--下に行く
    end--ループSAGARUの終わり
--5.のプログラムの終わり
    turtle.turnRight()--右を向く
    turtle.turnRight()--右を向く
end--ループHUKASA終わり
--2.のプログラム
--今回のプログラムの終わり

※プログラムのポイント
今までは露天掘りの深さは「10」としていましたが、岩盤まで掘り下げることを考えてループHUKASAを「100」としています。
for HUKASA=1,100 do--一面を百段掘るループHUKASA

※プログラムのポイント
タートルは正面か上か下にしかアイテムを落とすことができませんので、ループHOMEの後にタートルは左を向いてチェストの方を向いています。
turtle.turnLeft()--左を向く(チェストの方を向く)

※プログラムのポイント
採掘を再開するには、タートルの向きを考えます。チェストの方を向いた後は、180度向きを変える必要がありますので「右を向くx2」もしくは「左を向くx2」が必要となります。
turtle.turnRight()--右を向く
turtle.turnRight()--右を向く

このプログラムで露天掘りプログラムは完成といえますが、今後は「if」分を使用して効率よくプログラムを組んだり、コンフィグを設定してサイズの可変式、岩盤に到達したらプログラムを終える、MOBによるブロックずれの回避などより高度なプログラムに発展させていきます。


次のページ「if 文を使用して列の移動を終える」
前のページ「列の移動のループを作成して一面を掘りぬく」

関連コンテンツ

リンク