ลูปซ้อนกัน

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ลูปซ้อนกันช่วยให้คุณสามารถทำซ้ำงานในชุดได้ ตัวอย่างเช่น อบสามชุดของคัพเค้กหกชิ้นหรือการมอบอาวุธให้กับผู้เล่นในสองทีม

วิธีที่ลูปซ้อนกันทำงาน

เมื่อลูปซ้อนกันแล้ว สคริปต์จะไปเรียงตามลำดับจนกว่าจะถึงลูปถัดไปลูปภายในจะทำงานจนกว่าจะตรงตามเงื่อนไขก่อนที่จะกลับไปยังลูปภายนอก

โลจิกภายในลูปซ้อนกัน

ไดอะแกรมต่อไปนี้แสดงขั้นตอนที่วงลูปใช้

  • ลูปภายนอก: รหัสทำงานเส้นต่อเส้นจนกว่าจะถึงลูปภายใน:
  • วงลูปภายนอก: รหัสทำงานเส้นต่อเส้นจนกว่าจะถึงวงลูปภายใน:
  • วงลูปภายนอก: รหัสทำงานเส้นต่อเส้นจนกว่าจะถึงวงลูปภายใน

ตัวอย่างลูปซ้อนกัน

ลูปซ้อนกันอาจดูเหมือนเป็นตัวอย่างที่ค่อนข้างเฉย ดังนั้นตัวอย่างภาพกราฟิกสามารถช่วยได้สําหรับการออกกําลังกายนี้ คัดลอกและวางสคริปต์ตัวอย่างและรันใน Studioสคริปต์นี้จะสร้างทาวเวอร์ของชิ้นส่วนลูปภายนอกจะควบคุมจำนวนชิ้นส่วนที่จะทำ ในขณะที่ลูปภายในจะสร้างชุดจริง

  1. สร้างสคริปต์ใหม่ใน ServerScriptService ชื่อ PartMaker คัดลอกโค้ดด้านล่าง


    local numberOfBatches = 7
    local partsPerBatch = 5
    local partsMade = 0
    -- สร้างลูกบาศเดียว
    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
    -- ลูปภายนอก
    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))
    -- ลูปภายใน
    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. ดูเมื่อสคริปต์สร้างชุดส่วนสีที่แตกต่างกันหลังจากผ่านไปหนึ่งชุด มันจะหยุดชั่วครู่เป็นเวลา 2 วินาทีคำสั่งพิมพ์ในลูปภายนอกจะทำงานเพียงครั้งเดียวต่อการทำลูปภายในเสร็จสมบูรณ์

ซ้อนภายในสําหรับหอคอยลูป

แต่ละลูปมีชุดโค้ดของตัวเองจึงสามารถรับผิดชอบต่องานที่แตกต่างกันได้สิ่งหนึ่งที่ลูปซ้อนกันสามารถทำได้คือเปลี่ยนตำแหน่งที่วัตถุจะเกิดเพื่อสร้างทาวเวอร์เช่นในวิดีโอนี้มีสามลูปที่แตกต่างกันหนึ่งลูปสำหรับการควบคุมตำแหน่งที่ตามความกว้าง ความยาว และความสูงของทาวเวอร์ที่ลูกบาศก์จะเกิด

เขียนสคริปต์ผู้สร้างลูกบาศก์

เพื่อฝึกซ้อมลูปซ้อนกันคุณจะสร้างสคริปที่สร้างทาวเวอร์ของลูกบาศก์สำหรับสคริปต์ทาวเวอร์ลูกบาศก์แรกให้เขียนโค้ดฟังก์ชันที่สร้างลูกบาศก์เดียวหอจะถูกสร้างโดยเรียกฟังก์ชันนี้ซ้ำแล้วซ้ำอีก

ตั้งค่าสคริปต์

