Advertisement
hevohevo

rule-based flooring

Aug 28th, 2014
3,882
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.28 KB | None | 0 0
  1. -- ###############################################################
  2. -- flooring by turtle (rule-based programing)
  3. -- versoin 0.1
  4. -- (c) 2014 hevohevo, License: MIT
  5. -- hevohevo@gmail.com, http://hevohevo.hatenablog.com/
  6.  
  7. -- #################################################
  8. -- load API
  9. -- http://pastebin.com/BzGqtgVa
  10. os.loadAPI("turtleAI")
  11.  
  12. -- #################################################
  13. -- 設定項目
  14. -- #################################################
  15. local MAX_DEPTH = 4
  16. local MAX_WIDTH = 4
  17.  
  18. -- #################################################
  19. -- ルール(タスク)の作成、追加
  20. -- #################################################
  21. local ai = turtleAI.newAI()
  22.  
  23. -- ############# 床材張り替えタスク
  24. -- 「選択スロットと真下のブロックを比較して違うなら張り替える」
  25. local harikae = ai:addTask('harikae',-1) -- タスク名、優先度(0が基準値)
  26.  
  27. function harikae:canRun(info) -- タスクに実行条件を設定
  28.   return not turtle.compareDown() -- trueを返す条件を記述
  29. end
  30.  
  31. function harikae:run(ctrl) -- タスクの実行内容を設定
  32.   turtle.digDown()
  33.   turtle.placeDown()
  34.   return true -- 通常はtrueを返すこと
  35. end
  36.  
  37. -- ############# 選択スロット変更タスク
  38. -- 「選択スロットのアイテムが0なら次のスロットを選択する」
  39. local changeSlot = ai:addTask('changeSlot',-1)
  40.  
  41. function changeSlot:canRun(info)
  42.   return turtle.getItemCount()==0
  43. end
  44. function changeSlot:run(ctrl)
  45.   local current_slot = turtle.getSelectedSlot()
  46.   local next_slot = current_slot%16 + 1
  47.   turtle.select(next_slot)
  48.   return true
  49. end
  50.  
  51. -- ############# 作業終了タスク
  52. -- 「指定座標まできたら終了する」
  53. local fin = ai:addTask('fin',0)
  54.  
  55. function fin:canRun(info)
  56.   if (info.getBurnOutFuelLevel() >= 100) then return true end
  57.   if info.coord.x==MAX_WIDTH-1 then
  58.     if (info.coord.x%2==0) and (info.coord.z==MAX_DEPTH-1) then return true end
  59.     if (info.coord.x%2==1) and (info.coord.z==0) then return true end
  60.   end
  61.   return false
  62. end
  63.  
  64. function fin:run(ctrl)
  65.   return "quit" -- 文字列"quit"を返すことで推論エンジンを停止する。
  66. end
  67.  
  68. -- ############# 右へ折り返すタスク
  69. -- 「一番奥まで行ったら右へ折り返す」
  70. local right = ai:addTask('right',0)
  71.  
  72. function right:canRun(info)
  73.   return (info.coord.x%2==0) and (info.coord.z == MAX_DEPTH-1)
  74. end
  75.  
  76. function right:run(ctrl)
  77.   ctrl:turnRight()
  78.   ctrl:forward()
  79.   ctrl:turnRight()
  80.   return true
  81. end
  82.  
  83. -- ############# 左へ折り返すタスク
  84. -- 「戻ってきたら左へ折り返す」
  85. local left = ai:addTask('left',0)
  86.  
  87. function left:canRun(info)
  88.   return (info.coord.x%2==1) and (info.coord.z == 0)
  89. end
  90.  
  91. function left:run(ctrl)
  92.   ctrl:turnLeft()
  93.   ctrl:forward()
  94.   ctrl:turnLeft()
  95.   return true
  96. end
  97.  
  98. -- ############# 前進タスク
  99. -- 「ひたすら前へ進む」
  100. local fwd = ai:addTask('fwd',0)
  101.  
  102. function fwd:canRun(info)
  103.   return info.getFuelLevel() > 0
  104. end
  105.  
  106. function fwd:run(ctrl)
  107.   while turtle.dig() do end
  108.   ctrl:forward()
  109.   return true
  110. end
  111.  
  112. -- #################################################
  113. -- プログラムメイン部分
  114. -- #################################################
  115.  
  116. -- 初期値の設定、実行する範囲の奥行き(depth)と幅(width)を指定
  117. -- 指定がなければ、このコード冒頭の初期値を使う
  118. local args={...}
  119. if #args==2 or #args==0 then
  120.   MAX_DEPTH = tonumber(args[1]) or MAX_DEPTH
  121.   MAX_WIDTH = tonumber(args[2]) or MAX_WIDTH
  122. else
  123.   error("floor <depth> <width>")
  124. end
  125. print(MAX_DEPTH,",",MAX_WIDTH)
  126.  
  127. -- 実行ログをファイルに出力するためにファイルハンドルの作成
  128. local fh = fs.open("log.txt","w")
  129.  
  130. -- rule-based 推論エンジンの実行。ここでは50ターンだけ進める
  131. for task, turn in ai:generate(50) do
  132.   fh.write("Turn: "..turn.."\n") -- 現在ターンの表示
  133.   fh.write(" canRun-tasks: "..ai:tasksToString(ai.runable_tasks).."\n") -- 実行可能であったタスクリスト
  134.   fh.write(" ran-task: "..task.name.."\n") -- そのうち実際に実行したタスク
  135.   fh.write(ai.info:toString().."\n") -- 現在位置など、現在のタートル情報
  136. end
  137.  
  138. fh.write("Quit: \n")
  139. fh.write(ai:tasksToString(ai.runable_tasks).."\n")
  140. fh.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement