Menu
Coddy logo textTech

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

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 69 מתוך 70.

challenge icon

אתגר

קל

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

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

  • 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 על הדמות
        }
    }
}

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

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