สำหรับสคริปต์ทาวเวอร์ลูกบาศก์แรกให้เขียนฟังก์ชันที่สร้างลูกบาศก์เดียวก่อน ทาวเวอร์จะถูกสร้างโดยเรียกฟังก์ชันนี้ซ้ำแล้วซ้ำอีก

  1. ลบ สคริปต์ PartMaker หรือปิดใช้งาน (ในคุณสมบัติของสคริปต์ตรวจสอบว่าปิดใช้งาน)หากคุณไม่ทำ จะมีสคริปต์สองตัวที่ทำชิ้นส่วนในเวลาเดียวกันในสถานที่เดียวกัน

  2. สร้างสคริปต์ใหม่ชื่อ TowerBuilder เพิ่มตัวแปรสำหรับขนาดของทาวเวอร์และขนาดของลูกบาศก์ที่ด้านบน


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
  3. เพิ่มฟังก์ชันท้องถิ่นชื่อ makeCube() ที่สร้างลูกบาศก์สี่เหลี่ยมเดียวโดยใช้ CUBE_SIZE


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
    -- สร้างลูกบาศก์แต่ละอัน
    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    end
  4. ตั้งสีของลูกบาศก์เป็นตัวแปรที่จะได้รับการอัปเดตในลูปซ้อนกัน


    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    cube.Color = currentColor
    end
  5. สุดท้าย พ่อ ลูกบาศก์ใหม่ไปยังพื้นที่ทำงานเพื่อให้ปรากฏ


    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

เกิดในทิศทางที่แตกต่าง

เพื่อสร้างหอคอย สร้างลูกบาศก์ที่จุดเฉพาะโดยการตั้งค่าคุณสมบัติ X, Y, Z ของลูกบาศก์ใหม่แต่ละอัน X และ Z อยู่ติดกัน Y ขึ้นและลง

  1. ใน makeCube() , เพิ่มพารามิเตอร์สำหรับ spawnX , spawnY , และ 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.Parent = workspace
    end
  2. ภายในฟังก์ชันตั้งค่าคุณสมบัติ CFrame ของลูกบาศก์เป็น CFrame ใหม่โดยใช้ spawnX , spawnY , 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

จุดเกิดด้วยลูปซ้อนกัน

สคริปต์จะมีลูปทั้งหมดสามลูป, ลูปละหนึ่งสำหรับความยาว ความกว้าง และความสูงของทาวเวอร์เพื่อเสร็จสิ้นชั้นทั้งหมดก่อนที่จะย้ายขึ้นไป เริ่มต้นด้วยการตั้งค่าพิกัด Y ในลูปแรกและล่าสุด

  1. ภายใต้ฟังก์ชัน makeCube() สร้างลูปสำหรับการตั้งค่าวิธีที่ สูง แต่ละลูกบาศจะเกิดขึ้น

    • ตัวแปรควบคุม : heightIndex = 1
    • จุดสิ้นสุด : TOWER_SIZE
    • ภายในลูปเพิ่ม: spawnY ท้องถิ่น = (หน่วยความสูง - 1) * CUBE_SIZE

    -- สร้างหอคอย
    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    end
  2. เมื่อวนซ้ำครั้งแรกสำหรับความสูงเสร็จแล้ว เริ่มในครั้งที่สองภายในลูปแรกสำหรับลูปเพิ่มลูปใหม่สำหรับสถานที่ที่จะวางลูกบาศก์ตามความยาวของทาวเวอร์

    • ตัวแปรควบคุม : lengthIndex = 1
    • จุดสิ้นสุด : TOWER_SIZE
    • ภายในลูปนั้นเพิ่ม: spawnX ท้องถิ่น = ความยาวของดัชนี * 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. ภายในลูป ครั้งที่สอง เพิ่ม ครั้งที่สาม สำหรับลูปสำหรับทาวเวอร์ ความกว้าง ในลูปสุดท้ายนี้ โทร makeCube() และส่งพารามิเตอร์ X, Y, Z

    • ตัวแปรควบคุม : widthIndex = 1
    • จุดสิ้นสุด : TOWER_SIZE
    • ภายในลูปเพิ่ม:
      • local spawnZ = widthIndex * CUBE_SIZE
      • makeCube(spawnX, spawnY, spawnZ)
      • เวลารอ 0.25 เพื่อให้คุณสามารถรับชมการสร้างหอคอยได้

    -- สร้างหอคอย
    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. เพื่อให้แต่ละชั้นเป็นสีสุ่ม เปลี่ยน currentColor เป็นตัวเลขสุ่ม RGB ในลูปเดียวกันที่คุณสร้างชั้นใหม่


    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. ดำเนินโครงการและรอดูว่ามีการสร้างทาวเวอร์เต็มโดยไม่มีข้อผิดพลาดในหน้าต่างเอาต์พุต

