Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- ###############################################################
- -- flooring by turtle (rule-based programing)
- -- versoin 0.1
- -- (c) 2014 hevohevo, License: MIT
- -- hevohevo@gmail.com, http://hevohevo.hatenablog.com/
- -- #################################################
- -- load API
- -- http://pastebin.com/BzGqtgVa
- os.loadAPI("turtleAI")
- -- #################################################
- -- 設定項目
- -- #################################################
- local MAX_DEPTH = 4
- local MAX_WIDTH = 4
- -- #################################################
- -- ルール(タスク)の作成、追加
- -- #################################################
- local ai = turtleAI.newAI()
- -- ############# 床材張り替えタスク
- -- 「選択スロットと真下のブロックを比較して違うなら張り替える」
- local harikae = ai:addTask('harikae',-1) -- タスク名、優先度(0が基準値)
- function harikae:canRun(info) -- タスクに実行条件を設定
- return not turtle.compareDown() -- trueを返す条件を記述
- end
- function harikae:run(ctrl) -- タスクの実行内容を設定
- turtle.digDown()
- turtle.placeDown()
- return true -- 通常はtrueを返すこと
- end
- -- ############# 選択スロット変更タスク
- -- 「選択スロットのアイテムが0なら次のスロットを選択する」
- local changeSlot = ai:addTask('changeSlot',-1)
- function changeSlot:canRun(info)
- return turtle.getItemCount()==0
- end
- function changeSlot:run(ctrl)
- local current_slot = turtle.getSelectedSlot()
- local next_slot = current_slot%16 + 1
- turtle.select(next_slot)
- return true
- end
- -- ############# 作業終了タスク
- -- 「指定座標まできたら終了する」
- local fin = ai:addTask('fin',0)
- function fin:canRun(info)
- if (info.getBurnOutFuelLevel() >= 100) then return true end
- if info.coord.x==MAX_WIDTH-1 then
- if (info.coord.x%2==0) and (info.coord.z==MAX_DEPTH-1) then return true end
- if (info.coord.x%2==1) and (info.coord.z==0) then return true end
- end
- return false
- end
- function fin:run(ctrl)
- return "quit" -- 文字列"quit"を返すことで推論エンジンを停止する。
- end
- -- ############# 右へ折り返すタスク
- -- 「一番奥まで行ったら右へ折り返す」
- local right = ai:addTask('right',0)
- function right:canRun(info)
- return (info.coord.x%2==0) and (info.coord.z == MAX_DEPTH-1)
- end
- function right:run(ctrl)
- ctrl:turnRight()
- ctrl:forward()
- ctrl:turnRight()
- return true
- end
- -- ############# 左へ折り返すタスク
- -- 「戻ってきたら左へ折り返す」
- local left = ai:addTask('left',0)
- function left:canRun(info)
- return (info.coord.x%2==1) and (info.coord.z == 0)
- end
- function left:run(ctrl)
- ctrl:turnLeft()
- ctrl:forward()
- ctrl:turnLeft()
- return true
- end
- -- ############# 前進タスク
- -- 「ひたすら前へ進む」
- local fwd = ai:addTask('fwd',0)
- function fwd:canRun(info)
- return info.getFuelLevel() > 0
- end
- function fwd:run(ctrl)
- while turtle.dig() do end
- ctrl:forward()
- return true
- end
- -- #################################################
- -- プログラムメイン部分
- -- #################################################
- -- 初期値の設定、実行する範囲の奥行き(depth)と幅(width)を指定
- -- 指定がなければ、このコード冒頭の初期値を使う
- local args={...}
- if #args==2 or #args==0 then
- MAX_DEPTH = tonumber(args[1]) or MAX_DEPTH
- MAX_WIDTH = tonumber(args[2]) or MAX_WIDTH
- else
- error("floor <depth> <width>")
- end
- print(MAX_DEPTH,",",MAX_WIDTH)
- -- 実行ログをファイルに出力するためにファイルハンドルの作成
- local fh = fs.open("log.txt","w")
- -- rule-based 推論エンジンの実行。ここでは50ターンだけ進める
- for task, turn in ai:generate(50) do
- fh.write("Turn: "..turn.."\n") -- 現在ターンの表示
- fh.write(" canRun-tasks: "..ai:tasksToString(ai.runable_tasks).."\n") -- 実行可能であったタスクリスト
- fh.write(" ran-task: "..task.name.."\n") -- そのうち実際に実行したタスク
- fh.write(ai.info:toString().."\n") -- 現在位置など、現在のタートル情報
- end
- fh.write("Quit: \n")
- fh.write(ai:tasksToString(ai.runable_tasks).."\n")
- fh.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement