Menu
Coddy logo textTech

מערכת דמויות במשחק

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 109 מתוך 110.

challenge icon

אתגר

קל

בואו נבנה מערכת דמויות למשחק שמשלבת את כל מושגי התכנות מונחה העצמים (OOP) שלמדת! תיצור מחלקות שונות של דמויות עם יכולות ייחודיות, נתונים סטטיסטיים ומכניקות קרב — ונדגים איך דמויות עשויות לפעול במשחק אמיתי.

המערכת שלך תהיה מאורגנת בשישה קבצים:

  • character.dart: צור מחלקה מופשטת Character שתשמש בסיס לכל סוגי הדמויות. לכל דמות יש name (String), ‏_health פרטי (int), ‏attackPower (int) ו־defense (int). הוסף getter עבור health ואת המתודות הבאות:
    • takeDamage(int damage) - מפחיתה את ה־health ב־damage - defense (נגרם נזק של 1 לפחות, וה־health לא יכול לרדת מתחת ל־0). מדפיסה name takes X damage! Health: Y
    • bool isAlive() - מחזירה true אם ה־health גדול מ־0
    • מתודה מופשטת String attack() שמחלקות הבת מממשות עבור סגנון ההתקפה הייחודי שלהן
    דרוס את 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) שמפחיתה mana אם יש מספיק, מדפיסה name casts spellName! ומחזירה true. אם אין מספיק mana, היא מדפיסה Not enough mana! ומחזירה false.
  • warrior.dart: צור מחלקה Warrior שמרחיבה את Character. לוחמים הם טנקים עם defense גבוה. אתחל עם 150 health, ‏20 attack power ו־15 defense. ממש את attack() כך שתחזיר name swings a mighty sword!
  • mage.dart: צור מחלקה Mage שמרחיבה את Character ומשתמשת ב־mixins‏ CanCastSpells ו־CanHeal. קוסמים חלשים אך רבי עוצמה. אתחל עם 80 health, ‏35 attack power ו־5 defense. ממש את attack() כך שתחזיר name hurls a fireball!. ממש את restoreHealth(int amount) כדי להגדיל את ה־health (עד למקסימום של 80).
  • archer.dart: צור מחלקה Archer שמרחיבה את Character. קשתים הם לוחמים מאוזנים. אתחל עם 100 health, ‏25 attack power ו־10 defense. ממש את attack() כך שתחזיר name fires a precise arrow!
  • main.dart: הדגם את מערכת הדמויות שלך באמצעות יצירה של דמות אחת מכל סוג: Warrior בשם Thorin, ‏Mage בשם Gandalf ו־Archer בשם Legolas. הדפס כל דמות באמצעות toString(). לאחר מכן הדמה רצף קרב:
    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

פלט צפוי:

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 מאנה)
  // 4. Gandalf מרפא 20 HP
  // 5. הדפיסו את הודעת ההתקפה של Gandalf
  // 6. Thorin סופג 40 נזק
  // 7. הדפיסו את הודעת ההתקפה של Legolas
  // 8. הדפס האם כל דמות בחיים: "name alive: true/false"
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Dart אונליין