학습일지/C와 C++

C++ RPG 전투 시스템 구현 과제

Tsukino Ren 2026. 3. 11. 20:56

프로젝트 소개

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