오늘은 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 |