Bucles anidados

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Los bucles anidados te permiten repetir tareas en lotes. Por ejemplo, hornear tres lotes de seis magdalenas o asignar armas a jugadores en dos equipos.

Cómo se ejecutarlos bucles anidados

Cuando los bucles se anidan, los scripts van línea por línea hasta que lleguen al siguiente bucle.El bucle interno se ejecutará hasta que se cumpla su condición antes de volver al bucle exterior.

Lógica de bucle anidado

El siguiente diagrama muestra los pasos que sigue un bucle.

  • Bucle exterior: el código se ejecuta línea por línea hasta que llega al bucle interno.:
  • Bucle exterior: el código se ejecuta línea por línea hasta que llega al bucle interno.:
  • Bucle exterior: el código se ejecuta línea por línea hasta que llega al bucle interno.

Ejemplo de bucle anidado

Los bucles anidados pueden parecer algo abstractos, por lo que un ejemplo visual puede ayudar.Para este ejercicio, copia y pega un script de muestra y ejecútalo en Studio.Este script creará torres de partes.El bucle exterior controlará cuántas piezas hacer, mientras que el bucle interno creará el lote real.

  1. Crea un nuevo script en ServerScriptService llamado PartMaker. Copia el código a continuación.


    local numberOfBatches = 7
    local partsPerBatch = 5
    local partsMade = 0
    -- Hace un cubo único
    local function createPart()
    local part = Instance.new("Part")
    part.Size = Vector3.new(2, 2, 2)
    part.CFrame = CFrame.new(20, 0, 20)
    part.Color = currentColor
    part.Parent = workspace
    end
    -- Bucle exterior
    for partBatch = 1, numberOfBatches do
    print("Top outer loop: part batch " .. partBatch)
    currentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
    -- Bucle interno
    for partNumber = 1, partsPerBatch do
    createPart()
    print("Inner loop: part " .. partNumber)
    partsMade += 1
    task.wait(0.5)
    end
    print("Bottom outer loop: " .. partsMade .. " parts made so far.")
    task.wait(2)
    end
  2. Observe cómo el script genera un lote diferente de piezas coloreadas.Después de pasar por una tanda, se pausará durante 2 segundos.La declaración de impresión en el bucle exterior se ejecutará solo una vez por ciclo interno completado.

Nesteado para la torre de bucle

Cada bucle tiene su propio conjunto de código, por lo que puede ser responsable de diferentes tareas.Una cosa que los bucles anidados pueden hacer es cambiar la ubicación de donde se genera un objeto para crear una torre como la que se muestra en este video.Hay tres bucles diferentes, uno por cada uno para controlar dónde a lo largo de la anchura, longitud y altura de la torre se genera el cubo.

scriptun guión de creador de cubos

Para practicar bucles anidados, crearás un script que crea una torre de cubos.Para el guión de la torre cúbica, primero cree una función que genere un solo cubo.La torre se construirá llamando repetidamente a esta función.

Configurar el script

Para el guión scriptla torre cúbica, primero cree una función que genere un solo cubo. La torre se construirá al llamar repetidamente esta función.

  1. Eliminar el script de PartMaker o desactivarlo (en las propiedades del script, verificar Deshabilitado).Si no lo haces, habrá dos scripts que hagan partes al mismo tiempo en el mismo lugar.

  2. Crea un nuevo script llamado TowerBuilder. Añade variables para el tamaño de la torre y el tamaño del cubo en la parte superior.


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
  3. Añade una función local llamada makeCube() que crea un cubo cuadrado único usando CUBE_SIZE.


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
    -- Crea cubos individuales
    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    end
  4. Establece el color del cubo a una variable que se actualizará en los bucles anidados.


    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    cube.Color = currentColor
    end
  5. Por último, padre el nuevo cubo al espacio de trabajo para que aparezca.


    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    cube.Color = currentColor
    cube.Parent = workspace
    end

Aparecer en diferentes direcciones

Para crear una torre, engendra cubos en puntos específicos al configurar las propiedades X, Y, Z de cada nuevo cubo. X y Z están lado a lado. Y está arriba y abajo.

  1. En makeCube(), agregue parámetros para spawnX, spawnY y spawnZ. Estos números establecerán la lugar de regeneraciónde cada nuevo cubo.


    -- Crea cubos individuales
    local function makeCube(spawnX, spawnY, spawnZ)
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    cube.Color = currentColor
    cube.Parent = workspace
    end
  2. Dentro de la función, establece la propiedad CFrame del cubo a un nuevo CFrame usando los parámetros spawnX, spawnY y spawnZ.


    local function makeCube(spawnX, spawnY, spawnZ)
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    cube.Color = currentColor
    cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
    cube.Parent = workspace
    end

Aparecer con bucles anidados