ความท้าทายเสริมเติมตัวเลือก

ด้านล่างนี้เป็นความท้าทายที่มุ่งเน้นตัวเองที่แตกต่างกันที่ใช้ลูปซ้อนกันในรูปแบบที่แตกต่างกัน ลองและเขียนโค้ดด้วยตัวคุณเองก่อนที่จะดูที่การแก้ปัญหา

ส่วนจางไป

เมื่อสร้างหอคอยแล้ว ให้ชิ้นส่วนจางไปในความโปร่งใสจากซ้ายไปขวา

โซลูชันรหัสอยู่ด้านล่าง


local TOWER_SIZE = 6
local CUBE_SIZE = 2
-- สร้างลูกบาศก์แต่ละอัน
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 -- ตั้งค่าความโปร่งใส
cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
cube.Parent = workspace
end
-- สร้างหอคอย
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 --อัปเดตทุกลูปที่เริ่มต้นที่ 0
for widthIndex = 1, TOWER_SIZE do
local spawnZ = widthIndex * CUBE_SIZE
makeCube(spawnX, spawnY, spawnZ)
task.wait(0.05)
end
end
end

ฝนดาวน์วัตถุ

แทนที่จะเป็นชิ้นส่วน, ลองสร้างวัตถุจริง ตัวอย่างที่นี่ใช้คัพเค้ก

เป็นเจ้าของดูว่าคุณสามารถ:

  • สร้างวัตถุจากชิ้นส่วนฐาน ตรวจสอบให้แน่ใจว่าเชื่อมต่อชิ้นส่วนทั้งหมดให้อยู่ด้วยกันเพื่อไม่ให้วัตถุแตกแยก
  • วางวัตถุใน ServerStorage
  • ปรับแต่ง PartMaker ที่พบใน ตัวอย่างลูปซ้อนกัน เพื่อใช้วัตถุแทนชิ้นส่วน

ตัวอย่างจะแสดงที่นี่

มีการรวมโซลูชันรหัสโดยใช้คัพเค้ก


local numberOfBatches = 30
local cupcakesPerBatch = 6
local cupcakesBaked = 0
--ทำคัพเค้กเดียว
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
-- ลูปภายนอก
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))
-- ลูปภายใน
for cupcakeNumber = 1, cupcakesPerBatch do
makeCupcake()
print("Inner loop: cupcake " .. cupcakeNumber)
-- บันทึกมัฟฟินอบ
cupcakesBaked += 1
task.wait(0.5)
end
print("Bottom outer loop: " .. cupcakesBaked .. " cupcakes baked so far.")
end

สรุป

เพื่อทําภารกิจที่ซับซ้อนมากขึ้น นักเขียนโค้ดจะพบว่าเป็นประโยชน์ที่จะรวมลูปหลายตัวและแม้แต่ประเภทลูปที่แตกต่างกันลูปทั้งหมดสามารถซ้อนกันได้ หมายความว่าลูปหนึ่งอยู่ภายในอีกลูปหนึ่งลูปซ้อนกันทำตามโลจิกเดียวกับลูปอื่นใด ๆมันเริ่มต้นในลูปแรกและลูปสุดท้าย, ดำเนินการภารกิจผ่านลูปภายใน, แล้วกลับไปที่ลูปแรกหากเป็นไปได้