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 à l’aide du modèle d’architecture basé sur les composants ! Au lieu de créer des hiérarchies d’héritage rigides, vous composerez les personnages en leur associant 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 dans cinq fichiers :
IComponent.cs: définissez une interfaceIComponentdans l’espace de nomsGame.Components. Chaque composant doit disposer d’une méthodeUpdate()qui affiche ce que fait le composant.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). Les points de vie ne doivent jamais être inférieurs à 0 ni supérieurs au maximum. Incluez unevent Action<int> HealthChangedqui se déclenche chaque fois que les points de vie changent, en transmettant la nouvelle valeur des points de vie. La méthodeUpdate()doit afficher l’état actuel des points de vie.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)(qui renvoieboolpour indiquer si l’opération a réussi). 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 doit posséder une propriétéNameainsi que les méthodes suivantes :AddComponent(IComponent component)— associe 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 associé
Program.cs: rassemblez tous les éléments en créant un personnage, en lui associant des composants et en traitant les commandes.
Vous recevrez les entrées suivantes :
- Le nom du personnage
- Le nombre maximal initial de points de vie pour le HealthComponent
- Le 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 les points de vie changent (via l’événement) :
Health changed: {newHealth} - Lors de l’ajout d’un objet :
Added: {itemName} - Lors du retrait d’un objet :
Removed: {itemName}ouItem not found: {itemName} Update()de HealthComponent :Health: {current}/{max}Update()de 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 que le personnage n’hérite de rien de particulier : il contient simplement des composants qui fournissent des comportements. La méthode GetComponent<T>() utilise les génériques pour une récupération sécurisée du type, et les événements signalent les changements de points de vie. Cette approche par composition vous permet de combiner 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 UtilisateurLogique du système d'empruntLINQ pour la rechercheInterface Console / Interface d'administrationTests unitaires (NUnit/xUnit)Entraînez-vous par vous-même : Compilateur C# en ligne