الدرس 8 من 10
البنى
- 13 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
البنية struct بحقولها ودوالها
الشرح
تجمع البنية struct بيانات مترابطة تحت اسم واحد، فللاعب اسم وصحة، وبدل أن تعرّف متغيّرين منفصلين لكل لاعب تكتب struct Player { std::string name; int hp = 100; };، ولا تنسَ الفاصلة المنقوطة بعد القوس الأخير. وتُنشئ لاعبًا بكتابة القيم بترتيب الحقول مثل Player hero{"ليان", 80};، والحقل الذي لا تذكره يأخذ قيمته الافتراضية، فاللاعب Player hero{"ليان"}; صحته 100. وتصل إلى الحقول بالنقطة مثل hero.hp -= 10;.
ويمكن أن تكتب داخل البنية دوالًا تعمل على حقولها مباشرة، وتُسمّى الدوال الأعضاء (member functions)، فداخل takeDamage تعني hp صحة هذا اللاعب نفسه، وتستدعيها بالنقطة مثل hero.takeDamage(30);. وكلمة const بعد القوسين في bool alive() const وعد بأنّ الدالة لا تغيّر الكائن، ولا تستطيع أن تستدعي على const Player& إلا الدوال التي فيها هذا الوعد، فالدالة التي تقرأ الفريق بـ const std::vector<Player>& لا تستطيع أن تستدعي alive() إذا لم تكن const.
وفائدة ذلك أنّ القاعدة تبقى مع البيانات، فالصحة لا تنزل تحت الصفر لأنّ الضرر يمرّ عبر takeDamage التي تمنع ذلك. لكن حقول struct مكشوفة، ولا شيء يمنع كتابة hero.hp = -50; من خارجها، وهذا ما سنعالجه في الدرس القادم.
المطلوب
أكمل Player بحيث تبدأ صحته من 100 إذا لم تُذكر، واجعل void takeDamage(int amount) تُنقص الصحة دون أن تنزل بها تحت الصفر، وتتجاهل الضرر السالب فلا يزيد الصحة. واجعل bool alive() const تُرجع true ما دامت الصحة فوق الصفر. ثم أكمل int aliveCount(const std::vector<Player>& team) لتُرجع عدد الأحياء في الفريق.
الفحوص
5 فحوص- الصنف Player يُنشأ بالاسم، وصحته 100 إن لم تُذكر
- الدالة takeDamage تُنقص الصحة
- الدالة takeDamage لا تُنزل الصحة تحت الصفر، والضرر السالب لا يزيدها
- الدالة alive تُرجع true ما دامت الصحة فوق الصفر
- الدالة aliveCount تعدّ الأحياء في الفريق