Personaje de RPG
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 58 de 61.
Desafío
FácilVamos a construir un sistema de combate de RPG Character — un ejemplo clásico que reúne structs, métodos, constructores e interacción de objetos en un diseño limpio y modular.
Organizarás tu código en tres archivos:
character.h: Define una estructuraCharactercon dos campos enteros:healthydamage. Declara los prototipos de función para crear un personaje, realizar un ataque, verificar si un personaje está vivo y mostrar el estado de un personaje.character.c: Implementa tu sistema de personajes:create_character— toma los valores iniciales de salud y daño, asigna un Character en el heap, inicializa sus campos y devuelve un puntero.attack— toma dos punteros Character (atacante y objetivo), reduce la salud del objetivo por el daño del atacante.is_alive— toma un puntero const Character y devuelve 1 si la salud es mayor que 0, de lo contrario devuelve 0.print_status— toma un puntero const Character e imprime la salud del personaje en el formatoHealth: X.free_character— libera la memoria asignada.
main.c: ¡Crea una simulación de batalla! Lee cuatro enteros que representan: la salud del héroe, el daño del héroe, la salud del enemigo y el daño del enemigo. Crea ambos personajes usando tu constructor. Luego simula rondas de combate — el héroe ataca primero, luego el enemigo ataca (si aún está vivo). Continúa hasta que un personaje caiga. Después de cada ronda, imprime el estado de ambos personajes (primero el héroe, luego el enemigo). Cuando la batalla termine, imprimeHero wins!oEnemy wins!dependiendo de quién haya sobrevivido. No olvides liberar a ambos personajes.
Tu programa recibirá cuatro entradas:
- Salud inicial del héroe
- Daño por ataque del héroe
- Salud inicial del enemigo
- Daño por ataque del enemigo
Ejemplo de salida cuando las entradas son 50, 20, 30, 15:
Health: 35
Health: 10
Health: 20
Health: -10
Hero wins!Ejemplo de salida cuando las entradas son 20, 5, 100, 25:
Health: -5
Health: 95
Enemy wins!Recuerda usar protectores de inclusión (include guards) en tu archivo de cabecera. La función attack demuestra cómo un objeto puede modificar el estado interno de otro — un concepto clave en el diseño orientado a objetos. Usa punteros const de manera apropiada para las funciones que solo leen datos.
Pruébalo tú mismo
#include <stdio.h>
#include "character.h"
int main() {
// Leer los 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: Crear los personajes del héroe y del enemigo usando create_character
// TODO: Simular las rondas de combate
// - El héroe ataca primero
// - El enemigo ataca si todavía está vivo
// - Imprimir el estado de ambos personajes después de cada ronda (primero el héroe, luego el enemigo)
// - Continuar hasta que un personaje caiga
// TODO: Imprimir el ganador ("Hero wins!" o "Enemy wins!")
// TODO: Liberar ambos personajes
return 0;
}
Todas las lecciones de Object Oriented Programming
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculo