Componente del personaggio di gioco
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 69 di 70.
Sfida
FacileCostruiamo 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'interfacciaIComponentnello spazio dei nomiGame.Components. Ogni componente deve avere un metodoUpdate()che stampa ciò che il componente sta facendo.HealthComponent.cs: crea una classeHealthComponentche implementaIComponent. Dovrebbe tenere traccia dei punti salute attuali e massimi, con i metodiTakeDamage(int amount)eHeal(int amount). La salute non deve mai scendere sotto 0 né superare il massimo. Includi unevent Action<int> HealthChangedche viene attivato ogni volta che la salute cambia, passando il nuovo valore della salute. Il metodoUpdate()dovrebbe stampare lo stato attuale della salute.InventoryComponent.cs: crea una classeInventoryComponentche implementaIComponent. Gestisce un elenco di nomi di oggetti con i metodiAddItem(string item)eRemoveItem(string item)(restituisceboolper indicare se l'operazione è riuscita). Il metodoUpdate()dovrebbe stampare il contenuto dell'inventario.Character.cs: crea una classeCharacternello spazio dei nomiGameche contiene una raccolta di componenti. Il personaggio deve avere una proprietàNamee i seguenti metodi:AddComponent(IComponent component)- collega un componente al personaggioGetComponent<T>()where T : IComponent - restituisce il primo componente di tipo T, oppure null se non viene trovatoUpdateAll()- chiamaUpdate()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}
updateFormati 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}oppureItem not found: {itemName} Update()di HealthComponent:Health: {current}/{max}Update()di InventoryComponent:Inventory: {item1}, {item2}, ...oppureInventory: 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
updateL'output dovrebbe essere:
Added: Sword
Added: Shield
Health changed: 70
Health changed: 80
Item not found: Potion
Removed: Sword
Health: 80/100
Inventory: ShieldNota 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
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy13Sfide finali
Piattaforma di e-learningComponente del personaggio di giocoServizio di noleggio veicoli2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online