Sistema di personaggi di gioco
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 109 di 110.
Sfida
FacileCostruiamo 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 astrattaCharacterche costituisce la base per tutti i tipi di personaggio. Ogni personaggio ha unname(String), un_health(int) privato,attackPower(int) edefense(int). Includi un getter per la salute e i seguenti metodi:takeDamage(int damage)- riduce la salute didamage - defense(si subisce almeno 1 danno e la salute non può scendere sotto 0). Stampaname takes X damage! Health: Ybool 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
toString()in modo che restituiscaname [Class] - HP: health, ATK: attackPower, DEF: defense, dove Class proviene daruntimeType.abilities.dart: crea due mixin che forniscono abilità speciali:CanHeal- fornisce un metodoheal(int amount). Poiché i mixin non possono accedere direttamente ai campi privati, questo mixin deve definire un metodo astrattovoid restoreHealth(int amount), che la classe del personaggio implementa. Il metodoheal()chiamarestoreHealth(amount)e stampaname heals for amount HP!CanCastSpells- fornisceint mana(il valore predefinito è 100) e un metodocastSpell(String spellName, int manaCost)che riduce il mana se sufficiente, stampaname casts spellName!e restituisce true. Se il mana non è sufficiente, stampaNot enough mana!e restituisce false.
warrior.dart: crea una classeWarriorche estendeCharacter. I guerrieri sono combattenti resistenti con una difesa elevata. Inizializzala con 150 punti salute, 20 punti di attacco e 15 punti di difesa. Implementaattack()in modo che restituiscaname swings a mighty sword!mage.dart: crea una classeMageche estendeCharactere usa i mixinCanCastSpellseCanHeal. I maghi sono fragili ma potenti. Inizializzala con 80 punti salute, 35 punti di attacco e 5 punti di difesa. Implementaattack()in modo che restituiscaname hurls a fireball!. ImplementarestoreHealth(int amount)per aumentare la salute (fino a un massimo di 80).archer.dart: crea una classeArcherche estendeCharacter. Gli arcieri sono combattenti equilibrati. Inizializzala con 100 punti salute, 25 punti di attacco e 10 punti di difesa. Implementaattack()in modo che restituiscaname fires a precise arrow!main.dart: mostra il funzionamento del sistema creando un personaggio per ciascun tipo: un Warrior chiamatoThorin, un Mage chiamatoGandalfe un Archer chiamatoLegolas. Stampa ciascun personaggio usandotoString(). Poi simula una sequenza di battaglia:- Stampa il messaggio di attacco di Thorin
- Gandalf subisce 30 danni
- Gandalf lancia
Healing Light(costa 25 punti mana) - Gandalf si cura di 20 punti salute
- Stampa il messaggio di attacco di Gandalf
- Thorin subisce 40 danni
- Stampa il messaggio di attacco di Legolas
- 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: trueProvalo 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
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy17Sfide finali
Piattaforma di e-learningSistema bancarioSistema di personaggi di giocoServizio di noleggio veicoli3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online