Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- r = require("robot")
- comp = require("component")
- g = comp.geolyzer
- function prompt_read(prompt)
- print(prompt)
- return tonumber(io.read())
- end
- size_x = prompt_read("Ширина шахты: ") -- Задаём ширину шахты
- size_y = prompt_read("Длина шахты: ") -- Задаём длину
- size_z = prompt_read("Глубина шахты: ") -- Задаём глубину
- start_z = prompt_read("С какой глубины начать: ") -- Задаём глубину начала
- if size_x == nul or size_x < 2 then -- Если не задана ширина или она меньше 2
- size_x = 5 -- то она будет 5 - то будет 5
- print("Ширина шахты: ", size_x)
- end
- if size_y == nul or size_y < 10 then-- Если не задана длина или меньше 10
- size_y = 10 -- то она будет 10
- print("Длина шахты: ", size_y)
- end
- if size_z == nul or size_z < 0 then-- Если не задана глубина или она отрицательна
- size_z = 0 -- то она будет 0
- print("Глубина шахты: ", size_z)
- end
- if start_z == nul or start_z < 0 then -- Если не задана начальная глубина или она отрицательна
- start_z = 0 -- то она будет 0
- print("Глубина первого слоя: ", start_z)
- elseif start_z > size_z then -- Если начальная глубина больше чем конечная
- start_z = size_z -- то она ровна конечной
- print("Глубина первого слоя: ", start_z)
- end
- offset = {0, 3, 1, 4, 2} -- Смещение тоннелей относительно друг друга
- function forward() --Движение робота на 1 блок вперед
- if r.forward() then -- Если робот может сделать шаг
- return true -- то хорошо :-)
- else -- Иначе...
- repeat
- r.swing() -- бъет по объекту впереди
- until not r.detect() -- Впереди чисто?
- forward() -- то шаг вперед
- end
- end
- function identify() -- проверяет отсканированый блок, согласно блек-листу
- id = {"minecraft:stone", "minecraft:cobblestone", "minecraft:dirt", "minecraft:gravel", "minecraft:grass", "minecraft:air"}
- extract = true -- возвращает True в случае, если блок надо добыть
- for i = 1, 6 do
- if scan == id[i] then
- extract = false -- Иначе False
- end
- end
- end
- function scanUp() -- Сканирование и добыча блока над роботом
- scan = g.analyze(1).name
- identify()
- if extract == true then
- r.swingUp()
- end
- end
- function scanDown() -- ... под роботом
- scan = g.analyze(0).name
- identify()
- if extract == true then
- r.swingDown()
- end
- end
- function scanLeft()
- scan = g.analyze(5).name -- ... слева от робота
- identify()
- if extract == true then
- r.turnLeft()
- r.swing()
- r.turnRight()
- end
- end
- function scanRight() -- ...справа от робота
- scan = g.analyze(4).name
- identify()
- if extract == true then
- r.turnRight()
- r.swing()
- r.turnLeft()
- end
- end
- function scanFront() -- ... перед роботом
- scan = g.analyze(3).name
- identify()
- if extract == true then
- r.swing()
- end
- end
- function tunnel() -- проход тоннеля по ширине шахты
- for x = 3, size_x do
- r.swing()
- forward()
- scanUp()
- scanDown()
- scanLeft()
- scanRight()
- end
- end
- function doubleTunnel() -- проход двойного тоннеля
- tunnel() -- начинает из главного тоннеля
- local function turnLeft()
- r.swing()
- forward()
- scanUp()
- scanDown()
- scanFront()
- scanRight()
- r.turnLeft()
- end
- turnLeft()
- for y_back = 1, 4 do -- разворот
- r.swing()
- forward()
- scanUp()
- scanDown()
- scanRight()
- end
- turnLeft()
- tunnel()
- forward() -- выходит в главный тоннель на 5 блоков ближе
- r.turnRight()
- end
- function level()
- mainTunnel = size_y - size_y%10 - p -- длина главного тоннеля
- for y = 2, mainTunnel do -- проходит главный тоннель
- r.swing()
- forward()
- scanRight()
- end
- r.turnLeft()
- nMax = (size_y - size_y%10)/10 -- Вычисляет кол-во "двойных" тоннелей
- for n = 1, nMax do
- doubleTunnel()
- if n == nMax then -- если тоннель последнй...
- yEnd = 4 - p
- while yEnd > 0 do -- возврат на исходную позицию
- forward()
- yEnd = yEnd - 1
- end
- else
- for yBack = 1, 5 do -- иначе топает 5 блоков
- forward()
- end
- r.turnRight() -- и поворачивается вправо для сл. тоннеля
- end
- end
- end
- -- Основной код программы
- for z = start_z, size_z do -- начинаем копаем шахту
- j = z%5+1 -- Высчитываем порядок смещения
- p = offset[j] -- значение смещения
- forward() -- Выход в вертикальную шахту
- if z == 0 then -- Если роботу не надо опускатся,
- level() -- то копает первый уровеень шахты
- else
- for zDown = 1, z do -- иначе опускаемся ниже
- r.swingDown()
- r.down()
- end
- level() -- и копаем очередной уровень
- for zDown = 1, z do -- по окончании поднимаемся обратно на верх
- r.up()
- end
- end
- forward()
- r.turnAround()
- for i = 1, 16 do -- сбрасываем всё добытое под себя
- r.select(i)
- r.dropDown()
- end
- r.select(1)
- os.sleep(20) -- Ждем 20 сек. для подзарядки
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement