Composant de personnage de jeu
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 69 sur 70.
Défi
FacileConstruisons un système de personnages de jeu en utilisant le modèle d'architecture basé sur les composants ! Au lieu de créer des hiérarchies d'héritage rigides, vous composerez des personnages en attachant des composants indépendants qui gèrent des comportements spécifiques - une approche flexible largement utilisée dans le développement de jeux.
Vous organiserez votre code sur cinq fichiers :
IComponent.cs: Définissez une interfaceIComponentdans l'espace de nomsGame.Components. Chaque composant doit avoir une méthodeUpdate()qui affiche ce que le composant est en train de faire.HealthComponent.cs: Créez une classeHealthComponentqui implémenteIComponent. Elle doit suivre les points de vie actuels et maximum, avec des méthodesTakeDamage(int amount)etHeal(int amount). La santé ne doit jamais descendre en dessous de 0 ou dépasser le maximum. Incluez unevent Action<int> HealthChangedqui se déclenche chaque fois que la santé change, en passant la nouvelle valeur de santé. La méthodeUpdate()doit afficher l'état de santé actuel.InventoryComponent.cs: Créez une classeInventoryComponentqui implémenteIComponent. Elle gère une liste de noms d'objets avec les méthodesAddItem(string item)etRemoveItem(string item)(renvoie unboolindiquant le succès). La méthodeUpdate()doit afficher le contenu de l'inventaire.Character.cs: Créez une classeCharacterdans l'espace de nomsGamequi contient une collection de composants. Votre personnage a besoin d'une propriétéNameet de ces méthodes :AddComponent(IComponent component)- attache un composant au personnageGetComponent<T>()où T : IComponent - renvoie le premier composant de type T, ou null s'il n'est pas trouvéUpdateAll()- appelleUpdate()sur chaque composant attaché
Program.cs: Rassemblez le tout en créant un personnage, en attachant des composants et en traitant des commandes.
Vous recevrez les entrées suivantes :
- Nom du personnage
- Santé maximale initiale pour le HealthComponent
- Nombre de commandes à traiter
- Pour chaque commande : l'action suivie des données pertinentes
Formats des commandes :
damage
{amount}
heal
{amount}
add_item
{itemName}
remove_item
{itemName}
updateFormats de sortie :
- Lorsque la santé change (via l'événement) :
Health changed: {newHealth} - Lors de l'ajout d'un objet :
Added: {itemName} - Lors de la suppression d'un objet :
Removed: {itemName}ouItem not found: {itemName} Update()du HealthComponent :Health: {current}/{max}Update()de l'InventoryComponent :Inventory: {item1}, {item2}, ...ouInventory: empty
Par exemple, si les entrées sont :
Hero
100
7
add_item
Sword
add_item
Shield
damage
30
heal
10
remove_item
Potion
remove_item
Sword
updateLa sortie devrait être :
Added: Sword
Added: Shield
Health changed: 70
Health changed: 80
Item not found: Potion
Removed: Sword
Health: 80/100
Inventory: ShieldRemarquez comment le personnage n'hérite de rien de spécial - il contient simplement des composants qui fournissent un comportement. La méthode GetComponent<T>() utilise les génériques pour une récupération de type sécurisé, et les événements notifient lorsque la santé change. Cette approche par composition vous permet de mélanger et d'associer librement les composants !
Essayez vous-même
using System;
using Game;
using Game.Components;
class Program
{
public static void Main(string[] args)
{
// Lire le nom du personnage
string characterName = Console.ReadLine();
// Lire la santé maximale initiale
int maxHealth = Convert.ToInt32(Console.ReadLine());
// Lire le nombre de commandes
int numCommands = Convert.ToInt32(Console.ReadLine());
// TODO: Créer un Character avec le nom donné
// TODO: Créer HealthComponent avec maxHealth et InventoryComponent
// TODO: S'abonner à l'événement HealthChanged pour afficher : Health changed: {newHealth}
// TODO: Ajouter les deux composants au personnage
// TODO: Traiter chaque commande
for (int i = 0; i < numCommands; i++)
{
string command = Console.ReadLine();
// TODO: Gérer chaque type de commande :
// - "damage": lire le montant, appeler TakeDamage sur le composant de santé
// - "heal": lire le montant, appeler Heal sur le composant de santé
// - "add_item": lire le nom de l'objet, appeler AddItem sur le composant d'inventaire
// - "remove_item": lire le nom de l'objet, appeler RemoveItem sur le composant d'inventaire
// - "update": appeler UpdateAll sur le personnage
}
}
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur