C++

C++로 전직 시스템과 전투 시스템 구현해보기

왕건 2026. 3. 10. 19:34

오늘은 C++로 캐릭터 전직 시스템과 전투 시스템 구현해보려고 한다.

 

Header.h

#pragma once
#include <iostream>
#include <string>

using namespace std;
class monster;

class Player {

public:
	virtual void attack1(monster* mon) = 0;
	virtual void attack2() = 0;
	Player(string C = "unknown", int P = 20, int A = 20, int D = 25) : Class(C), HP(P), Attack(A), Defence(D) {}
//플레이어가 죽었을 때
	void dead()
	{
		cout << "-----------------------------------------------" << endl;
		cout << "죽었습니다... 마을로 돌아갑니다..." << endl;
		setHP(100);

	}
//플레이어가 도망갈 때
	void run() {
		cout << "-----------------------------------------------" << endl;
		cout << "무사히 도망쳤습니다!" << endl;
	}

	void setHP(int P) {
		HP = P;
	};

	int getHP() {
		return HP;
	}

	int getAttack() {
		return Attack;
	}

	int getDefence() {
		return Defence;
	}

	void interface() {

		cout << "-----------------------------------------------" << endl;
		cout << "직업: " << Class << endl;
		cout << "체력: " << HP << endl;
		cout << "공격력: " << Attack << endl;
		cout << "방어력: " << Defence << endl;
	}

protected:
	int HP;
	int Attack;
	int Defence;
	string Class;

};

class monster {

public:
	//몬스터의 이름과 여러가지들을 생성자로 초기화
	monster(string n = "Slime", int hpVal = 100, int atkVal = 30, int defVal = 10, int speed = 10)
		: name(n), monHP(hpVal), AttackValue(atkVal), DefenceValue(defVal), SpeedValue(speed) {
	}
	//몬스터의 현재 체력을 보여주는 인터페이스
	void MonHPIF() {
		cout << "-----------------------------------------------" << endl;
		cout << "현재 몬스터의 체력은: " << monHP << "입니다." << endl;
	}
	//몬스터가 플레이어를 공격
	void MonAttack(Player* player)
	{
		int damage = player->getDefence(); -AttackValue;
		if (damage < 0)
			damage = 0;

		player->setHP(player->getHP() - damage);
		if (player->getHP() <= 0)
		{
			player->setHP(0);
		}

		cout << "-----------------------------------------------" << endl;
		cout << "몬스터가 플레이어를 공격합니다." << endl;
		cout << "남은 플레이어 체력: " << player->getHP() << endl;
	}
	//던전에서 몬스터가 등장했을때
	void MonCome() {
		cout << "-----------------------------------------------" << endl;
		cout << name << "이 나타났습니다!" << endl;
	}

	void setmonHP(int HP) {
		monHP = HP;
	}

	int getmonHP() {
		return monHP;
	}

	int getmonAttackValue() {
		return AttackValue;
	}

	int getmonDefenceValue() {
		return DefenceValue;
	}


	string name;
	int monHP;
	int AttackValue;
	int DefenceValue;
	int SpeedValue;
};

class Warrior : public Player {

public:
	Warrior() : Player("Warrior", 100, 20, 25) {}

	void attack1(monster* mon) 
	{
		//플레이어가 몬스터한테 넣는 데미지 공식
		int damage = Attack - mon->getmonDefenceValue();
		if (damage < 0) {
			damage = 0;
			}
		//몬스터의 HP가 -가 되지않도록 하는 공식
		mon->setmonHP(mon->getmonHP() - damage);
		if (mon->getmonHP() <= 0) {
			mon->setmonHP(0);
		}

		cout << "-----------------------------------------------" << endl;
		cout << "검을 휘두릅니다!" << endl;
		cout << "남은 몬스터의 체력: " << mon->getmonHP() << endl;
	}

	//던전이 아닌 평상시에 공격을 휘두를 때
	void attack2() {
		cout << "-----------------------------------------------" << endl;
		cout << "허공에 검을 휘두릅니다!" << endl;
	}
 };

class Magican : public Player {

public:
	Magican() : Player("Magican", 100, 30, 15) {}

	void attack1(monster* mon)
	{
		int damage = Attack - mon->getmonDefenceValue();
		if (damage < 0) {
			damage = 1;
		}

		mon->setmonHP(mon->getmonHP() - damage);
		if (mon->getmonHP() <= 0) {
			mon->setmonHP(0);
		}

		cout << "-----------------------------------------------" << endl;
		cout << "파이어볼을 쏩니다!" << endl;
		cout << "남은 몬스터의 체력: " << mon->getmonHP() << endl;
	}

	void attack2() {
		cout << "-----------------------------------------------" << endl;
		cout << "허공에 파이어볼을 쏩니다!" << endl;
	}
};

class Thief : public Player {

public:

	Thief() : Player("Thief", 100, 40, 10) {}

