Menu
Coddy logo textTech

Personaggio RPG

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 58 di 61.

challenge icon

Sfida

Facile

Costruiamo 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 struct Character con due campi interi: health e damage. 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 puntatore
    • attack: riceve due puntatori a Character (attaccante e bersaglio) e riduce la salute del bersaglio del valore del danno dell'attaccante
    • is_alive: riceve un puntatore const a Character e restituisce 1 se la salute è maggiore di 0, altrimenti restituisce 0
    • print_status: riceve un puntatore const a Character e stampa la salute del personaggio nel formato Health: X
    • free_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, stampa Hero wins! oppure Enemy wins!, a seconda di chi è sopravvissuto. Non dimenticare di liberare entrambi i personaggi.

Il tuo programma riceverà quattro input:

  1. Salute iniziale dell'eroe
  2. Danno dell'eroe per attacco
  3. Salute iniziale del nemico
  4. 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

Esercitati da solo: Compilatore C online