الدرس 3 من 10

حقيبة اللاعب

هدف الدرس

كومات لها حدّ أعلى وإرجاع الفائض

01

الشرح

كل لعبة يجمع فيها اللاعب أشياء تحتاج إلى حقيبة فيها عدد محدود من الخانات، وتحمل كل خانة كومة (stack) من نوع واحد من الأغراض حتى حدّ أعلى، مثل 64 في Minecraft. وقد لا يتّسع المكان لكل ما التقطه اللاعب، فلا تُخفي دالة الإضافة الفائض، بل تُرجعه ليبقى على الأرض أو يُرفض التقاطه.

وتجري الإضافة على مرحلتين، فتُكمل أوّلًا الكومات الناقصة من الغرض نفسه، ثم تفتح كومات جديدة في الخانات الفارغة. والخانات محفوظة في جدول slots فيه فراغات، فكل خانة إمّا nil وإمّا جدول مثل { item = "سهم", count = 7 }، لذلك مرّ عليه بـfor i = 1, self.size، لا بـipairs التي تتوقّف عند أول خانة فارغة.

وانتبه عند السحب، فإن أنقصت الكومات واحدة بعد الأخرى ثم اكتشفت في منتصف الطريق أن الكمية لا تكفي، تركت الحقيبة معدّلة إلى نصفها، وهذا على خادم اللعبة باب لثغرات تُنسخ بها الأغراض أو تضيع. لذلك تحقّق من المجموع أوّلًا، ولا تغيّر شيئًا حتى تعرف أن العملية ستكتمل.

02

المطلوب

أكمل Inventory:add(item, amount) لتُكمل الكومات الناقصة من item ثم تملأ الخانات الفارغة، دون أن تتجاوز أي كومة maxStack، ثم تُرجع ما لم يتّسع، أي صفرًا إن اتّسع كله. وأكمل Inventory:remove(item, amount) لتُرجع false دون أي تغيير إن لم تكفِ الكمية، وإلا تُنقص الكمية وتُفرغ كل خانة يصل عددها إلى صفر ثم تُرجع true.

الفحوص

6 فحوص
  1. الدالة add تُرجع ما لم يتّسع
  2. الكومة الناقصة تُكمَل قبل فتح خانة جديدة
  3. الأغراض المختلفة لا تختلط في كومة واحدة
  4. الدالة remove تُنقص الكمية وتُرجع true
  5. الكمية غير الكافية تُرجع false ولا يتغيّر شيء
  6. الخانة التي تفرغ تعود متاحة
03

تلميحات

0/3
main.lua
المخرجاتLua 5.4 (wasmoon)

نحمّل بيئة Lua الآن.

–/6

يبدأ الفحص حين تجهز البيئة.

تجد 6 فحوص في بطاقة «المطلوب».