RPG 캐릭터
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 58번째.
챌린지
쉬움구조체, 메서드, 생성자, 그리고 객체 간의 상호작용을 깔끔하고 모듈화된 디자인으로 결합한 클래식한 예제인 RPG 캐릭터 전투 시스템을 구축해 봅시다.
코드는 다음 세 개의 파일로 구성됩니다:
character.h:health와damage라는 두 개의 정수 필드를 가진Character구조체를 정의합니다. 캐릭터 생성, 공격 수행, 생존 여부 확인, 캐릭터 상태 출력을 위한 함수 프로토타입을 선언합니다.character.c: 캐릭터 시스템을 구현합니다:create_character— 초기 체력과 공격력 값을 받아 힙(heap)에 Character를 할당하고, 필드를 초기화한 후 포인터를 반환합니다.attack— 두 개의 Character 포인터(공격자와 대상)를 받아, 공격자의 공격력만큼 대상의 체력을 감소시킵니다.is_alive— const Character 포인터를 받아 체력이 0보다 크면 1을, 그렇지 않으면 0을 반환합니다.print_status— const Character 포인터를 받아 캐릭터의 체력을Health: X형식으로 출력합니다.free_character— 할당된 메모리를 해제합니다.
main.c: 전투 시뮬레이션을 만듭니다! 영웅의 체력, 영웅의 공격력, 적의 체력, 적의 공격력을 나타내는 네 개의 정수를 입력받습니다. 생성자를 사용하여 두 캐릭터를 모두 생성합니다. 그런 다음 전투 라운드를 시뮬레이션합니다. 영웅이 먼저 공격하고, 적이 살아있다면 적이 공격합니다. 한 캐릭터가 쓰러질 때까지 계속합니다. 매 라운드가 끝날 때마다 두 캐릭터의 상태를 출력합니다(영웅 먼저, 그다음 적). 전투가 끝나면 생존자에 따라Hero wins!또는Enemy wins!를 출력합니다. 두 캐릭터의 메모리를 해제하는 것을 잊지 마세요.
프로그램은 네 개의 입력을 받습니다:
- 영웅의 시작 체력
- 영웅의 공격당 데미지
- 적의 시작 체력
- 적의 공격당 데미지
입력이 50, 20, 30, 15일 때의 출력 예시:
Health: 35
Health: 10
Health: 20
Health: -10
Hero wins!입력이 20, 5, 100, 25일 때의 출력 예시:
Health: -5
Health: 95
Enemy wins!헤더 파일에 include guard를 사용하는 것을 잊지 마세요. attack 함수는 한 객체가 다른 객체의 내부 상태를 어떻게 수정할 수 있는지 보여주는 객체 지향 설계의 핵심 개념입니다. 데이터를 읽기만 하는 함수에는 const 포인터를 적절히 사용하세요.
직접 해보기
#include <stdio.h>
#include "character.h"
int main() {
// 입력값 읽기
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: create_character를 사용하여 영웅과 적 캐릭터 생성
// TODO: 전투 라운드 시뮬레이션
// - 영웅이 먼저 공격
// - 적이 살아있다면 공격
// - 매 라운드 종료 후 두 캐릭터의 상태 출력 (영웅 먼저, 그 다음 적)
// - 한 캐릭터가 쓰러질 때까지 반복
// TODO: 승자 출력 ("Hero wins!" 또는 "Enemy wins!")
// TODO: 두 캐릭터의 메모리 해제
return 0;
}