Advertisement
ComST

MC_OC_Robot_Miner

Jan 31st, 2016
3,481
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.03 KB | None | 0 0
  1. r = require("robot")
  2. comp = require("component")
  3. g = comp.geolyzer
  4.  
  5. function prompt_read(prompt)
  6.   print(prompt)
  7.   return tonumber(io.read())
  8. end
  9.  
  10. size_x = prompt_read("Ширина шахты: ") -- Задаём ширину шахты
  11. size_y = prompt_read("Длина шахты: ") -- Задаём длину
  12. size_z = prompt_read("Глубина шахты: ") -- Задаём глубину
  13. start_z = prompt_read("С какой глубины начать: ") -- Задаём глубину начала
  14.  
  15. if size_x == nul or size_x < 2 then -- Если не задана ширина или она меньше 2
  16.   size_x = 5 -- то она будет 5 - то будет 5
  17.   print("Ширина шахты: ", size_x)
  18. end
  19.  
  20. if size_y == nul or size_y < 10 then-- Если не задана длина или меньше 10
  21.   size_y = 10 -- то она будет 10
  22.   print("Длина шахты: ", size_y)
  23. end
  24.  
  25. if size_z == nul or size_z < 0 then-- Если не задана глубина или она отрицательна
  26.   size_z = 0 -- то она будет 0
  27.   print("Глубина шахты: ", size_z)
  28. end
  29.  
  30. if start_z == nul or start_z < 0 then -- Если не задана начальная глубина или она отрицательна
  31.   start_z = 0 -- то она будет 0
  32.   print("Глубина первого слоя: ", start_z)
  33. elseif start_z > size_z then -- Если начальная глубина больше чем конечная
  34.   start_z = size_z -- то она ровна конечной
  35.   print("Глубина первого слоя: ", start_z)
  36. end
  37.  
  38. offset = {0, 3, 1, 4, 2} -- Смещение тоннелей относительно друг друга
  39.  
  40. function forward() --Движение робота на 1 блок вперед
  41.   if r.forward() then -- Если робот может сделать шаг
  42.     return true -- то хорошо :-)
  43.   else  -- Иначе...
  44.     repeat
  45.       r.swing() -- бъет по объекту впереди
  46.     until not r.detect() -- Впереди чисто?
  47.     forward() -- то шаг вперед
  48.   end
  49. end
  50.  
  51. function identify() -- проверяет отсканированый блок, согласно блек-листу
  52.   id = {"minecraft:stone", "minecraft:cobblestone", "minecraft:dirt", "minecraft:gravel", "minecraft:grass", "minecraft:air"}
  53.   extract = true -- возвращает True в случае, если блок надо добыть
  54.   for i = 1, 6 do
  55.     if scan == id[i] then
  56.       extract = false -- Иначе False
  57.     end
  58.   end
  59. end
  60.  
  61. function scanUp() -- Сканирование и добыча блока над роботом
  62.   scan = g.analyze(1).name
  63.   identify()
  64.   if extract == true then
  65.     r.swingUp()
  66.   end
  67. end
  68.  
  69. function scanDown() -- ... под роботом
  70.   scan = g.analyze(0).name
  71.   identify()
  72.   if extract == true then
  73.     r.swingDown()
  74.   end
  75. end
  76.  
  77. function scanLeft()
  78.   scan = g.analyze(5).name -- ... слева от робота
  79.   identify()
  80.   if extract == true then
  81.     r.turnLeft()
  82.     r.swing()
  83.     r.turnRight()
  84.   end
  85. end
  86.  
  87. function scanRight() -- ...справа от робота
  88.   scan = g.analyze(4).name
  89.   identify()
  90.   if extract == true then
  91.     r.turnRight()
  92.     r.swing()
  93.     r.turnLeft()
  94.   end
  95. end
  96.  
  97. function scanFront() -- ... перед роботом
  98.   scan = g.analyze(3).name
  99.   identify()
  100.   if extract == true then
  101.     r.swing()
  102.   end
  103. end
  104.  
  105. function tunnel() -- проход тоннеля по ширине шахты
  106.   for x = 3, size_x do
  107.     r.swing()
  108.     forward()
  109.     scanUp()
  110.     scanDown()
  111.     scanLeft()
  112.     scanRight()
  113.   end
  114. end
  115.  
  116. function doubleTunnel() -- проход двойного тоннеля
  117.   tunnel() -- начинает из главного тоннеля
  118.   local function turnLeft()
  119.     r.swing()
  120.     forward()
  121.     scanUp()
  122.     scanDown()
  123.     scanFront()
  124.     scanRight()
  125.     r.turnLeft()
  126.   end
  127.   turnLeft()
  128.   for y_back = 1, 4 do -- разворот
  129.     r.swing()
  130.     forward()
  131.     scanUp()
  132.     scanDown()
  133.     scanRight()
  134.   end
  135.   turnLeft()
  136.   tunnel()
  137.   forward() -- выходит в главный тоннель на 5 блоков ближе
  138.   r.turnRight()
  139. end
  140.  
  141. function level()
  142.   mainTunnel = size_y - size_y%10 - p -- длина главного тоннеля
  143.   for y = 2, mainTunnel do -- проходит главный тоннель
  144.     r.swing()
  145.     forward()
  146.     scanRight()
  147.   end
  148.   r.turnLeft()
  149.   nMax = (size_y - size_y%10)/10 -- Вычисляет кол-во "двойных" тоннелей
  150.   for n = 1, nMax do
  151.     doubleTunnel()
  152.     if n == nMax then -- если тоннель последнй...
  153.       yEnd = 4 - p
  154.       while yEnd > 0 do -- возврат на исходную позицию
  155.     forward()
  156.     yEnd = yEnd - 1
  157.       end
  158.     else
  159.       for yBack = 1, 5 do -- иначе топает 5 блоков
  160.     forward()
  161.       end
  162.       r.turnRight() -- и поворачивается вправо для сл. тоннеля
  163.     end
  164.   end
  165. end
  166.  
  167.  
  168. -- Основной код программы
  169.  
  170. for z = start_z, size_z do -- начинаем копаем шахту
  171.   j = z%5+1 -- Высчитываем порядок смещения
  172.   p = offset[j] -- значение смещения
  173.   forward() -- Выход в вертикальную шахту
  174.   if z == 0 then -- Если роботу не надо опускатся,
  175.     level() -- то копает первый уровеень шахты
  176.   else
  177.     for zDown = 1, z do -- иначе опускаемся ниже
  178.       r.swingDown()
  179.       r.down()
  180.     end
  181.     level() -- и копаем очередной уровень
  182.     for zDown = 1, z do -- по окончании поднимаемся обратно на верх
  183.       r.up()
  184.     end
  185.   end
  186.   forward()
  187.   r.turnAround()
  188.   for i = 1, 16 do -- сбрасываем всё добытое под себя
  189.     r.select(i)
  190.     r.dropDown()
  191.   end
  192.   r.select(1)
  193.   os.sleep(20) -- Ждем 20 сек. для подзарядки
  194. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement