Menu
Coddy logo textTech

Componente del personaggio di gioco

Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 69 di 70.

challenge icon

Sfida

Facile

Costruiamo un sistema di personaggi di gioco usando il modello architetturale basato sui componenti! Invece di creare gerarchie di ereditarietà rigide, comporrai i personaggi collegando componenti indipendenti che gestiscono comportamenti specifici: un approccio flessibile ampiamente usato nello sviluppo di videogiochi.

Organizzerai il codice in cinque file:

  • IComponent.cs: definisci un'interfaccia IComponent nello spazio dei nomi Game.Components. Ogni componente deve avere un metodo Update() che stampa ciò che il componente sta facendo.
  • HealthComponent.cs: crea una classe HealthComponent che implementa IComponent. Dovrebbe tenere traccia dei punti salute attuali e massimi, con i metodi TakeDamage(int amount) e Heal(int amount). La salute non deve mai scendere sotto 0 né superare il massimo. Includi un event Action<int> HealthChanged che viene attivato ogni volta che la salute cambia, passando il nuovo valore della salute. Il metodo Update() dovrebbe stampare lo stato attuale della salute.
  • InventoryComponent.cs: crea una classe InventoryComponent che implementa IComponent. Gestisce un elenco di nomi di oggetti con i metodi AddItem(string item) e RemoveItem(string item) (restituisce bool per indicare se l'operazione è riuscita). Il metodo Update() dovrebbe stampare il contenuto dell'inventario.
  • Character.cs: crea una classe Character nello spazio dei nomi Game che contiene una raccolta di componenti. Il personaggio deve avere una proprietà Name e i seguenti metodi:
    • AddComponent(IComponent component) - collega un componente al personaggio
    • GetComponent<T>() where T : IComponent - restituisce il primo componente di tipo T, oppure null se non viene trovato
    • UpdateAll() - chiama Update() su ogni componente collegato
  • Program.cs: metti tutto insieme creando un personaggio, collegando i componenti ed elaborando i comandi.

Riceverai i seguenti input:

  • Nome del personaggio
  • Salute massima iniziale per HealthComponent
  • Numero di comandi da elaborare
  • Per ogni comando: l'azione seguita dai dati pertinenti

Formati dei comandi:

damage
{amount}

heal
{amount}

add_item
{itemName}

remove_item
{itemName}

update

Formati dell'output:

  • Quando la salute cambia (tramite evento): Health changed: {newHealth}
  • Quando si aggiunge un oggetto: Added: {itemName}
  • Quando si rimuove un oggetto: Removed: {itemName} oppure Item not found: {itemName}
  • Update() di HealthComponent: Health: {current}/{max}
  • Update() di InventoryComponent: Inventory: {item1}, {item2}, ... oppure Inventory: empty

Per esempio, se gli input sono:

Hero
100
7
add_item
Sword
add_item
Shield
damage
30
heal
10
remove_item
Potion
remove_item
Sword
update

L'output dovrebbe essere:

Added: Sword
Added: Shield
Health changed: 70
Health changed: 80
Item not found: Potion
Removed: Sword
Health: 80/100
Inventory: Shield

Nota che il personaggio non eredita da nulla di speciale: contiene semplicemente componenti che forniscono comportamenti. Il metodo GetComponent<T>() usa i generics per recuperare componenti in modo sicuro rispetto ai tipi, e gli eventi notificano quando la salute cambia. Questo approccio basato sulla composizione ti permette di combinare liberamente i componenti!

Provalo tu

using System;
using Game;
using Game.Components;

class Program
{
    public static void Main(string[] args)
    {
        // Leggi il nome del personaggio
        string characterName = Console.ReadLine();
        
        // Leggi la salute massima iniziale
        int maxHealth = Convert.ToInt32(Console.ReadLine());
        
        // Leggi il numero di comandi
        int numCommands = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Crea un Character con il nome specificato
        
        // TODO: Crea HealthComponent con maxHealth e InventoryComponent
        
        // TODO: Sottoscrivi l'evento HealthChanged per stampare: Health changed: {newHealth}
        
        // TODO: Aggiungi entrambi i componenti al personaggio
        
        // TODO: Elabora ogni comando
        for (int i = 0; i < numCommands; i++)
        {
            string command = Console.ReadLine();
            
            // TODO: Gestisci ogni tipo di comando:
            // - "damage": leggi la quantità, chiama TakeDamage sul componente della salute
            // - "heal": leggi la quantità, chiama Heal sul componente della salute
            // - "add_item": leggi il nome dell'oggetto, chiama AddItem sul componente dell'inventario
            // - "remove_item": leggi il nome dell'oggetto, chiama RemoveItem sul componente dell'inventario
            // - "update": chiama UpdateAll sul personaggio
        }
    }
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C# online