Sviluppo di un personaggio di gioco
Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 64 di 65.
Sfida
MedioCrea i personaggi di un gioco di ruolo: una classe astratta Character, tre classi che la estendono e le abilità che i personaggi imparano.
Character in character.gd è una classe @abstract:
- Proprietà:
character_name(dal costruttore),level1,max_healthehealth100.0,max_manaemana50,strength,intelligenceeagility10,defense5eabilities, unArray[Ability]. I valori della salute sonofloat, le altre statistiche sonoint. - Un segnale
defeated(character_name: String). - Metodi astratti
class_title() -> Stringeattack_power() -> float. level_up() -> String: livello+1, salute massima+10, mana massimo+5, forza, intelligenza, agilità e difesa+1; salute e mana vengono ripristinati al massimo. RestituisceNAME reached level N!.attack(target): stampaNAME attacks TARGET, poi restituiscetarget.take_damage(attack_power()).take_damage(amount) -> float: il danno èamount - defense * 0.5, ma almeno1.0; la salute diminuisce di questa quantità e non scende mai sotto0.0. StampaNAME takes D damage (HP H)con un decimale per ciascun valore, emettedefeatedquando questo colpo porta la salute a0e restituisce il danno.is_alive(): la salute è maggiore di0.learn_ability(ability)aggiunge l'abilità aabilities.use_ability(index, target) -> float: se l'indice è al di fuori diabilities, stampaNAME has no ability INDEXe restituisce0.0; altrimenti restituisce il valore ritornato dause()dell'abilità._to_string():NAME the TITLE (level L): HP H/MAX, mana M/MAX, STR S, INT I, AGI A, DEF D, salute con un decimale.
Ogni sottoclasse chiama il costruttore della classe genitore, poi imposta i propri valori iniziali delle statistiche (le altre mantengono i valori della classe base), restituisce il nome della propria classe da class_title() e sovrascrive level_up() usando super():
Warrior: salute150.0, mana30, forza15, intelligenza5, difesa8; potenza d'attaccostrength * 1.2; quando sale di livello, ottiene anche forza+2e salute massima+10(la salute viene ripristinata).Mage: salute80.0, mana150, forza5, intelligenza20, difesa3; potenza d'attaccointelligence * 0.4; dopo un attacco normale recupera5mana (senza superare il massimo); quando sale di livello, ottiene anche intelligenza+2e mana massimo+15(il mana viene ripristinato).Rogue: salute100.0, mana60, forza12, intelligenza8, agilità18, difesa4; potenza d'attaccostrength * 0.5 + agility * 0.7; quando sale di livello, ottiene anche agilità+2.
Ability in ability.gd: il costruttore accetta ability_name, mana_cost (int) e damage (float). use(user, target) -> float stampa USER does not have enough mana for ABILITY e restituisce 0.0 quando il mana dell'utente è inferiore al costo. Altrimenti consuma il mana, stampa USER casts ABILITY on TARGET e restituisce target.take_damage(damage + user.intelligence * 0.5).
Il codice fornito si collega al segnale defeated di ogni personaggio e stampa NAME is defeated!. Per questo input:
hero warrior|Aragorn
hero rogue|Orc
attack Aragorn|Orc
attack Orc|Aragorn
level Aragorn
status Aragornl'output è:
Aragorn attacks Orc
Orc takes 16.0 damage (HP 84.0)
Orc attacks Aragorn
Aragorn takes 14.6 damage (HP 135.4)
Aragorn reached level 2!
Aragorn the Warrior (level 2): HP 170.0/170.0, mana 35/35, STR 18, INT 6, AGI 11, DEF 9Il tuo codice va inserito in character.gd, warrior.gd, mage.gd, rogue.gd e ability.gd. main.gd contiene il codice fornito per input/output e non può essere modificato.
Provalo tu
extends Node
func _ready():
# Codice di input/output fornito: lascialo così com'è
var heroes := {}
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"hero":
var hero: Character
match f[0]:
"warrior":
hero = Warrior.new(f[1])
"mage":
hero = Mage.new(f[1])
"rogue":
hero = Rogue.new(f[1])
hero.defeated.connect(func(who): print(who, " is defeated!"))
heroes[f[1]] = hero
"learn":
heroes[f[0]].learn_ability(Ability.new(f[1], int(f[2]), float(f[3])))
"attack":
heroes[f[0]].attack(heroes[f[1]])
"cast":
heroes[f[0]].use_ability(int(f[1]), heroes[f[2]])
"level":
print(heroes[f[0]].level_up())
"status":
print(heroes[f[0]])
line = OS.read_string_from_stdin()
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggetti a confrontoLa parola chiave selfMetodiProprietàCostruttore (_init)Riepilogo - Calcolatrice semplice4Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme7Segnali
Che cos'è un segnale?Dichiarare ed emettereCollegarsi ai segnaliSegnali con argomentiRipasso - Sistema della salute10Pattern di progettazione, parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern Composite2Proprietà delle classi
Variabili di istanza e staticheFunzioni staticheSetter delle proprietàGetter delle proprietàPrivato per convenzioneRiepilogo - Gestore di conti bancari5Incapsulamento
Membri pubblici e privatiValidazione con i setterNascondimento delle informazioniProprietà di sola letturaRiepilogo - Sistema di gestione dei dati degli studenti8Concetti avanzati di OOP
Composizione vs ereditarietàClassi interneNodi come componentiRefCounted vs NodeEnum nelle classi11Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiCatene di ereditarietàControlli di tipo con isRipasso - Gerarchia dei dipendenti6Metodi speciali
Introduzione ai metodi virtualiIl metodo _to_stringIteratori personalizzatiRiepilogo - Lista personalizzata9Modelli di progettazione, parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern ObserverPattern Strategy12Sfide finali
Piattaforma di e-learningSistema bancarioSviluppo di un personaggio di giocoServizio di noleggio veicoliEsercitati da solo: Compilatore GDScript online