오늘은 TEXT_RPG 프로젝트를 정리한다. Visual Studio C++ 콘솔 프로젝트로 만들었고, 플레이어 직업 선택, 스탯 강화, 턴제 전투, 몬스터 드랍, 인벤토리 흐름까지 한 사이클이 들어가 있다.
프로젝트 전체 구조
프로젝트의 중심은 크게 네 축으로 나뉜다.
CharacterPlayer와 각 직업 클래스Monster와 각 몬스터 클래스main.cpp에서 관리하는 게임 루프
Character는 이름과 기본 스탯 배열을 들고 있는 가장 하위 타입이다. 그 위에 Player가 올라가고, 다시 Warrior, Magician, Thief, Archer가 파생되는 구조다.
몬스터 쪽은 Monster를 기반으로 Slime, Goblin이 만들어져 있고, 스폰 테이블에는 Orc, Dragon까지 확장 가능하도록 enum과 드랍 테이블이 잡혀 있다.
기본 데이터 설계
스탯은 배열 인덱스로 관리한다.
const int HP = 0;
const int MP = 1;
const int ATK = 2;
const int DEF = 3;
이 방식은 구조체보다 단순하지만, 인덱스를 잘못 쓰면 바로 오류가 날 수 있다. 대신 콘솔 과제 수준에서는 빠르게 확장하기 쉽다.
또한 pch.h에는 직업 enum, 몬스터 enum, 드랍 아이템 테이블, 몬스터 스폰 순서가 같이 들어 있다.
static Item dropTable[4] =
{
{"Slime Jelly", 50}, {"Goblin ear", 20},
{"Orc finger", 100}, {"Dragon horn", 1000}
};
즉, 몬스터 종류와 드랍 아이템을 전역 테이블로 연결해 놓고, 실제 스테이지 생성 시 그 값을 참조하는 구조다.
전투 구조
전투는 Battle(Player* player, Monster* monster) 함수 하나로 돌린다. 전형적인 턴제 구조다.
흐름은 다음과 같다.
- 플레이어 턴
- 공격 또는 아이템 사용
- 몬스터 사망 여부 확인
- 몬스터 턴
- 플레이어에게 반격
승리 시에는 현재 스테이지를 증가시키고, 몬스터 드랍 아이템을 inventory 벡터에 넣는다.
if (monster->GetHP() <= 0)
{
stage = min(stage + 1, maxStage);
inventory.push_back(monster->GetDropItem());
cout << " Victory!\n";
}'TIL' 카테고리의 다른 글
| Rendering : Forward, Deferred (0) | 2026.05.04 |
|---|---|
| TEXT RPG 2 (0) | 2026.04.29 |
| EventGraph (0) | 2026.04.24 |
| 3인칭 캐릭터를 1인칭으로 사용할 때 얼굴 가림 문제 (0) | 2026.04.23 |
| UE5 FPS 총 발사, 이펙트, 사운드, HUD 간단 구현 정리 (0) | 2026.04.22 |