רכיב דמות במשחק
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 69 מתוך 70.
אתגר
קלבואו נבנה מערכת לדמויות משחק באמצעות תבנית ארכיטקטורה מבוססת רכיבים! במקום ליצור היררכיות ירושה קשיחות, תרכיבו דמויות על ידי צירוף רכיבים עצמאיים שמטפלים בהתנהגויות מסוימות — גישה גמישה שנפוצה בפיתוח משחקים.
תארגנו את הקוד שלכם בחמישה קבצים:
IComponent.cs: הגדירו ממשקIComponentבמרחב השמותGame.Components. לכל רכיב חייבת להיות מתודתUpdate()שמדפיסה מה הרכיב עושה.HealthComponent.cs: צרו מחלקהHealthComponentשמממשת אתIComponent. עליה לעקוב אחר נקודות הבריאות הנוכחיות והמקסימליות, עם מתודותTakeDamage(int amount)ו-Heal(int amount). הבריאות לעולם לא תרד מתחת ל-0 או תעלה מעל המקסימום. הוסיפוevent Action<int> HealthChangedשיופעל בכל פעם שהבריאות משתנה, ויעביר את ערך הבריאות החדש. המתודהUpdate()צריכה להדפיס את מצב הבריאות הנוכחי.InventoryComponent.cs: צרו מחלקהInventoryComponentשמממשת אתIComponent. היא מנהלת רשימה של שמות פריטים, באמצעות המתודותAddItem(string item)ו-RemoveItem(string item)(מחזירהboolשמציין אם הפעולה הצליחה). המתודהUpdate()צריכה להדפיס את תכולת המלאי.Character.cs: צרו מחלקהCharacterבמרחב השמותGame, שמחזיקה אוסף של רכיבים. הדמות צריכה לכלול מאפייןNameואת המתודות הבאות:AddComponent(IComponent component)- מצרפת רכיב לדמותGetComponent<T>()כאשר T : IComponent - מחזירה את הרכיב הראשון מסוג T, או null אם לא נמצאUpdateAll()- קוראת למתודהUpdate()בכל אחד מהרכיבים המצורפים
Program.cs: חברו את הכול יחד על ידי יצירת דמות, צירוף רכיבים ועיבוד פקודות.
תקבלו את הקלטים הבאים:
- שם הדמות
- הבריאות המרבית ההתחלתית של HealthComponent
- מספר הפקודות לעיבוד
- עבור כל פקודה: הפעולה ולאחריה הנתונים הרלוונטיים
תבניות הפקודות:
damage
{amount}
heal
{amount}
add_item
{itemName}
remove_item
{itemName}
updateתבניות הפלט:
- כשהבריאות משתנה (באמצעות אירוע):
Health changed: {newHealth} - בעת הוספת פריט:
Added: {itemName} - בעת הסרת פריט:
Removed: {itemName}אוItem not found: {itemName} - המתודה
Update()של HealthComponent:Health: {current}/{max} - המתודה
Update()של InventoryComponent:Inventory: {item1}, {item2}, ...אוInventory: empty
לדוגמה, אם הקלטים הם:
Hero
100
7
add_item
Sword
add_item
Shield
damage
30
heal
10
remove_item
Potion
remove_item
Sword
updateהפלט צריך להיות:
Added: Sword
Added: Shield
Health changed: 70
Health changed: 80
Item not found: Potion
Removed: Sword
Health: 80/100
Inventory: Shieldשימו לב שהדמות לא יורשת משום מחלקה מיוחדת — היא פשוט מחזיקה רכיבים שמספקים התנהגות. המתודה GetComponent<T>() משתמשת בגנריקה כדי לאחזר רכיבים בבטיחות טיפוסים, ואירועים מודיעים כשהבריאות משתנה. גישת ההרכבה הזאת מאפשרת לכם לשלב רכיבים באופן חופשי!
נסו בעצמכם
using System;
using Game;
using Game.Components;
class Program
{
public static void Main(string[] args)
{
// קרא את שם הדמות
string characterName = Console.ReadLine();
// קרא את ערך הבריאות המרבי ההתחלתי
int maxHealth = Convert.ToInt32(Console.ReadLine());
// קרא את מספר הפקודות
int numCommands = Convert.ToInt32(Console.ReadLine());
// TODO: צור Character עם השם הנתון
// TODO: צור HealthComponent עם maxHealth ו-InventoryComponent
// TODO: הירשם לאירוע HealthChanged כדי להדפיס: Health changed: {newHealth}
// TODO: הוסף את שני הרכיבים לדמות
// TODO: עבד כל פקודה
for (int i = 0; i < numCommands; i++)
{
string command = Console.ReadLine();
// TODO: טפל בכל סוג של פקודה:
// - "damage": קרא את הכמות, קרא ל-TakeDamage ברכיב הבריאות
// - "heal": קרא את הכמות, קרא ל-Heal ברכיב הבריאות
// - "add_item": קרא את שם הפריט, קרא ל-AddItem ברכיב המלאי
// - "remove_item": קרא את שם הפריט, קרא ל-RemoveItem ברכיב המלאי
// - "update": קרא ל-UpdateAll על הדמות
}
}
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויותתרגלו בעצמכם: קומפיילר C# אונליין