-- ###############################################################
-- 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()