2020年2月6日木曜日

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」って実感できました。

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


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

0 件のコメント:

コメントを投稿