OpenComputers/Шахта-тоннель
Эта несложная программа для робота вооруженного киркой.

Робот копает тоннель на 12 ширины, 7 высоты и 5 глубины. Посередине тоннеля оставляет колонны 2х2 блока.

## Исходный код

local robot = require("robot") function column(height, dir) for c=0, height-1 do if dir == true then robot.swingUp() robot.up() else robot.swingDown() robot.down() end end end function slice(height, length, pos) for x=0, length-1 do if x%2 == 0 then column(height, pos) else column(height, not pos) end if x < (length-1) then robot.swing() robot.forward() end end end function room(height, length, width) for y=0, width-1 do if y%2 == 0 then slice(height, length, (length*y)%2 == 0) if y<(width-1) then robot.turnLeft() robot.swing() robot.forward() robot.turnLeft() end else slice(height, length, (length*y)%2 == 0) if y<(width-1) then robot.turnRight() robot.swing() robot.forward() robot.turnRight() end end end end function metro() room(6, 5, 5) robot.turnAround() for c=0, 5 do robot.down() end robot.forward() robot.turnRight() robot.swing() robot.forward() room(4, 2, 3) for c=0, 3 do robot.down() end robot.swing() robot.forward() robot.turnLeft() robot.swing() robot.forward() robot.turnAround() room(6, 5, 5) for c=0, 5 do robot.down() end robot.back() robot.turnRight() for c=0, 10 do robot.forward() end robot.turnLeft() robot.forward() robot.swing() robot.forward() end metro()


Программа состоит из нескольких блоков-функций:

Функция | Описание |
---|---|

column | Копает вертикальную шахту в 1 блок, заданной высоты |

slice | Плоскость заданной высоты и глубины |

room | Создает прямоугольную комнату |

metro | Проходит один сегмент тоннеля с колоннами |


Последняя функция использует жестко заданные параметры: 12 ширины, 7 высоты и 5 глубины. Эти параметры можно вынести в описание функции и передавать пользовательские значения:

... function metro(width, height, length) ... end local W, H, L print("Enter segment width: ") W = io.read() print("Enter segment height: ") H = io.read() print("Enter segment length: ") L = io.read() metro(W, H, L)


Одиночный вызов функции metro() можно заменить на цикл с пользовательским параметром:

... local N print("Enter tonnel length (segments): ") N = io.read() for c=1, N do metro() end



## Эксплуатация

Программа предполагает, что робот находится в начале запланированного тоннеля, в правом нижнем его углу. Куб, в котором находится робот считается частью тоннеля (т.е. робот копает из этого куба вверх и влево).


Программа не предусматривает экстренные ситуации: разряд аккумуляторов, завалы гравия, монстров, переполнение инвентаря и т.д.