	void attack1(monster* mon)
	{
		int damage = Attack - mon->getmonDefenceValue();
		if (damage < 0) {
			damage = 1;
		}

		mon->setmonHP(mon->getmonHP() - damage);
		if (mon->getmonHP() <= 0) {
			mon->setmonHP(0);
		}

		cout << "-----------------------------------------------" << endl;
		cout << "독 단검을 던집니다!" << endl;
		cout << "남은 몬스터의 체력: " << mon->getmonHP() << endl;
	}

	void attack2() {
		cout << "-----------------------------------------------" << endl;
		cout << "허공에 독 단검을 던집니다!" << endl;
	}
};

class Archer : public Player {

public:
	
	Archer() : Player("Archer", 100, 25, 20) {}

	void attack1(monster* mon)
	{
		int damage = Attack - mon->getmonDefenceValue();
		if (damage < 0) {
			damage = 0;
		}

		mon->setmonHP(mon->getmonHP() - damage);
		if (mon->getmonHP() <= 0) {
			mon->setmonHP(0);
		}

		cout << "-----------------------------------------------" << endl;
		cout << "화살을 쏩니다!" << endl;
		cout << "남은 몬스터의 체력: " << mon->getmonHP() << endl;
	}

	void attack2() {
		cout << "-----------------------------------------------" << endl;
		cout << "허공에 화살을 쏩니다!" << endl;
	}
};

 

클래스, 상속, 생성자 등등 여러가지 개념을 한꺼번에 배우자마자 응용하려니 힘들었다. 오랜시 간이 걸렸다. 

 

 

Main.cpp

#include "Header.h"

int main()
{
	int ch;
	int choice1;
	int choice2;
	Player* player = nullptr;
	monster* mon = nullptr;

	mon = new monster();
	//시작할 때 전직 인터페이스
	cout << "-----------------------------------------------" << endl;
	cout << "어떤 직업을 선택하시겠습니까?" << endl;
	cout << "1.전사 / 2.마법사 / 3.도적 / 4.궁수" << endl;
	cout << "선택 :  ";
	cin >> choice1;

	if (choice1 == 1) {
		cout << "-----------------------------------------------" << endl;
		cout << "전직을 축하합니다!" << endl;
		player = new Warrior();

	}
	else if (choice1 == 2) {
		cout << "-----------------------------------------------" << endl;
		cout << "전직을 축하합니다!" << endl;
		player = new Magican();

	}
	else if (choice1 == 3) {
		cout << "-----------------------------------------------" << endl;
		cout << "전직을 축하합니다!" << endl;
		player = new Thief();

	}
	else {
		cout << "-----------------------------------------------" << endl;
		cout << "전직을 축하합니다!" << endl;
		player = new Archer();

	}

	//do-while로 인터페이스 반복하여 띄우기
	do {
		cout << "-----------------------------------------------" << endl;
		cout << "선택지를 고르세요." << endl;
		cout << "1. 내 정보 / 2. 던전 가기 / 3. 공격 휘둘러보기 / 0. 종료하기" << endl;
		cin >> choice2;
		
		//if문으로 선택지 나누기
		if (choice2 == 1) {
			player->interface();
		}
		else if (choice2 == 2)
		{
			mon->MonCome();
			
			//던전에 들어갔을시 던전용 인터페이스 반복하여 띄우기
			do {
				cout << "-----------------------------------------------" << endl;
				cout << "선택지를 고르세요." << endl;
				cout << "1. 내 정보 / 2. 공격하기 / 3. 몬스터 체력 / 0. 도망가기" << endl;
				cin >> ch;
				
				//if문으로 선택지 나누기
				if (ch == 1) {
					player->interface();
				}
				else if (ch == 2) {
					player->attack1(mon);
					mon->MonAttack(player);
					//몬스터의 체력이 0이 되었을 때
					if (mon->getmonHP() <= 0)
					{
						cout << "-----------------------------------------------" << endl;
						cout << "축하합니다! 몬스터를 물리쳤습니다!" << endl;
						cout << "마을로 돌아갑니다." << endl;

						mon->setmonHP(200);

						break;
					}
					//플레이어의 체력이 0이 되었을 때
					else if (player->getHP() <= 0)
					{
						player->dead();
						break;
					}
						
				}
				else if (ch == 3)
					{
						mon->MonHPIF();
					}
				else if (ch == 0) {
					player->run();
					break;
				}
			} while (ch != 5266); {
				
			}
		}
		else if (choice2 == 3) {
			player->attack2();
		}


	} while (choice2 != 0);

	//끝내기 전 값이 담겨있을경우 비워줌.
	if (player != nullptr)
		delete player;

	if (mon != nullptr)
		delete mon;

	return 0;
};

'C++' 카테고리의 다른 글

기본 생성자와 오버로딩  (0) 2026.03.12
생성자와 소멸자  (0) 2026.03.12
Class  (0) 2026.03.09
포인터  (0) 2026.03.05
C++로 인터페이스 상태창 구현해보기  (0) 2026.03.04