Personaggio RPG
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 58 di 61.
Sfida
FacileCostruiamo un sistema di combattimento per un personaggio RPG: un classico esempio che combina struct, metodi, costruttori e interazione tra oggetti in una progettazione pulita e modulare.
Organizzerai il codice in tre file:
character.h: definisci una structCharactercon due campi interi:healthedamage. Dichiara i prototipi delle funzioni per creare un personaggio, eseguire un attacco, controllare se un personaggio è vivo e stampare il suo stato.character.c: implementa il sistema dei personaggi:create_character: riceve i valori iniziali di salute e danno, alloca un Character nell'heap, inizializza i suoi campi e restituisce un puntatoreattack: riceve due puntatori a Character (attaccante e bersaglio) e riduce la salute del bersaglio del valore del danno dell'attaccanteis_alive: riceve un puntatore const a Character e restituisce 1 se la salute è maggiore di 0, altrimenti restituisce 0print_status: riceve un puntatore const a Character e stampa la salute del personaggio nel formatoHealth: Xfree_character: libera la memoria allocata
main.c: crea una simulazione di battaglia! Leggi quattro interi che rappresentano: la salute dell'eroe, il danno dell'eroe, la salute del nemico e il danno del nemico. Crea entrambi i personaggi usando il tuo costruttore. Poi simula i round di combattimento: in ogni round l'eroe attacca per primo, poi il nemico contrattacca. Entrambi i colpi avvengono nello stesso round, quindi il contrattacco del nemico va comunque a segno anche se l'attacco dell'eroe lo ha già ridotto a zero o meno. Continua finché un personaggio non viene sconfitto. Dopo ogni round, stampa lo stato di entrambi i personaggi (prima l'eroe, poi il nemico). Quando la battaglia finisce, stampaHero wins!oppureEnemy wins!, a seconda di chi è sopravvissuto. Non dimenticare di liberare entrambi i personaggi.
Il tuo programma riceverà quattro input:
- Salute iniziale dell'eroe
- Danno dell'eroe per attacco
- Salute iniziale del nemico
- Danno del nemico per attacco
Esempio di output quando gli input sono 50, 20, 30, 15:
Health: 35
Health: 10
Health: 20
Health: -10
Hero wins!Esempio di output quando gli input sono 20, 5, 100, 25:
Health: -5
Health: 95
Enemy wins!Ricorda di usare le include guard nel tuo file header. La funzione attack mostra come un oggetto può modificare lo stato interno di un altro: un concetto chiave nella progettazione orientata agli oggetti. Usa puntatori const in modo appropriato per le funzioni che leggono soltanto i dati.
Provalo tu
#include <stdio.h>
#include "character.h"
int main() {
// Leggi i valori di input
int hero_health, hero_damage, enemy_health, enemy_damage;
scanf("%d", &hero_health);
scanf("%d", &hero_damage);
scanf("%d", &enemy_health);
scanf("%d", &enemy_damage);
// TODO: Crea i personaggi dell'eroe e del nemico usando create_character
// TODO: Simula i turni di combattimento
// - L'eroe attacca per primo
// - Il nemico attacca se è ancora vivo
// - Stampa lo stato di entrambi i personaggi dopo ogni turno (prima l'eroe, poi il nemico)
// - Continua finché uno dei personaggi non cade
// TODO: Stampa il vincitore ("Hero wins!" o "Enemy wins!")
// TODO: Libera la memoria di entrambi i personaggi
return 0;
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online