플레이어가 죽을 때 까지 싸우는 간단한 RPG 게임을 만들어보자.

0. 코드 줄여서 보기

Ctrl + M, O 를 클릭해서 함수들을 줄여서 볼 수 있다.

 

1. 코드 흐름

1) 게임을 시작할지 종료할지 선택한다.

2) 캐릭터의 직업을 선택한다.

3) 필드에 입장해서 전투를 진행할지 도주할지 선택한다.

4) 몬스터를 랜덤 생성한다.

5) 몬스터와 서로 죽을 때까지 전투한다.

 

2. enum을 이용한 배열 생성

enum을 이용하여 플레이어의 직업과 몬스터의 타입을 결정한다.

enum PlayerType
{
	PT_Knight = 1,
	PT_Archer,
	PT_Mage
};
enum MonsterType
{
	MT_Slime = 1,
	MT_Orc,
	MT_Skeleton
};

첫 숫자가 결정되면 아래 부터는 자동으로 1씩 증가시키는 번호를 가진다.

 

3-1. rpg에 필요한 스테이터스 생성

플레이어와 몬스터의 타입, 체력, 공격력, 방어력을 정의한다.

int PlayerType;
int hp;
int atk;
int def;

int MonsterType;
int mon_hp;
int mon_atk;
int mon_def;

3-2. 전역 변수 정의

void EnterLobby();
void SelectPlayer();
void EnterField();
void CreateRandomMonster();
void EnterBattle();

 

4. 게임 시작

main 함수에 게임을 시작하는 함수를 집어넣는다.

int main()
{
	srand(time(0)); // 랜덤 시드 설정

	EnterLobby();
	return 0; // 게임 종료
}

이때 랜덤 시드를 설정해서 몬스터의 타입을 랜덤으로 설정할 것이다.

이후는 코드 흐름에 따라서 로비에 입장하는 코드를 작성한다.

while (true)를 이용한 무한 루프로 작성한다.

void EnterLobby()
{
	while (true)
	{
		cout << "------------------------------" << endl;
		cout << "로비에 입장했습니다." << endl;
		cout << "------------------------------" << endl;
		
		// 플레이어의 직업을 선택함
		SelectPlayer();

		cout << "------------------------------" << endl;
		cout << "(1) 필드 입장 (2) 게임 종료" << endl;
		cout << "------------------------------" << endl;

		int input; // 게임 시작과 종료 판단
		cin >> input;

		if (input == 1)
		{
			EnterField();
		}
		else
		{
			return;
		}
	}
}

로비 입장 이후 플레이어의 타입을 선택하기 위하여 SelectPlayer 함수를 전역 변수로 정의하고 아래에서 구동문을 작성한다.

void SelectPlayer()
{	while (true)
{
	cout << "------------------------------" << endl;
	cout << "플레이어의 직업을 선택해주세요." << endl;
	cout << "(1) 기사 (2) 궁수 (3) 법사" << endl;
	cout << "------------------------------" << endl;
	cout << "> ";

	cin >> PlayerType;


	if (PlayerType == PT_Knight)
	{
		cout << "기사 생성중..." << endl;
		hp = 150;
		atk = 10;
		def = 5;
		break;
	}
	else if (PlayerType == PT_Archer)
	{
		cout << "궁수 생성중..." << endl;
		hp = 100;
		atk = 15;
		def = 3;
		break;
	}
	else if (PlayerType == PT_Mage)
	{
		cout << "법사 생성중..." << endl;
		hp = 80;
		atk = 25;
		def = 0;
		break;
	}
	else // 1,2,3이 아닌 다른 숫자를 입력하는 예외 처리
		cout << "잘못 선택하였습니다." << endl;
}
}

코드의 흐름에 따라서 직업 선택 이후 필드 입장을 선택하면 본격적으로 몬스터와의 결투가 시작된다.

 

void EnterField()
{
	while (true)
	{
		cout << "------------------------------" << endl;
		cout << "필드에 입장했습니다." << endl;
		cout << "------------------------------" << endl;

		cout << "[PLAYER] HP : " << hp << " / ATK : " << atk << " / DEF : " << def << endl;
		
		CreateRandomMonster();
	
		cout << "------------------------------" << endl;
		cout << "(1) 전투 (2) 도주" << endl;
		cout << "> ";

		int input;
		cin >> input;

		if (input == 1)
		{
			EnterBattle();
			if (hp == 0)
				return;
		}
		else
		{
			return;
		}
	
	}
}

위에서 CreateRandomMonster 함수는 몬스터의 타입을 랜덤으로 (1, 2, 3) 선택하는 함수이다.

void CreateRandomMonster()
{
	// 몬스터의 타입을 랜덤으로 결정
	MonsterType = 1 + (rand() % 3); // 1, 2, 3

	switch (MonsterType)
	{
	case MT_Slime:
		cout << "슬라임 생성중... (HP : 15 / ATK : 5 / DEF : 0)" << endl;
		mon_hp = 15;
		mon_atk = 5;
		mon_def = 0;
		break;

	case MT_Orc:
		cout << "오크 생성중... (HP : 40 / ATK : 10 / DEF : 3)" << endl;
		mon_hp = 40;
		mon_atk = 10;
		mon_def = 3;
		break;

	case MT_Skeleton:
		cout << "스켈레톤 생성중... (HP : 80 / ATK : 15 / DEF : 5)" << endl;
		mon_hp = 80;
		mon_atk = 15;
		mon_def = 5;
		break;
	}
}

이후 전투 여부를 선택하면 본격적으로 전투가 시작된다.

void EnterBattle()
{
	while (true)
	{
		int damage = atk - mon_def;
		if (damage < 0)
		damage = 0;

		mon_hp -= damage;
		if (mon_hp < 0)
			mon_hp = 0;

		cout << "몬스터의 남은 체력 : " << mon_hp << endl;
		if (mon_hp == 0)
		{
			cout << "몬스터를 처치했습니다!" << endl;
			return;
		}
		// 몬스터가 죽지 않으면 몬스터가 공격함

		damage = mon_atk - def;
		if (damage < 0)
			damage = 0;

		hp -= damage;
		if (hp < 0)
			hp = 0;

		cout << "플레이어 남은 체력 : " << hp << endl;
		if (hp == 0)
		{
			cout << "당신은 사망했습니다. GAME OVER" << endl;
			return;
		}
	}
}

중간 중간에 hp 또는 데미지가 음수가 되지 않도록 예외처리를 해준다.

이 게임은 다음과 같은 흐름으로 진행된다.

main -> EnterLobby -> (SelectPlayer) -> EnterField -> (CreateRandomMonster) -> EnterBattle

이후 플레이어가 죽을 때까지 반복한다.

'기초 C++ 스터디 > 예제' 카테고리의 다른 글

4-13. 문자열 수정하기  (0) 2023.05.23
4-12. Text RPG 만들기(2)  (0) 2023.05.23
4-8. 로또 번호 생성기  (0) 2023.05.22
4-3. 포인터 실습  (0) 2023.05.11
2-3. 예제(별 찍기, 구구단)  (0) 2023.05.04