Menu
Coddy logo textTech

Personagem de RPG

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 58 de 61.

challenge icon

Desafio

Fácil

Vamos criar um sistema de combate de Personagem de RPG: um exemplo clássico que reúne structs, métodos, construtores e interação entre objetos em um design limpo e modular.

Você organizará seu código em três arquivos:

  • character.h: defina uma struct Character com dois campos inteiros: health e damage. Declare os protótipos das funções para criar um personagem, realizar um ataque, verificar se um personagem está vivo e imprimir o status de um personagem.
  • character.c: implemente seu sistema de personagens:
    • create_character: recebe valores iniciais de vida e dano, aloca um Character no heap, inicializa seus campos e retorna um ponteiro
    • attack: recebe dois ponteiros para Character (atacante e alvo) e reduz a vida do alvo pelo dano do atacante
    • is_alive: recebe um ponteiro const para Character e retorna 1 se a vida for maior que 0; caso contrário, retorna 0
    • print_status: recebe um ponteiro const para Character e imprime a vida do personagem no formato Health: X
    • free_character: libera a memória alocada
  • main.c: crie uma simulação de batalha! Leia quatro inteiros que representam: a vida do herói, o dano do herói, a vida do inimigo e o dano do inimigo. Crie ambos os personagens usando seu construtor. Em seguida, simule as rodadas de combate; em cada rodada, o herói ataca primeiro e depois o inimigo revida. Ambos os golpes acontecem na mesma rodada, portanto o contra-ataque do inimigo ainda acontece mesmo que o ataque do herói já tenha reduzido sua vida a zero ou menos. Continue até que um dos personagens seja derrotado. Após cada rodada, imprima o status de ambos os personagens (primeiro o herói, depois o inimigo). Quando a batalha terminar, imprima Hero wins! ou Enemy wins!, dependendo de quem sobreviveu. Não se esqueça de liberar ambos os personagens.

Seu programa receberá quatro entradas:

  1. Vida inicial do herói
  2. Dano do herói por ataque
  3. Vida inicial do inimigo
  4. Dano do inimigo por ataque

Exemplo de saída quando as entradas são 50, 20, 30, 15:

Health: 35
Health: 10
Health: 20
Health: -10
Hero wins!

Exemplo de saída quando as entradas são 20, 5, 100, 25:

Health: -5
Health: 95
Enemy wins!

Lembre-se de usar include guards no seu arquivo de cabeçalho. A função attack demonstra como um objeto pode modificar o estado interno de outro: um conceito fundamental no design orientado a objetos. Use ponteiros const adequadamente nas funções que apenas leem dados.

Experimente você mesmo

#include <stdio.h>
#include "character.h"

int main() {
    // Ler valores de entrada
    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: Crie os personagens herói e inimigo usando create_character
    
    // TODO: Simule as rodadas de combate
    // - Herói ataca primeiro
    // - Inimigo ataca se ainda estiver vivo
    // - Imprima o status de ambos os personagens após cada rodada (herói primeiro, depois inimigo)
    // - Continue até que um personagem caia
    
    // TODO: Imprima o vencedor ("Hero wins!" or "Enemy wins!")
    
    // TODO: Libere ambos os personagens
    
    return 0;
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online