الدرس 3 من 10
حقيبة اللاعب
- 15 دقيقة
- 6 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
كومات بحدّ أعلى وفائض يعود
الشرح
كل لعبة يجمع فيها اللاعب أشياء تحتاج إلى حقيبة: عدد محدود من الخانات، وكل خانة تحمل كومة من صنف واحد حتى حدّ أعلى، مثل 64 في Minecraft. وقد لا يتّسع المكان لكل ما التقطه اللاعب، فالدالة التي تضيف لا تبتلع الفائض بل تُرجعه، ليبقى على الأرض أو يُرفض الالتقاط.
والإضافة على مرحلتين: تُكمل أوّلًا الكومات الناقصة من الصنف نفسه، ثم تفتح كومات جديدة في الخانات الفارغة. والخانات جدول slots فيه ثغرات: كل خانة إمّا nil وإمّا { item = "سهم", count = 7 }. لذلك امشِ عليه بـfor i = 1, self.size، لا بـipairs الذي يتوقّف عند أول خانة فارغة.
والفخّ في السحب: من يُنقص الكومات واحدة تلو الأخرى ثم يكتشف في منتصف الطريق أن الرصيد لا يكفي، يترك الحقيبة نصف معدّلة. وعلى خادم اللعبة هذا باب لثغرات النسخ والفقدان. تحقّق من المجموع أوّلًا، ولا تلمس شيئًا حتى تعرف أن العملية ستكتمل.
المطلوب
أكمل Inventory:add(item, amount): تُكمل الكومات الناقصة من item ثم تملأ الخانات الفارغة، ولا تتجاوز كومةٌ maxStack، وتُرجع ما لم يتّسع، أي صفرًا إن اتّسع كله. وأكمل Inventory:remove(item, amount): تُرجع false بلا أي تغيير إن لم يكفِ الرصيد، وإلا أنقصت وأفرغت كل خانة يصل عددها إلى صفر وأرجعت true.
معايير التصحيح
6 معايير- add تُرجع ما لم يتّسع
- الكومة الناقصة تُكمَل قبل فتح خانة
- الأصناف المختلفة لا تختلط في كومة
- remove تُنقص وتُرجع true
- الرصيد الناقص: false ولا شيء يتغيّر
- الخانة التي تفرغ تعود متاحة