מערכת דמויות במשחק
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Dart של Coddy. שיעור 109 מתוך 110.
אתגר
קלבואו נבנה מערכת דמויות למשחק שמשלבת את כל מושגי התכנות מונחה העצמים (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: Ybool 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ומשתמשת ב־mixinsCanCastSpellsו־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(). לאחר מכן הדמה רצף קרב:- הדפס את הודעת ההתקפה של Thorin
- Gandalf חוטף 30 נזק
- Gandalf מטיל את הלחש
Healing Light(עולה 25 mana) - Gandalf מרפא 20 HP
- הדפס את הודעת ההתקפה של Gandalf
- Thorin חוטף 40 נזק
- הדפס את הודעת ההתקפה של Legolas
- הדפס אם כל דמות בחיים, בפורמט:
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"
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםספריות וייבואמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותמשתני מופעיסודות הבנאיחזרה: מחשבון פשוט4בטיחות מפני ערכי null
מבוא לבטיחות מפני ערכי nullניתן להקצאה ל-null לעומת לא ניתן להקצאה ל-nullהאופרטורים ? ו-!מילת המפתח Late ובטיחות מפני ערכי nullאופרטורים מודעי nullבטיחות מפני ערכי null במחלקותסיכום – מערכת פרופילי משתמשים7מחלקות מופשטות וממשקים
מחלקות מופשטותמתודות מופשטותממשקים ב-Dartממשקים משתמעיםמימוש לעומת הורשהממשקים מרוביםחזרה – מחשבון צורות10אוספים וגנריות
סקירה כללית של List, Set ו-Mapאוספים בטוחים מבחינת טיפוסיםמחלקות גנריותמתודות גנריותאילוצים גנרייםIterable ו-Iteratorסיכום – אחסון גנרי13מושגי OOP מתקדמים
הרכבה לעומת הורשהמתודות הרחבהמחלקות קריאותמחלקות אטומות (Dart 3)רשומות (Dart 3)תבניות והתאמה (3.0)טיפוסים מונים עם מתודות16פרויקט: ניהול ספרייה
סקירת הפרויקטמחלקות ספר ומשתמש2בנאים ב-Dart
בנאי ברירת מחדלבנאים בעלי שםרשימות אתחולבנאים קבועיםבנאי Factoryבנאים מפניםסיכום - בונה צורות5כימוס
חברים ציבוריים לעומת פרטייםמוסכמת הקידומת _פרטיות ברמת הספרייההעמקה ב-getters וב-settersהסתרת מידעסיכום – רשומות תלמידים8מיקסינים
מבוא למיקסיניםיצירת מיקסיניםשימוש במספר מיקסיניםמילת המפתח on במיקסיניםמיקסינים לעומת ירושהמיקסינים לעומת ממשקסיכום – מערכת בעלי החיים3מאפייני מחלקה
איברי מופע לעומת איברים סטטייםשדות final ו-constמשתני lateמתודות ושדות סטטייםGetters ו-Settersסיכום – מנהל חשבונות בנק6ירושה
ירושה בסיסיתמילת המפתח superדריסת מתודותהאנוטציה @overrideמילת המפתח final למחלקהבנאים וירושהסיכום – היררכיית עובדים9פולימורפיזם
יסודות הפולימורפיזםפולימורפיזם באמצעות ממשקיםבדיקת טיפוסים בזמן ריצההאופרטורים is ו-asמילת המפתח קווריאנטיסיכום — מעבד תשלומים12תכנות מונחה עצמים אסינכרוני
Future-ים ו-async/awaitיסודות ה-Streamsבקרי Streamsבנאים אסינכרונייםאסינכרוניות במתודות של מחלקהסיכום - אחזור נתוניםתרגלו בעצמכם: קומפיילר Dart אונליין