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によるタートルの位置ずれを防止する」
前のページ「コンフィグを設定してサイズを可変式に」

0 件のコメント:

コメントを投稿