프로젝트 소개
C++ 객체지향 프로그래밍(OOP)을 활용하여 플레이어와 몬스터가 전투하는 간단한 RPG 전투 시스템을 구현해봤습니다.
플레이어는 직업을 선택할 수 있으며, 각 직업은 고유한 능력치를 가지고 있습니다.
몬스터와의 전투를 통해 공격 및 데미지 계산이 이루어지는 구조입니다.
GitHub Repository
프로젝트 전체 코드는 아래 GitHub에서 확인할 수 있습니다.
https://github.com/whitealbum1226/HW02
시스템 구조
이 프로젝트는 다음과 같은 객체지향 구조로 설계했습니다.
Player (기본 클래스)
├ Warrior
├ Archer
├ Magician
└ Thief
Monster
└ Goblin
Player 클래스
플레이어의 기본 정보를 관리하는 클래스입니다.
관리하는 데이터
닉네임
HP
MP
ATK
직업 이름 등등
또한 외부에서 접근할 수 있도록 Getter / Setter를 구현했습니다.
예시
std::string Player::getJobName()
{
return jobname;
}
int Player::getHP()
{
return HP;
}
Getter를 통해 클래스 내부 데이터를 외부에서 안전하게 사용할 수 있도록 했습니다.
직업 시스템
플레이어는 게임 시작 시 직업을 선택할 수 있습니다.
std::string jobs[] = { "전사", "궁수", "도적", "마법사" };
각 직업은 Player 클래스를 기반으로 하여 능력치가 다르게 설정됩니다.
예시
| 전사 | 높은 HP와 높은 방어력 |
| 궁수 | 무난한 공격력과 타수 분할 |
| 도적 | 무난한 공격력과 타수 분할로 저점이 높음 |
| 마법사 | 강력한 한방 공격 |
몬스터 시스템
몬스터는 Monster 클래스를 기반으로 만들어졌습니다.
몬스터의 기본 능력치
HP
ATK
DEF
SPD
몬스터 공격 로직
데미지 = 몬스터 공격력 - 플레이어 방어력
단,
데미지가 0 이하일 경우 → 최소 1 데미지
전투 로직
몬스터와 플레이어의 전투는 다음 순서로 진행됩니다.
1 플레이어 공격
2 몬스터 HP 감소
3 랜덤 확률 몬스터 공격
4 플레이어 HP 감소
공격 시 현재 남은 HP를 출력하도록 구현했습니다.
구현하면서 배운 점
이번 과제를 통해 다음 개념을 실제 코드로 구현해볼 수 있었습니다.
객체지향 설계
- 클래스 분리
- 역할 기반 설계
- 상속 구조
Getter / Setter 사용
클래스 내부 데이터를 직접 접근하지 않고 함수를 통해 관리하는 방법을 배웠습니다.
포인터 기반 객체 사용
Player* player
Monster* monster
포인터를 사용하여 객체 간 상호작용을 구현하는 법을 배웠습니다.
개선하고 싶은 점
- 스킬 시스템
- 다양한 몬스터 추가
- 장비와 레벨 시스템
마무리
int totalGoblin = 5;
int Goblincount = 1;
해당 변수를 만들어놓고 까먹어서 사용하지 못해 아쉬웠습니다.
이번 과제를 통해 C++ 객체지향 설계 방식과 클래스 간 상호작용 구조를 직접 구현해볼 수 있었습니다.
수시로 검색하고 강의내용 둘러보면서 만들다보니 안보고 만들 수준까지 가고싶습니다.
추가
if(monster->getHP() <= 0)
{
if (monster != nullptr)
{
delete monster;
monster = nullptr;
}
if (MobCount < 5)
{
++MobCount;
switch (RendomMob2)
{
case 0:
monster = new Goblin("고블린");
std::cout << "\n새로운 고블린이 나타났다!" << std::endl;
monster->printMonsterStatus();
break;
case 1:
monster = new Slime("슬라임");
std::cout << "\n새로운 슬라임이 나타났다!" << std::endl;
monster->printMonsterStatus();
break;
}
}
else
{
std::cout << "모든 적을 처지했다!" << std::endl;
break;
}
}
해당 변수를 사용하지 못한게 끝내 아쉬워서 따로 수정해본걸 올려봅니다.
슬라임 클래스를 추가하고 rand()를 사용하여 랜덤 몹 생성을 구현했습니다.
MobCount 변수를 사용하여 몹이 총 6번 생성 되면 게임이 종료되게 구현했습니다.
if (monster != nullptr)
{
delete monster;
monster = nullptr;
}
작성 초기에는 while 문 안에서 끝나도록 설게 했으나 랜덤이 추가되어 외부에서 한번더 확인을 하게끔 설게 했습니다.
'학습일지 > C와 C++' 카테고리의 다른 글
| C++ std::string (0) | 2026.03.13 |
|---|---|
| C/C++ 상속과 다형성, 추상 클래스 (0) | 2026.03.12 |
| C++ 복사 생성자와 오버로딩 (0) | 2026.03.11 |
| C/C++ 전직 (0) | 2026.03.10 |
| C/C++ Class (0) | 2026.03.09 |