1. 프로젝트 개요
이번 CH2 과제에서는 C++ 기초 문법과 객체지향 개념을 활용해 콘솔 기반 텍스트 RPG를 구현했습니다.
프로젝트의 전체 흐름은 다음과 같습니다.
- 캐릭터 생성
- 입력 유효성 검사
- 스탯 관리 메뉴
- 직업 선택
- 몬스터 클래스와 1:1 전투
- 인벤토리와 아이템 드롭
- 포션 제작소 기본 기능
단순히 콘솔에 텍스트를 출력하는 것에서 끝나는 것이 아니라, Player, Monster, Item, PotionRecipe 같은 클래스를 나누고 상속과 다형성을 사용해 구조를 분리하는 데 집중했습니다.
2. 구현 과정
Step 1. 캐릭터 생성 화면
가장 먼저 플레이어 이름과 기본 스탯을 입력받는 캐릭터 생성 화면을 만들었습니다.
플레이어는 이름, HP, MP, 공격력, 방어력을 입력받아 생성됩니다. 이후 이 값들은 Player 클래스의 멤버 변수로 관리되며, 게임 진행 중 출력하거나 수정할 수 있도록 Getter와 Setter를 만들었습니다.
이 단계에서는 클래스의 기본 구조와 생성자를 연습하는 것이 핵심이었습니다.
Step 2. 입력 유효성 검사
다음으로 잘못된 입력을 처리하는 기능을 추가했습니다.
예를 들어 HP와 MP는 50 이상, 공격력과 방어력은 20 이상이어야 하도록 제한했습니다. 또한 메뉴 선택 시 숫자가 아닌 값이 들어오면 std::cin.clear()와 std::cin.ignore()를 사용해 입력 버퍼를 정리했습니다.
콘솔 프로그램에서는 입력 검증을 제대로 하지 않으면 프로그램 흐름이 쉽게 망가지기 때문에, 이 부분이 생각보다 중요했습니다.
Step 3. 스탯 관리 메뉴
캐릭터 생성 이후에는 게임 시작 전 스탯을 관리할 수 있는 메뉴를 만들었습니다.
메뉴에서는 다음 기능을 선택할 수 있습니다.
- HP 포션 사용
- MP 포션 사용
- 공격력 2배 증가
- 방어력 2배 증가
- 현재 스탯 확인
- 게임 시작
이 기능을 통해 단순 입력 프로그램에서 벗어나, 반복 메뉴와 상태 변경이 있는 게임 흐름을 만들 수 있었습니다.
Step 4. Player 클래스와 직업 선택
이후 Player 클래스를 기반으로 여러 직업 클래스를 만들었습니다.
구현한 직업은 다음과 같습니다.
- Warrior
- Mage
- Rogue
- Archer
각 직업은 Player 클래스를 상속받고, 생성 시 특정 스탯 보너스를 받도록 했습니다.
예를 들어 Warrior는 HP가 증가하고, Mage는 MP가 증가하며, Rogue는 공격력, Archer는 방어력이 증가합니다.
또한 Player 클래스의 attack() 함수를 순수 가상 함수로 만들고, 각 직업 클래스에서 override하여 직업별 공격 메시지를 다르게 출력했습니다.
이 단계에서 상속, 가상 함수, 다형성의 기본 개념을 직접 사용해볼 수 있었습니다.
Step 5. Monster 클래스와 1:1 전투
다음으로 몬스터 클래스와 전투 시스템을 구현했습니다.
기본 Monster 클래스를 만들고, 이를 상속받는 몬스터 클래스를 추가했습니다.
- Slime
- Zombie
- Skeleton
전투는 플레이어와 몬스터가 번갈아 공격하는 1:1 턴 방식으로 진행됩니다.
데미지는 다음과 같은 방식으로 계산했습니다.
damage = attackPower - defence;
단, 방어력이 더 높아 데미지가 0 이하가 되는 경우에도 최소 1의 데미지는 들어가도록 처리했습니다.
전투에서 몬스터 HP가 0 이하가 되면 승리하고, 플레이어 HP가 0 이하가 되면 패배합니다.
Step 6. 인벤토리와 아이템 드롭
몬스터를 처치하면 아이템을 획득하도록 만들었습니다.
각 몬스터는 드롭 아이템 이름과 가격 정보를 가지고 있으며, 전투에서 승리하면 Item 구조체로 아이템을 생성한 뒤 인벤토리에 추가합니다.
인벤토리는 std::vector<Item>로 관리했습니다. 최대 개수는 10개로 제한했고, 인벤토리가 가득 찬 경우에는 아이템을 저장하지 않도록 처리했습니다.
이 단계에서는 구조체, 벡터, 반복문을 활용해 아이템 목록을 관리하는 연습을 할 수 있었습니다.
Step 7. 포션 제작소 기본 기능
마지막으로 포션 제작소 기능을 추가했습니다.
포션 제작소에서는 다음 기능을 사용할 수 있습니다.
- 전체 레시피 확인
- 포션 이름으로 검색
- 재료 이름으로 검색
레시피는 PotionRecipe 구조체로 만들었고, AlchemyWorkshop 클래스에서 여러 레시피를 std::vector로 관리했습니다.
이 기능을 만들면서 데이터를 단순 출력하는 것이 아니라, 검색 조건에 따라 필요한 정보를 찾아 출력하는 구조를 연습했습니다.
3. 사용한 주요 C++ 개념
이번 과제에서 사용한 주요 C++ 개념은 다음과 같습니다.
- 클래스와 구조체
- 생성자
- Getter / Setter
- 상속
- 순수 가상 함수
- override
- 포인터와 동적 할당
- std::vector
- std::array
- const 참조
- 입력 버퍼 처리
- 메뉴 기반 반복문
특히 Player* player = nullptr;로 플레이어를 선언한 뒤, 선택한 직업에 따라 new Warrior, new Magician처럼 다른 자식 클래스를 생성하는 구조가 인상적이었습니다.
부모 타입 포인터로 자식 객체를 다루는 방식은 이후 언리얼 엔진에서 Actor, Pawn, Character 같은 클래스를 이해하는 데도 도움이 될 것 같습니다.
'내배캠_Unreal10기' 카테고리의 다른 글
| [TIL] 이분 탐색과 탐욕법 문제 풀이 (0) | 2026.07.22 |
|---|---|
| [TIL] 방의 개수 / 이분 탐색과 탐욕법 (0) | 2026.07.21 |
| [TIL] 내일배움캠프 Unreal 10기 8일차 (0) | 2026.07.07 |
| [TIL] 내일배움캠프 Unreal 10기 7일차 (0) | 2026.07.07 |
| [TIL] 내일배움캠프 Unreal 10기 2일차 (0) | 2026.06.29 |