Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Programa de minería para Turtle de ComputerCraft
- -- Autor: ChatGPT + Vacnoa
- -- Funciones mejoradas de entrada, inventario y recuperación
- -- Variables de posición
- local posX = 0
- local posY = 0
- local posZ = 0
- local dir = 0 -- 0 adelante, 1 derecha, 2 atrás, 3 izquierda
- local input = read()
- local giro = ""
- local direccionAltura = ""
- -- Función para pedir giro (derecha/izquierda)
- local function pedirGiro()
- while true do
- print("¿Girar a la derecha o izquierda al final de cada fila? (derecha/izquierda)")
- local entrada = string.lower(read())
- if entrada == "derecha" or entrada == "izquierda" then
- return entrada
- else
- print("Por favor escribe 'derecha' o 'izquierda'.")
- end
- end
- end
- -- Función para pedir dirección de altura (arriba/abajo)
- local function pedirDireccionAltura()
- while true do
- print("¿Minar hacia arriba o hacia abajo? (arriba/abajo)")
- local entrada = string.lower(read())
- if entrada == "arriba" or entrada == "abajo" then
- return entrada
- else
- print("Por favor escribe 'arriba' o 'abajo'.")
- end
- end
- end
- -- Función para avanzar y actualizar coordenadas
- local function avanzar()
- while not turtle.forward() do
- turtle.dig()
- sleep(0.5)
- end
- if dir == 0 then posX = posX + 1
- elseif dir == 1 then posZ = posZ + 1
- elseif dir == 2 then posX = posX - 1
- elseif dir == 3 then posZ = posZ - 1
- end
- end
- -- Funciones de movimiento vertical
- local function moverAltura()
- if direccionAltura == "abajo" then
- while not turtle.down() do
- turtle.digDown()
- sleep(0.5)
- end
- posY = posY - 1
- else
- while not turtle.up() do
- turtle.digUp()
- sleep(0.5)
- end
- posY = posY + 1
- end
- end
- -- Funciones de giro
- local function girarDerecha()
- turtle.turnRight()
- dir = (dir + 1) % 4
- end
- local function girarIzquierda()
- turtle.turnLeft()
- dir = (dir + 3) % 4
- end
- local function girar(direccion)
- if giro == "derecha" then
- if direccion == "inicial" then
- girarDerecha()
- elseif direccion == "final" then
- girarDerecha()
- end
- else
- if direccion == "inicial" then
- girarIzquierda()
- elseif direccion == "final" then
- girarIzquierda()
- end
- end
- end
- -- Verificar si el inventario está lleno
- local function inventarioLleno()
- for i = 1, 16 do
- if turtle.getItemCount(i) == 0 then
- return false
- end
- end
- return true
- end
- -- Vaciar inventario en cofre o al suelo
- local function vaciarInventario()
- print("Vaciando inventario en cofre o al suelo...")
- for i = 1, 16 do
- turtle.select(i)
- if not turtle.dropDown() then
- turtle.turnLeft()
- turtle.turnLeft()
- turtle.drop()
- turtle.turnLeft()
- turtle.turnLeft()
- end
- end
- turtle.select(1)
- end
- -- Función para ir al origen
- local function irAlOrigen()
- -- Ajustar altura
- while posY > 0 do
- while not turtle.down() do
- turtle.digDown()
- sleep(0.5)
- end
- posY = posY - 1
- end
- while posY < 0 do
- while not turtle.up() do
- turtle.digUp()
- sleep(0.5)
- end
- posY = posY + 1
- end
- -- Ajustar X
- if posX > 0 then
- while dir ~= 2 do girarDerecha() end
- for i = 1, posX do avanzar() end
- elseif posX < 0 then
- while dir ~= 0 do girarDerecha() end
- for i = 1, -posX do avanzar() end
- end
- -- Ajustar Z
- if posZ > 0 then
- while dir ~= 3 do girarDerecha() end
- for i = 1, posZ do avanzar() end
- elseif posZ < 0 then
- while dir ~= 1 do girarDerecha() end
- for i = 1, -posZ do avanzar() end
- end
- end
- -- Función para volver a una posición guardada
- local function volverAPosicion(destX, destY, destZ, destDir)
- -- Ajustar Z
- local dz = destZ - posZ
- if dz > 0 then
- while dir ~= 1 do girarDerecha() end
- for i = 1, dz do avanzar() end
- elseif dz < 0 then
- while dir ~= 3 do girarDerecha() end
- for i = 1, -dz do avanzar() end
- end
- -- Ajustar X
- local dx = destX - posX
- if dx > 0 then
- while dir ~= 0 do girarDerecha() end
- for i = 1, dx do avanzar() end
- elseif dx < 0 then
- while dir ~= 2 do girarDerecha() end
- for i = 1, -dx do avanzar() end
- end
- -- Ajustar Y
- local dy = destY - posY
- if dy > 0 then
- for i = 1, dy do
- while not turtle.up() do
- turtle.digUp()
- sleep(0.5)
- end
- posY = posY + 1
- end
- elseif dy < 0 then
- for i = 1, -dy do
- while not turtle.down() do
- turtle.digDown()
- sleep(0.5)
- end
- posY = posY - 1
- end
- end
- -- Restaurar orientación
- while dir ~= destDir do
- girarDerecha()
- end
- end
- -- Función para minar una capa
- local function minarCapa()
- for a = 1, ancho do
- for l = 1, largo - 1 do
- turtle.dig()
- avanzar()
- if inventarioLleno() then
- print("Inventario lleno. Volviendo al origen para descargar...")
- local saveX, saveY, saveZ, saveDir = posX, posY, posZ, dir
- irAlOrigen()
- vaciarInventario()
- volverAPosicion(saveX, saveY, saveZ, saveDir)
- print("Regresando a minar...")
- end
- end
- if a < ancho then
- if a % 2 == 1 then
- girar("inicial")
- turtle.dig()
- avanzar()
- girar("inicial")
- else
- girar("final")
- turtle.dig()
- avanzar()
- girar("final")
- end
- end
- end
- end
- -- Verificar combustible suficiente
- local function verificarCombustible(pasosNecesarios)
- local fuelLevel = turtle.getFuelLevel()
- if fuelLevel == "unlimited" then return true end
- if fuelLevel < pasosNecesarios then
- print("¡Combustible insuficiente!")
- print("Se necesitan al menos " .. pasosNecesarios .. " de combustible.")
- print("Por favor, recarga y presiona Enter...")
- read()
- return verificarCombustible(pasosNecesarios)
- end
- end
- -- ==== Inicio del programa ====
- -- Solicitar dimensiones y direcciones
- print("Introduce el largo:")
- local input = read()
- local largo = tonumber(input)
- -- Verifica que sea un número válido
- if not largo or largo < 1 then
- print("Por favor, introduce un número válido mayor que 0.")
- return
- end
- print("Introduce el ancho:")
- local input = read()
- local ancho = tonumber(input)
- -- Verifica que sea un número válido
- if not ancho or ancho< 1 then
- print("Por favor, introduce un número válido mayor que 0.")
- return
- end
- print("Introduce el alto:")
- local input = read()
- local alto = tonumber(input)
- -- Verifica que sea un número válido
- if not alto or alto < 1 then
- print("Por favor, introduce un número válido mayor que 0.")
- return
- end
- -- Verificar que las variables son números válidos
- if type(largo) ~= "number" or type(ancho) ~= "number" or type(alto) ~= "number" then
- print("Error: Las dimensiones deben ser números válidos.")
- return
- end
- giro = pedirGiro()
- direccionAltura = pedirDireccionAltura()
- -- Estimar pasos y comprobar combustible
- local pasosPorCapa = (largo * ancho) + (ancho - 1)
- local pasosTotales = (pasosPorCapa * alto) + (alto - 1)
- if pasosTotales and type(pasosTotales) == "number" then
- verificarCombustible(pasosTotales * 3)
- else
- print("Error con los cálculos de pasos.")
- return
- end
- -- Ejecución de minería
- for h = 1, alto do
- minarCapa()
- if h < alto then
- moverAltura()
- print("Subiendo/Abajo capa " .. h .. " de " .. alto)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement