Système de personnages de jeu
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 109 sur 110.
Défi
FacileConstruisons un système de personnages de jeu qui rassemble tous les concepts de POO que tu as maîtrisés ! Tu vas créer différentes classes de personnages avec des capacités, des statistiques et des mécaniques de combat uniques — en modélisant la façon dont les personnages pourraient fonctionner dans un véritable jeu.
Ton système sera organisé sur six fichiers :
character.dart: crée une classe abstraiteCharacterqui sert de base à tous les types de personnages. Chaque personnage possède unname(String), une_health(int) privée, unattackPower(int) et unedefense(int). Ajoute un getter pour la santé ainsi que les méthodes suivantes :takeDamage(int damage)- réduit la santé dedamage - defense(au moins 1 point de dégâts est subi, et la santé ne peut pas descendre en dessous de 0). Affichename takes X damage! Health: Ybool isAlive()- renvoie true si la santé est supérieure à 0- Une méthode abstraite
String attack()que les sous-classes implémentent pour définir leur style d’attaque unique
toString()pour renvoyername [Class] - HP: health, ATK: attackPower, DEF: defense, où Class provient deruntimeType.abilities.dart: crée deux mixins qui fournissent des capacités spéciales :CanHeal- fournit une méthodeheal(int amount). Comme les mixins ne peuvent pas accéder directement aux champs privés, ce mixin doit définir une méthode abstraitevoid restoreHealth(int amount)que la classe du personnage implémente. La méthodeheal()appellerestoreHealth(amount)et affichename heals for amount HP!CanCastSpells- fournitint mana(avec une valeur par défaut de 100) ainsi qu’une méthodecastSpell(String spellName, int manaCost)qui réduit le mana s’il est suffisant, affichename casts spellName!et renvoie true. Si le mana est insuffisant, elle afficheNot enough mana!et renvoie false.
warrior.dart: crée une classeWarriorqui étendCharacter. Les guerriers sont des tanks avec une défense élevée. Initialise-la avec 150 points de santé, 20 points de puissance d’attaque et 15 points de défense. Implémenteattack()pour renvoyername swings a mighty sword!mage.dart: crée une classeMagequi étendCharacteret utilise les mixinsCanCastSpellsetCanHeal. Les mages sont fragiles, mais puissants. Initialise-la avec 80 points de santé, 35 points de puissance d’attaque et 5 points de défense. Implémenteattack()pour renvoyername hurls a fireball!. ImplémenterestoreHealth(int amount)pour augmenter la santé (avec un maximum de 80).archer.dart: crée une classeArcherqui étendCharacter. Les archers sont des combattants équilibrés. Initialise-la avec 100 points de santé, 25 points de puissance d’attaque et 10 points de défense. Implémenteattack()pour renvoyername fires a precise arrow!main.dart: montre le fonctionnement de ton système de personnages en créant un personnage de chaque type : un Warrior nomméThorin, un Mage nomméGandalfet un Archer nomméLegolas. Affiche chaque personnage à l’aide detoString(). Simule ensuite une séquence de combat :- Affiche le message d’attaque de Thorin
- Gandalf subit 30 points de dégâts
- Gandalf lance
Healing Light(coûte 25 points de mana) - Gandalf récupère 20 points de santé
- Affiche le message d’attaque de Gandalf
- Thorin subit 40 points de dégâts
- Affiche le message d’attaque de Legolas
- Affiche si chaque personnage est vivant au format suivant :
name alive: true/false
Résultat attendu :
Thorin [Warrior] - HP: 150, ATK: 20, DEF: 15
Gandalf [Mage] - HP: 80, ATK: 35, DEF: 5
Legolas [Archer] - HP: 100, ATK: 25, DEF: 10
Thorin swings a mighty sword!
Gandalf takes 25 damage! Health: 55
Gandalf casts Healing Light!
Gandalf heals for 20 HP!
Gandalf hurls a fireball!
Thorin takes 25 damage! Health: 125
Legolas fires a precise arrow!
Thorin alive: true
Gandalf alive: true
Legolas alive: trueEssayez vous-même
import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';
void main() {
// TODO: Créer un Warrior nommé "Thorin"
// TODO: Créer un Mage nommé "Gandalf"
// TODO: Créer un Archer nommé "Legolas"
// TODO: Afficher chaque personnage en utilisant toString()
// TODO: Simuler la séquence de combat :
// 1. Afficher le message d'attaque de Thorin
// 2. Gandalf subit 30 points de dégâts
// 3. Gandalf lance "Healing Light" (coûte 25 mana)
// 4. Gandalf se soigne de 20 HP
// 5. Afficher le message d'attaque de Gandalf
// 6. Thorin subit 40 points de dégâts
// 7. Afficher le message d'attaque de Legolas
// 8. Afficher si chaque personnage est en vie : "name alive: true/false"
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy17Défis finaux
Plateforme d’apprentissage en ligneSystème bancaireSystème de personnages de jeuService de location de véhicules3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne