تسمح لك الحلقات المتداخلة بتكرار المهام على دفعات. على سبيل المثال، خبز ثلاث دفعات من ستة كب كيك، أو تخصيص أسلحة للاعبين في فريقين.
كيف تعمل الحلقات المتداخلة
عندما تكون الحلقات متداخلة، تقوم السكربتات بالمرور خطًا بخط حتى تصل إلى الحلقة التالية. ستعمل الحلقة الداخلية حتى يتم استيفاء شرطها قبل العودة إلى الحلقة الخارجية.
منطق الحلقة المتداخلة
يوضح المخطط التالي الخطوات التي تتخذها الحلقة.
| ![]() |
مثال على الحلقة المتداخلة
يمكن أن تبدو الحلقات المتداخلة مجردة نوعًا ما، لذا يمكن أن تساعدك مثال مرئي. في هذا التمرين، انسخ والصق سكربت عينة وقم بتشغيله في الاستوديو. سيقوم هذا السكربت بإنشاء أبراج من الأجزاء. ستتحكم الحلقة الخارجية في عدد الأجزاء التي يجب صنعها، بينما ستقوم الحلقة الداخلية بإنشاء الدفعة الفعلية.
أنشئ سكربتًا جديدًا في ServerScriptService يسمى PartMaker. انسخ الكود أدناه.
local numberOfBatches = 7local partsPerBatch = 5local 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 = currentColorpart.Parent = workspaceend-- حلقة خارجيةfor partBatch = 1, numberOfBatches doprint("أعلى حلقة خارجية: دفعة الأجزاء " .. partBatch)currentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))-- حلقة داخليةfor partNumber = 1, partsPerBatch docreatePart()print("حلقة داخلية: الجزء " .. partNumber)partsMade += 1task.wait(0.5)endprint("أسفل حلقة خارجية: " .. partsMade .. " أجزاء تم صنعها حتى الآن.")task.wait(2)endراقب كيف يقوم السكربت بتوليد دفعة مختلفة من الأجزاء الملونة. بعد المرور بدفعة واحدة، سيتوقف لمدة ثانيتين. ستعمل جملة الطباعة في الحلقة الخارجية مرة واحدة فقط لكل حلقة داخلية مكتملة.
برج الحلقة المتداخلة
تمتلك كل حلقة مجموعتها الخاصة من التعليمات البرمجية، لذلك يمكن أن تكون مسؤولة عن مهام مختلفة. واحدة من الأشياء التي يمكن أن تفعلها الحلقات المتداخلة هي تغيير مكان ظهور الشيء لإنشاء برج مثل البرج في هذا الفيديو. هناك ثلاث حلقات مختلفة، واحدة لكل منها للتحكم في المكان على العرض والطول والارتفاع الذي يظهر فيه المكعب.
برمجة سكربت صانع مكعب
لممارسة الحلقات المتداخلة، ستقوم بإنشاء سكربت يقوم بإنشاء برج من المكعبات. بالنسبة لسكربت برج المكعب، أولاً قم ببرمجة دالة تقوم بتوليد مكعب واحد. سيتم بناء البرج من خلال استدعاء هذه الدالة بشكل متكرر.
إعداد السكربت
بالنسبة لسكربت برج المكعب، أولاً قم ببرمجة دالة تقوم بتوليد مكعب واحد. سيتم بناء البرج من خلال استدعاء هذه الدالة بشكل متكرر.
احذف سكربت PartMaker أو قم بإيقاف تشغيله (في خصائص السكربت، تحقق من Disabled). إذا لم تفعل ذلك، سيكون هناك اثنان من السكربتات يصنعان الأجزاء في نفس الوقت في نفس المكان.
أنشئ سكربتًا جديدًا يسمى TowerBuilder. أضف متغيرات لحجم البرج وحجم المكعب في الأعلى.
local TOWER_SIZE = 4local CUBE_SIZE = 2أضف دالة محلية باسم makeCube() التي تخلق مكعبًا مربعًا واحدًا باستخدام CUBE_SIZE.
local TOWER_SIZE = 4local CUBE_SIZE = 2-- يصنع مكعبات فرديةlocal function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)endعيّن لون المكعب إلى متغير سيتم تحديثه في الحلقات المتداخلة.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorendوأخيرًا، قم بإضافة المكعب الجديد إلى مساحة العمل بحيث يظهر.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceend
ظهور في اتجاهات مختلفة
لإنشاء برج، قم بإنتاج المكعبات في نقاط محددة عن طريق ضبط خصائص X، Y، Z لكل مكعب جديد. X و Z هما من جانب إلى جانب. Y هو لأعلى ولأسفل.
في 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 = currentColorcube.Parent = workspaceendداخل الدالة، عيّن خاصية 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 = currentColorcube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)cube.Parent = workspaceend
الظهور بحلقات متداخلة
سيحتوي السكربت على ثلاث حلقات إجمالًا، واحدة لكل من طول البرج وعرضه وارتفاعه. لإكمال طابق كامل قبل الانتقال لأعلى، ابدأ بتعيين الإحداثي Y في الحلقة الأولى، الخارجية.
تحت دالة makeCube(), أنشئ حلقة for لتعيين مدى ارتفاع كل مكعب يظهر.
- متغير التحكم: heightIndex = 1
- نقطة النهاية: TOWER_SIZE
- داخل الحلقة، أضف: local spawnY = (heightIndex - 1) * CUBE_SIZE
-- يبني البرجfor heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEendمع الانتهاء من الحلقة الأولى للارتفاع، ابدأ في الثانية. داخل الحلقة for الأولى، أضف حلقة for جديدة لمكان وضع المكعب على طول البرج.
- متغير التحكم: lengthIndex = 1
- نقطة النهاية: TOWER_SIZE
- داخل تلك الحلقة أضف: local spawnX = lengthIndex * CUBE_SIZE
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEendendداخل الحلقة الثانية، أضف حلقة for ثالثة لعرض البرج. في هذه الحلقة النهائية، قم باستدعاء makeCube() ومرر معلمات X، Y، Z.
- متغير التحكم: widthIndex = 1
- نقطة النهاية: TOWER_SIZE
- داخل الحلقة أضف:
- local spawnZ = widthIndex * CUBE_SIZE
- makeCube(spawnX, spawnY, spawnZ)
- زمن الانتظار قدره 0.25 حتى تتمكن من مشاهدة بناء البرج.
-- يبني البرجfor heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEfor widthIndex = 1, TOWER_SIZE dolocal spawnZ = widthIndex * CUBE_SIZEmakeCube(spawnX, spawnY, spawnZ)task.wait(0.25)endendendلجعل كل طابق لونًا عشوائيًا، غير currentColor إلى أرقام RGB عشوائية في نفس الحلقة التي تقوم فيها بإنشاء طابق جديد.
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEcurrentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))for lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEfor widthIndex = 1, TOWER_SIZE dolocal spawnZ = widthIndex * CUBE_SIZEmakeCube(spawnX, spawnY, spawnZ)task.wait(0.25)endendendقم بتشغيل المشروع وانتظر لترى أن برجًا كاملًا تم إنشاؤه دون أي أخطاء في نافذة الإخراج.
تحديات اختيارية
أدناه توجد تحديات ذاتية التوجيه تستخدم الحلقات المتداخلة بطرق مختلفة. حاول البرمجة لوحدك قبل النظر إلى الحل.
تلاشي الأجزاء
أثناء بناء البرج، اجعل الأجزاء تتلاشى في الشفافية من اليسار إلى اليمين.

حل الكود أدناه.
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("أعلى حلقة خارجية: دفعة الكب كيك " .. 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("حلقة داخلية: كب كيك " .. cupcakeNumber)
-- تتبع الكب كيك المخبوزة
cupcakesBaked += 1
task.wait(0.5)
end
print("أسفل حلقة خارجية: " .. cupcakesBaked .. " كب كيك مخبوزة حتى الآن.")
end
خلاصة
لإنجاز مهام أكثر تعقيدًا، سيجد المبرمجون أنه من المفيد دمج عدة حلقات، وحتى أنواع مختلفة من الحلقات. يمكن أن تكون جميع الحلقات متداخلة، مما يعني أن حلقة واحدة داخل أخرى. تتبع الحلقات المتداخلة نفس منطق أي حلقة أخرى. تبدأ في الحلقة الأولى، الخارجية، وتنفيذ المهام من خلال الحلقات الداخلية، ثم تعود إلى الحلقة الأولى إذا لزم الأمر.
