-- Optimized tunnel digger (X width, Y height, Z length) local function askNumber(label) write(label .. ": ") return tonumber(read()) end local Y = askNumber("Y") local X = askNumber("X") local Z = askNumber("Z") -- ---------- helpers ---------- local function digForwardUntilClear() -- Handle gravel/sand + mobs while not turtle.forward() do turtle.dig() turtle.attack() sleep(0.2) end end local function goUp() while not turtle.up() do turtle.digUp() turtle.attackUp() sleep(0.2) end end local function goDown() while not turtle.down() do turtle.digDown() turtle.attackDown() sleep(0.2) end end local function turnTo(side) -- "left" or "right" if side == "left" then turtle.turnLeft() else turtle.turnRight() end end -- Move laterally one step in the current facing (after turning once at row start) local function stepLateral() while not turtle.forward() do turtle.dig() turtle.attack() sleep(0.1) end end -- ---------- main ---------- local goingRight = true for zi = 1, Z do -- Carve the X×Y cross-section of this slice with minimal turns for y = 1, Y do -- Face lateral direction ONCE at row start turnTo(goingRight and "right" or "left") -- Traverse the row across X-1 steps (no extra turns inside the row) for x = 1, X - 1 do turtle.dig() -- clear the next lateral block if any (cheap if air) stepLateral() -- move one to the side turtle.digUp() -- optional: clear ceiling as you go turtle.digDown() -- optional: clear floor as you go end -- Face forward again at row end (U-turn direction depends on side) turnTo(goingRight and "left" or "right") -- Next row will go the other way goingRight = not goingRight -- Climb to next row if needed if y ~= Y then turtle.digUp() goUp() end end -- Return to bottom of slice for _ = 1, Y - 1 do goDown() end -- Only now clear the *front* and advance to next slice (one dig + one move) if zi ~= Z then turtle.dig() digForwardUntilClear() end end