Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

نظام شخصيات الألعاب

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 109 من 110.

challenge icon

التحدي

سهل

لنقم ببناء نظام شخصيات ألعاب يجمع كل مفاهيم البرمجة كائنية التوجه (OOP) التي أتقنتها! ستقوم بإنشاء فئات شخصيات مختلفة بقدرات وإحصائيات وآليات قتال فريدة - لمحاكاة كيفية عمل الشخصيات في لعبة حقيقية.

سيتم تنظيم نظامك عبر ستة ملفات:

  • character.dart: أنشئ فئة مجردة (abstract class) باسم Character تعمل كأساس لجميع أنواع الشخصيات. كل شخصية لديها name (String)، و _health خاص (int)، و attackPower (int)، و defense (int). قم بتضمين getter للصحة وهذه الأساليب (methods):
    • takeDamage(int damage) - يقلل الصحة بمقدار damage - defense (الحد الأدنى للضرر الملحق هو 1، ولا يمكن أن تقل الصحة عن 0). يطبع name takes X damage! Health: Y
    • bool isAlive() - يرجع true إذا كانت الصحة أكبر من 0
    • أسلوب مجرد String attack() تقوم الفئات الفرعية بتنفيذه لأسلوب الهجوم الفريد الخاص بها
    قم بإعادة كتابة (Override) لـ toString() لترجع name [Class] - HP: health, ATK: attackPower, DEF: defense حيث تأتي Class من runtimeType.
  • abilities.dart: أنشئ اثنين من الـ mixins اللذين يوفران قدرات خاصة:
    • CanHeal - يوفر أسلوب heal(int amount). بما أن الـ mixins لا يمكنها الوصول مباشرة إلى الحقول الخاصة، يجب أن يحدد هذا الـ mixin أسلوباً مجرداً void restoreHealth(int amount) تقوم فئة الشخصية بتنفيذه. يستدعي أسلوب heal() الأسلوب restoreHealth(amount) ويطبع name heals for amount HP!
    • CanCastSpells - يوفر int mana (القيمة الافتراضية 100) وأسلوب castSpell(String spellName, int manaCost) الذي يقلل المانا إذا كانت كافية، ويطبع name casts spellName!، ويرجع true. إذا كانت المانا غير كافية، يطبع Not enough mana! ويرجع false.
  • warrior.dart: أنشئ فئة Warrior ترث من Character. المحاربون هم "tanks" ذوو دفاع عالٍ. قم بتهيئتها بـ 150 صحة، و 20 قوة هجوم، و 15 دفاع. قم بتنفيذ attack() لترجع name swings a mighty sword!
  • mage.dart: أنشئ فئة Mage ترث من Character وتستخدم mixins الـ CanCastSpells و CanHeal. السحرة ضعفاء جسدياً ولكنهم أقوياء. قم بتهيئتها بـ 80 صحة، و 35 قوة هجوم، و 5 دفاع. قم بتنفيذ attack() لترجع name hurls a fireball!. قم بتنفيذ restoreHealth(int amount) لزيادة الصحة (بحد أقصى 80).
  • archer.dart: أنشئ فئة Archer ترث من Character. الرماة مقاتلون متوازنون. قم بتهيئتها بـ 100 صحة، و 25 قوة هجوم، و 10 دفاع. قم بتنفيذ attack() لترجع name fires a precise arrow!
  • main.dart: استعرض نظام الشخصيات الخاص بك عن طريق إنشاء واحد من كل نوع شخصية: محارب باسم Thorin، وساحر باسم Gandalf، ورامي سهام باسم Legolas. اطبع كل شخصية باستخدام toString(). ثم قم بمحاكاة تسلسل معركة:
    1. اطبع رسالة هجوم Thorin
    2. يتلقى Gandalf ضرراً قدره 30
    3. يلقي Gandalf تعويذة Healing Light (تكلف 25 مانا)
    4. يعالج Gandalf نفسه بمقدار 20 HP
    5. اطبع رسالة هجوم Gandalf
    6. يتلقى Thorin ضرراً قدره 40
    7. اطبع رسالة هجوم Legolas
    8. اطبع ما إذا كانت كل شخصية على قيد الحياة بالتنسيق: name alive: true/false

المخرجات المتوقعة:

Thorin [Warrior] - HP: 150, ATK: 20, DEF: 15
Gandalf [Mage] - HP: 80, ATK: 35, DEF: 5
Legolas [Archer] - HP: 100, ATK: 25, DEF: 10
Thorin swings a mighty sword!
Gandalf takes 25 damage! Health: 55
Gandalf casts Healing Light!
Gandalf heals for 20 HP!
Gandalf hurls a fireball!
Thorin takes 25 damage! Health: 125
Legolas fires a precise arrow!
Thorin alive: true
Gandalf alive: true
Legolas alive: true

جرّب بنفسك

import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';

void main() {
  // TODO: أنشئ Warrior باسم "Thorin"

  // TODO: أنشئ Mage باسم "Gandalf"

  // TODO: أنشئ Archer باسم "Legolas"

  // TODO: اطبع كل شخصية باستخدام toString()

  // TODO: محاكاة تسلسل المعركة:
  // 1. اطبع رسالة هجوم Thorin
  // 2. يتلقى Gandalf ضرراً بمقدار 30
  // 3. يلقي Gandalf تعويذة "Healing Light" (تكلف 25 mana)
  // 4. Gandalf يعالج نفسه بمقدار 20 HP
  // 5. اطبع رسالة هجوم Gandalf
  // 6. يتلقى Thorin ضرراً بمقدار 40
  // 7. اطبع رسالة هجوم Legolas
  // 8. اطبع ما إذا كانت كل شخصية على قيد الحياة: "name alive: true/false"
}

جميع دروس Object Oriented Programming