turtleapis.lua
turtleapis.lua
方向別のタートルAPIをまとめて管理するためのAPIです。
わりと誰でも作るやつだと思いますが、これには right / left / back なんかも追加してあって思ったより便利です。
ぼちぼち良く出来た気がします。
前進/後退のみで一歩移動する STEPF/STEPB を追加予定です。
----------------------------------------------------------- -- @file turtleapis(lua) -- @brief turtle API で方向別のものを簡易に取得できるテーブル集 -- @author 琴葉茜(さとうけい) ----------------------------------------------------------- os.loadAPI('/lib/apis/const') ----------------------------------------------------------- -- 回転 ----------------------------------------------------------- TURN = { [const.RIGHT] = turtle.turnRight, [const.LEFT] = turtle.turnLeft, [const.BACK] = function() -- 真後ろに回転するやつや local turn = turtle.turnRight -- 右回りやで if not turn() then return false end -- 1回目の回転に失敗したらそこまでや return turn() -- 2回めの回転や end } ----------------------------------------------------------- -- タートルが右か左を向いて、関数を実行して、元の向きに戻る -- っていう関数を作って返すよ -- 後ろまで向くのもついでに作るけど、TURN[BACK]の途中で失敗するとどうなるかわからん -- そもそもタートルが回転に失敗することあるかどうか知らんけど -- -- @param func [in]実行する関数 -- @param direction [in]タートルが向く向き -- @return 作った関数 ----------------------------------------------------------- local function createSideFunc(func, direction) -- タートルが横向く関数や。とりあえず右向くもんとして設定しとくで local turn1st, turn2nd = TURN[const.RIGHT], TURN[const.LEFT] if direction == const.LEFT then -- 左に向く時は入れ替えればええで turn1st, turn2nd = turn2nd, turn1st elseif direction == BACK then -- 後ろ向く場合や turn1st = TURN[const.BACK] -- 後ろ向くで turn2nd = turn1st -- 同じ方向でまた後ろ向くで end -- 関数を作って返すよ return function(not_return) if not turn1st() then return false end -- 最初の横向くの失敗したらどうにもならん local result = func() -- 戻り値は関数の戻り値をそのまま返すんや if not not_return then turn2nd() end -- 引数が真でなければ元の向きに戻るよ return result, not_return and turn2nd end end ----------------------------------------------------------- -- 方向別のタートルAPIを格納したテーブルを作るよ -- 例えばDROP[方向]で必要な関数がもらえる感じのやつや -- -- 横向くやつは使い途が限られるかもなあ -- -- @param methods [in]FORWARD UP DOWNの順にAPIメソッドを格納した配列 -- @return 作ったテーブル ----------------------------------------------------------- local function createFuncsTable(methods) local methods_table = {} -- 前・上・下やで for i, v in ipairs { const.FORWARD, const.UP, const.DOWN } do methods_table[v] = methods[i] end -- 横向くやつや for _i, v in ipairs { const.RIGHT, const.LEFT, const.BACK } do methods_table[v] = createSideFunc(methods[1], v) end return methods_table end ----------------------------------------------------------- -- 方向別のタートルAPIメソッドを取得するためのテーブルやで -- DROP[方向]でメソッドがもらえるで DROP = createFuncsTable { turtle.drop, turtle.dropUp, turtle.dropDown, } -- 以下、似たようなのが続くで ATTACK = createFuncsTable { turtle.attack, turtle.attackUp, turtle.attackDown, } DIG = createFuncsTable { turtle.dig, turtle.digUp, turtle.digDown, } PLACE = createFuncsTable { turtle.place, turtle.placeUp, turtle.placeDown, } DETECT = createFuncsTable { turtle.detect, turtle.detectUp, turtle.detectDown, } INSPECT = createFuncsTable { turtle.inspect, turtle.inspectUp, turtle.inspectDown, } COMPARE = createFuncsTable { turtle.compare, turtle.compareUp, turtle.compareDown, } SUCK = createFuncsTable { turtle.suck, turtle.suckUp, turtle.suckDown, } ----------------------------------------------------------- -- 一歩移動 ----------------------------------------------------------- STEP = createFuncsTable { turtle.forward, turtle.up, turtle.down, } STEP[const.BACK] = turtle.back -- 一歩移動の[BACK]だけは他と違って回らずそのまま下がるよ