Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 abstraite Character qui sert de base à tous les types de personnages. Chaque personnage possède un name (String), une _health (int) privée, un attackPower (int) et une defense (int). Ajoute un getter pour la santé ainsi que les méthodes suivantes :
    • takeDamage(int damage) - réduit la santé de damage - defense (au moins 1 point de dégâts est subi, et la santé ne peut pas descendre en dessous de 0). Affiche name takes X damage! Health: Y
    • bool 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
    Surcharge toString() pour renvoyer name [Class] - HP: health, ATK: attackPower, DEF: defense, où Class provient de runtimeType.
  • abilities.dart : crée deux mixins qui fournissent des capacités spéciales :
    • CanHeal - fournit une méthode heal(int amount). Comme les mixins ne peuvent pas accéder directement aux champs privés, ce mixin doit définir une méthode abstraite void restoreHealth(int amount) que la classe du personnage implémente. La méthode heal() appelle restoreHealth(amount) et affiche name heals for amount HP!
    • CanCastSpells - fournit int mana (avec une valeur par défaut de 100) ainsi qu’une méthode castSpell(String spellName, int manaCost) qui réduit le mana s’il est suffisant, affiche name casts spellName! et renvoie true. Si le mana est insuffisant, elle affiche Not enough mana! et renvoie false.
  • warrior.dart : crée une classe Warrior qui étend Character. 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émente attack() pour renvoyer name swings a mighty sword!
  • mage.dart : crée une classe Mage qui étend Character et utilise les mixins CanCastSpells et CanHeal. 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émente attack() pour renvoyer name hurls a fireball!. Implémente restoreHealth(int amount) pour augmenter la santé (avec un maximum de 80).
  • archer.dart : crée une classe Archer qui étend Character. 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émente attack() pour renvoyer name 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é Gandalf et un Archer nommé Legolas. Affiche chaque personnage à l’aide de toString(). Simule ensuite une séquence de combat :
    1. Affiche le message d’attaque de Thorin
    2. Gandalf subit 30 points de dégâts
    3. Gandalf lance Healing Light (coûte 25 points de mana)
    4. Gandalf récupère 20 points de santé
    5. Affiche le message d’attaque de Gandalf
    6. Thorin subit 40 points de dégâts
    7. Affiche le message d’attaque de Legolas
    8. 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: true

Essayez 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

Entraînez-vous par vous-même : Compilateur Dart en ligne