Menu
Coddy logo textTech

Sistema di personaggi di gioco

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 109 di 110.

challenge icon

Sfida

Facile

Costruiamo un sistema di personaggi per un gioco che riunisca tutti i concetti OOP che hai imparato! Creerai diverse classi di personaggi con abilità, statistiche e meccaniche di combattimento uniche, modellando il funzionamento dei personaggi in un vero gioco.

Il tuo sistema sarà organizzato in sei file:

  • character.dart: crea una classe astratta Character che costituisce la base per tutti i tipi di personaggio. Ogni personaggio ha un name (String), un _health (int) privato, attackPower (int) e defense (int). Includi un getter per la salute e i seguenti metodi:
    • takeDamage(int damage) - riduce la salute di damage - defense (si subisce almeno 1 danno e la salute non può scendere sotto 0). Stampa name takes X damage! Health: Y
    • bool isAlive() - restituisce true se la salute è maggiore di 0
    • Un metodo astratto String attack() che le sottoclassi implementano per definire il proprio stile di attacco
    Sovrascrivi toString() in modo che restituisca name [Class] - HP: health, ATK: attackPower, DEF: defense, dove Class proviene da runtimeType.
  • abilities.dart: crea due mixin che forniscono abilità speciali:
    • CanHeal - fornisce un metodo heal(int amount). Poiché i mixin non possono accedere direttamente ai campi privati, questo mixin deve definire un metodo astratto void restoreHealth(int amount), che la classe del personaggio implementa. Il metodo heal() chiama restoreHealth(amount) e stampa name heals for amount HP!
    • CanCastSpells - fornisce int mana (il valore predefinito è 100) e un metodo castSpell(String spellName, int manaCost) che riduce il mana se sufficiente, stampa name casts spellName! e restituisce true. Se il mana non è sufficiente, stampa Not enough mana! e restituisce false.
  • warrior.dart: crea una classe Warrior che estende Character. I guerrieri sono combattenti resistenti con una difesa elevata. Inizializzala con 150 punti salute, 20 punti di attacco e 15 punti di difesa. Implementa attack() in modo che restituisca name swings a mighty sword!
  • mage.dart: crea una classe Mage che estende Character e usa i mixin CanCastSpells e CanHeal. I maghi sono fragili ma potenti. Inizializzala con 80 punti salute, 35 punti di attacco e 5 punti di difesa. Implementa attack() in modo che restituisca name hurls a fireball!. Implementa restoreHealth(int amount) per aumentare la salute (fino a un massimo di 80).
  • archer.dart: crea una classe Archer che estende Character. Gli arcieri sono combattenti equilibrati. Inizializzala con 100 punti salute, 25 punti di attacco e 10 punti di difesa. Implementa attack() in modo che restituisca name fires a precise arrow!
  • main.dart: mostra il funzionamento del sistema creando un personaggio per ciascun tipo: un Warrior chiamato Thorin, un Mage chiamato Gandalf e un Archer chiamato Legolas. Stampa ciascun personaggio usando toString(). Poi simula una sequenza di battaglia:
    1. Stampa il messaggio di attacco di Thorin
    2. Gandalf subisce 30 danni
    3. Gandalf lancia Healing Light (costa 25 punti mana)
    4. Gandalf si cura di 20 punti salute
    5. Stampa il messaggio di attacco di Gandalf
    6. Thorin subisce 40 danni
    7. Stampa il messaggio di attacco di Legolas
    8. Stampa se ciascun personaggio è vivo, nel formato: name alive: true/false

Risultato previsto:

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

Provalo tu

import 'warrior.dart';
import 'mage.dart';
import 'archer.dart';

void main() {
  // TODO: Crea un Warrior di nome "Thorin"

  // TODO: Crea un Mage di nome "Gandalf"

  // TODO: Crea un Archer di nome "Legolas"

  // TODO: Stampa ogni personaggio usando toString()

  // TODO: Simula la sequenza di combattimento:
  // 1. Stampa il messaggio di attacco di Thorin
  // 2. Gandalf subisce 30 danni
  // 3. Gandalf lancia "Healing Light" (costa 25 mana)
  // 4. Gandalf recupera 20 HP
  // 5. Stampa il messaggio di attacco di Gandalf
  // 6. Thorin subisce 40 danni
  // 7. Stampa il messaggio di attacco di Legolas
  // 8. Stampa se ogni personaggio è vivo: "name alive: true/false"
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online