Personaje de RPG
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 58 de 61.
Desafío
FácilConstruyamos un sistema de combate de personajes de RPG: un ejemplo clásico que reúne estructuras, métodos, constructores e interacción entre 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 las funciones para crear un personaje, realizar un ataque, comprobar si un personaje está vivo e imprimir el estado de un personaje.character.c: Implementa tu sistema de personajes:create_character: recibe los valores iniciales de salud y daño, reserva un Character en el montón, inicializa sus campos y devuelve un punteroattack: recibe dos punteros a Character (atacante y objetivo) y reduce la salud del objetivo según el daño del atacanteis_alive: recibe un puntero const a Character y devuelve 1 si la salud es mayor que 0; de lo contrario, devuelve 0print_status: recibe un puntero const a Character e imprime la salud del personaje con el formatoHealth: Xfree_character: libera la memoria reservada
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. Después, simula rondas de combate; en cada ronda, el héroe ataca primero y después el enemigo contraataca. Ambos golpes ocurren dentro de la misma ronda, por lo que el contraataque del enemigo impacta aunque el ataque del héroe ya lo haya reducido a cero o menos. Continúa hasta que caiga uno de los personajes. Después de cada ronda, imprime el estado de ambos personajes (primero el héroe y después el enemigo). Cuando termine la batalla, imprimeHero wins!oEnemy wins!según quién haya sobrevivido. No olvides liberar ambos personajes.
Tu programa recibirá cuatro entradas:
- Salud inicial del héroe
- Daño del héroe por ataque
- Salud inicial del enemigo
- Daño del enemigo por ataque
Salida de ejemplo cuando las entradas son 50, 20, 30, 15:
Health: 35
Health: 10
Health: 20
Health: -10
Hero wins!Salida de ejemplo cuando las entradas son 20, 5, 100, 25:
Health: -5
Health: 95
Enemy wins!Recuerda usar protectores de inclusión en tu archivo de encabezado. La función attack demuestra cómo un objeto puede modificar el estado interno de otro: un concepto clave del diseño orientado a objetos. Usa punteros const adecuadamente en las funciones que solo leen datos.
Pruébalo tú mismo
#include <stdio.h>
#include "character.h"
int main() {
// Lee 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: Crea los personajes del héroe y del enemigo usando create_character
// TODO: Simula las rondas de combate
// - El héroe ataca primero
// - El enemigo ataca si sigue vivo
// - Imprime el estado de ambos personajes después de cada ronda (héroe primero, luego enemigo)
// - Continúa hasta que un personaje caiga
// TODO: Imprime el ganador ("Hero wins!" or "Enemy wins!")
// TODO: Libera ambos personajes
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
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írculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online