التطوير / ROBLOX
حلقة for العددية في Luau: دفعة محدودة من ثلاث محطات
تدرّب على حدود الحلقة وعدد العمليات والترتيب العكسي، وعلى الفرق بين تجاوز عملية وإيقاف الدفعة. نُفّذت الأمثلة المستقلة في Luau دون تغيير ألعاب منشورة.
حدّد الدفعة قبل كتابة الحلقة #
تخيّل ورشة تراجع ثلاث محطات مرقمة قبل بدء العمل. يكفي في التدريب استخدام الأرقام 1 و2 و3، دون إنشاء كائنات Roblox أو ربط لاعبين أو منح مكافآت. اكتب النتيجة المتوقعة أولاً: يظهر كل رقم مرة واحدة ويكون عدد العمليات المكتملة ثلاثاً. التوقع الواضح يكشف خطأ الحدود قبل إضافة قواعد لعب أكثر تعقيداً إلى المثال.
رقم المحطة هنا قيمة عدّاد، وليس اسم كائن ولا معرّف لاعب. يحتاج المشروع الحقيقي إلى ربط الرقم بكائن تم التحقق منه بشكل منفصل. هذا التدريب يشرح تكرار التنفيذ فقط. توافق المخرجات مع التوقع لا يثبت صحة إعداد المشهد أو حفظ تقدم اللاعبين أو اكتمال هدف داخل لعبة حقيقية.
نفّذ ثلاث عمليات #
يستخدم المثال المستقل الأول أدناه حلقة for عددية من 1 إلى 3، ويزيد processed بعد كل عملية. توقّع Station 1 ثم Station 2 ثم Station 3، وبعدها Processed 3. يفصل print بين معاملاته؛ راجع القيم وترتيبها. شغّل هذا المثال وحده في البداية حتى لا تختلط رسائل قديمة بنتيجة الاختبار الحالي.
اقرأ أرقام المحطات الثلاثة بالإضافة إلى العدد النهائي. فقد ينتج برنامج خاطئ ثلاث عمليات أيضاً، لكنه يكرر محطة ويترك أخرى. processed فحص بسيط لعدد الأفعال المكتملة فقط. ينتمي العدّاد station إلى جسم الحلقة؛ إذا احتجت نتيجة بعد end فاحفظها صراحة في متغير مستقل، ولا تعتمد على هذا المتغير المحلي خارج نطاقه.
local processed = 0
for station = 1, 3 do
print("Station", station)
processed += 1
end
print("Processed", processed)راجع الحدين معاً #
تشمل هذه الدفعة الرقمين 1 و3، ولذلك تحدث ثلاث دورات وليس دورتين. الخطأ الشائع هو طرح البداية من النهاية ونسيان موضع البداية نفسه. للأعداد الصحيحة المتتابعة بخطوة واحدة واتجاه مناسب، يكون العدد النهاية ناقص البداية زائد واحد. جرّب هذه العلاقة على دفعة صغيرة قبل توسيع النطاق إلى عدد كبير من العمليات.
اختبر حالتين إضافيتين: من 2 إلى 2 بخطوة موجبة ينفّذ عملية واحدة، ومن 4 إلى 3 بخطوة موجبة لا ينفّذ شيئاً. قد تكون النتيجة صفر صحيحة وليست عطلاً في print. إذا كنت تتوقع دفعة غير فارغة، فتحقق من الحدود والاتجاه، ولا ترفع النهاية عشوائياً لإخفاء مشكلة المدخلات الأصلية.
راجع المحطات بالترتيب العكسي #
يبدأ المثال المستقل الثاني عند 3 وينتهي عند 1 ويحدد الخطوة -1 صراحة. الترتيب المتوقع هو 3 ثم 2 ثم 1، وبعده Processed 3. يمكنك تصوره كتدريب على إجراء إغلاق يراجع المحطات بالعكس. باستخدام الخطوة الموجبة المعتادة سيكون النطاق من 3 إلى 1 فارغاً بدلاً من ذلك.
قارن المخرجات جنباً إلى جنب: العدد النهائي متساوٍ، لكن الترتيب مختلف وهو جزء من المطلوب. حدّد الاتجاه في رأس الحلقة بدلاً من تغيير العدّاد يدوياً داخل جسمها. لهذا التدريب الأول استخدم خطوة صحيحة صغيرة واضحة وغير صفرية. الحدود الكسرية والنطاقات الضخمة والقيم الخارجية تحتاج فحوصاً إضافية لا يحل هذا المثال محلها.
local processed = 0
for station = 3, 1, -1 do
print("Station", station)
processed += 1
end
print("Processed", processed)ميّز continue عن break #
إذا أردت تجاوز المحطة 2 مؤقتاً، فإن continue داخل الشرط المناسب ينقل التنفيذ إلى الدورة التالية. في النطاق 1–3 تصبح المحطتان المكتملتان 1 و3. زِد processed بعد شرط التجاوز إذا كان يقيس العمليات المكتملة. زيادته قبل continue تقيس الأرقام التي تمت زيارتها، وهي كمية مختلفة حتى لو بقي اسم المتغير نفسه.
إذا وجدت سبباً لإنهاء الدفعة كلها، فإن break يخرج من أقرب حلقة. التوقف قبل معالجة المحطة 2 يكمل عملية المحطة 1 فقط، ولا يصل إلى المحطة 3. تصبح قاعدة الحلقة الأقرب مهمة عند تداخل الحلقات. لا تصف break بأنه يوقف جميع البرامج أو يغلق الخادم؛ فهذا يتجاوز نطاق التحكم الحقيقي للتعليمة.
دوّن النتائج المتوقعة #
اكتب أربع حالات: السير من 1 إلى 3 ينتج ثلاث عمليات؛ الحدّان المتساويان 2–2 ينتجان واحدة؛ النطاق 4–3 بخطوة موجبة ينتج صفراً؛ والعكس 3–1 بخطوة -1 ينتج ثلاثاً. سجّل أيضاً تسلسل الأرقام لكل حالة. بهذه الطريقة تميّز التسلسل الصحيح عن توافق عرضي في قيمة العدّاد النهائية.
بعد ذلك اختبر التجاوز والتوقف كسيناريوهين مستقلين على الدفعة الصغيرة نفسها. لا تخلط الغرضين في شرط مبهم. توقّع التسلسل قبل التشغيل ثم قارنه بالمخرجات. عند ظهور اختلاف، ابحث عن أول عملية غير متوقعة؛ غالباً تقدم دليلاً أوضح من قراءة سطر العدد النهائي مراراً دون مراجعة ما سبقه من خطوات.
العمل المحدود له تكلفة أيضاً #
يمكن لحلقة محدودة أن تنفّذ عملاً مكلفاً أكثر من اللازم دفعة واحدة. طباعة ثلاثة أرقام توضح العدّ، أما إنشاء مليون كائن أو تكرار طلبات الشبكة فهو عبء مختلف. قبل إضافة عملية حقيقية حدّد حجم الدفعة المسموح وفكّر في تكلفة العملية الواحدة. لا تعتمد عدداً يقدمه اللاعب دون التحقق من الحدود المسموح بها.
حلقة for العددية ليست مؤقتاً، فالدورات لا تمثل ثواني. لا ينفّذ هذا الدليل استطلاعاً لا نهائياً ولا مكافآت دورية ولا مزامنة شبكية. يحتاج النظام الحقيقي إلى قرارات منفصلة عن الجدولة ومكان التنفيذ وأخطاء العمليات. نجاح التدريب الحسابي الصغير يؤكد التحكم في الحلقة، وليس جاهزية نظام لعبة كامل للنشر أمام المستخدمين.
| الحالة | النتيجة المتوقعة |
|---|---|
| 1 → 3، خطوة 1 | 1، 2، 3: ثلاث |
| 2 → 2، خطوة 1 | 2: واحدة |
| 4 → 3، خطوة 1 | فارغ: صفر |
| 3 → 1، خطوة -1 | 3، 2، 1: ثلاث |
سلّم فحصاً يمكن تكراره #
اكتب حدود النطاق والخطوة وتسلسل المحطات المتوقع وعدد العمليات الفعلي في ملاحظة التسليم. أرفق المثالين المستقلين ونتائج حالات الحدود الأربع. وضّح مع continue هل يحصي العدّاد الزيارات أم العمليات المكتملة. ومع break اذكر شرط التوقف وحدّد الجزء الذي بقي دون معالجة حتى لا يظن المطور التالي أن الدفعة اكتملت.
نُفّذت أمثلة هذا الدليل في مفسر Luau مستقل، ولم تعمل على محطات حقيقية داخل Roblox Studio. يستطيع مطور آخر استخدامها كنقطة بداية للاختبار، لكنه يحتاج إلى فحص كائناته وقواعد لعبته بنفسه. احتفظ بالتوقعات بجانب الكود؛ عندما يتغير عدد المحطات يساعد ذلك على اكتشاف خطأ الحدود قبل نشر تحديث جديد.
| حقل الفحص | ما يُسجّل |
|---|---|
| الحدود | رقم البداية والنهاية |
| الخطوة | الاتجاه المحدد |
| الترتيب | كل الأرقام بالترتيب |
| العدد | عدد العمليات المكتملة |