El script tendrá tres bucles en total, uno por cada longitud, ancho y altura de la torre.Para completar un piso entero antes de moverse hacia arriba, comience por establecer la coordenada Y en el primer bucle exterior.

  1. Bajo la función makeCube(), crea un bucle for para establecer cómo alto se genera cada cubo.

    • Variable de control : heightIndex = 1
    • Punto final : TOWER_SIZE
    • Dentro del bucle, añadir: spawnY local = (índice de altura - 1) * CUBE_SIZE

    -- Construye torre
    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    end
  2. Con el primer bucle para la altura terminado, comience en el segundo.Dentro del primer bucle, agrega un nuevo bucle de for para donde colocar el cubo a lo largo de la torre.

    • Variable de control : lengthIndex = 1
    • Punto final : TOWER_SIZE
    • Dentro de ese bucle añadir: spawnX local = longitudIndex * CUBE_SIZE

    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    for lengthIndex = 1, TOWER_SIZE do
    local spawnX = lengthIndex * CUBE_SIZE
    end
    end
  3. Dentro del segundo bucle , agrega un tercer bucle para el ancho de la torre.En este último bucle, llama a makeCube() y pasa los parámetros X, Y, Z.

    • Variable de control : widthIndex = 1
    • Punto final : TOWER_SIZE
    • Dentro del bucle añadir:
      • local spawnZ = widthIndex * CUBE_SIZE
      • makeCube(spawnX, spawnY, spawnZ)
      • Un tiempo de espera de 0.25 para que puedas ver la torre ser construida.

    -- Construye torre
    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    for lengthIndex = 1, TOWER_SIZE do
    local spawnX = lengthIndex * CUBE_SIZE
    for widthIndex = 1, TOWER_SIZE do
    local spawnZ = widthIndex * CUBE_SIZE
    makeCube(spawnX, spawnY, spawnZ)
    task.wait(0.25)
    end
    end
    end
  4. Para que cada piso sea de color aleatorio, cambia currentColor a números aleatorios RGB en el mismo bucle en el que creas un nuevo piso.


    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    currentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
    for lengthIndex = 1, TOWER_SIZE do
    local spawnX = lengthIndex * CUBE_SIZE
    for widthIndex = 1, TOWER_SIZE do
    local spawnZ = widthIndex * CUBE_SIZE
    makeCube(spawnX, spawnY, spawnZ)
    task.wait(0.25)
    end
    end
    end
  5. Ejecuta el proyecto y espera a ver que se ha creado una torre completa sin errores en la ventana de salida.

Desafíos opcionales

A continuación, se muestran diferentes desafíos autoguiados que utilizan bucles anidados de diferentes maneras. Intenta y programa por tu cuenta antes de ver la solución.

Desaparecer piezas

A medida que se construye la torre, haz que las piezas se difuminen en transparencia de izquierda a derecha.

La solución de código está a continuación.


local TOWER_SIZE = 6
local CUBE_SIZE = 2
-- Crea cubos individuales
local function makeCube(spawnX, spawnY, spawnZ)
local cube = Instance.new("Part")
cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
cube.Color = currentColor
cube.Transparency = cubeTransparency -- Establece la transparencia
cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
cube.Parent = workspace
end
-- Construye torre
for heightIndex = 1, TOWER_SIZE do
local spawnY = (heightIndex - 1) * CUBE_SIZE
currentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
for lengthIndex = 1, TOWER_SIZE do
local spawnX = lengthIndex * CUBE_SIZE
cubeTransparency = (lengthIndex - 1) * 0.10 --Se actualiza cada bucle que comienza en 0
for widthIndex = 1, TOWER_SIZE do
local spawnZ = widthIndex * CUBE_SIZE
makeCube(spawnX, spawnY, spawnZ)
task.wait(0.05)
end
end
end

Lluvia de objetos

En lugar de piezas, prueba generar un objeto real. El ejemplo aquí usó magdalenas.

Por tu en posesión, ve si puedes:

  • Crea un objeto a partir de piezas base. Asegúrate de soldar todas las piezas juntas para que el objeto no se desintegre.
  • Coloca el objeto en el almacén del servidor
  • Modifica el PartMaker encontrado en el Ejemplo de bucle anidado para usar tu objeto en lugar de piezas.

Se muestra una muestra aquí.

Se incluye una solución de código que utiliza magdalenas.


local numberOfBatches = 30
local cupcakesPerBatch = 6
local cupcakesBaked = 0
--Hace un solo pastel de cupcake
local function makeCupcake()
local ServerStorage = game:GetService("ServerStorage")
local cupcake = ServerStorage.Cupcake:Clone()
local cup = cupcake.Cup
local frosting = cupcake.Frosting
cupcake:SetPrimaryPartCFrame(CFrame.new(0, 20, 0) * CFrame.Angles(0, 0, -90))
frosting.Color = frostingColor
cup.Color = cupColor
cupcake.Parent = workspace
end
-- Bucle exterior
for cupcakeBatch = 1, numberOfBatches do
print("Top outer loop: cupcake batch " .. cupcakeBatch)
frostingColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
cupColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
-- Bucle interno
for cupcakeNumber = 1, cupcakesPerBatch do
makeCupcake()
print("Inner loop: cupcake " .. cupcakeNumber)
-- Rastrear muffins horneados
cupcakesBaked += 1
task.wait(0.5)
end
print("Bottom outer loop: " .. cupcakesBaked .. " cupcakes baked so far.")
end

Resumen

Para realizar tareas más complejas, los codificadores encontrarán útil combinar múltiples bucles, e incluso diferentes tipos de bucles.Todos los bucles se pueden anidar, lo que significa que un bucle está dentro de otro.Los bucles anidados siguen la misma lógica que cualquier otro bucle.Comienza en el primer, último bucle, ejecuta tareas a través de bucles internos y luego regresa al primer bucle si es aplicable.