이 코드는 텍스트 기반 RPG 게임으로, 플레이어가 직업을 선택하고 랜덤으로 생성되는 몬스터와 전투를 진행하는 구조입니다.
struct(구조체)와 enum(열거형)을 사용하여 데이터를 효율적으로 관리합니다. #include <iostream> // 표준 입출력 라이브러리 포함
#include <ctime> // 랜덤 시드 설정을 위한 time 라이브러리 포함
using namespace std;
#include <iostream>: cout, cin 등의 표준 입출력을 사용하기 위한 헤더 파일.#include <ctime>: srand(time(0))을 사용하여 난수를 생성하는 데 필요.using namespace std;: std::cout, std::cin을 간편하게 cout, cin으로 사용하기 위함.enum PlayerType {
PT_Knight = 1, // 기사 (체력 높고 방어력 있음)
PT_Archer = 2, // 궁수 (공격력 높음)
PT_Mage = 3 // 법사 (공격력 매우 높으나 방어력 없음)
};
enum MonsterType {
MT_Slime = 1, // 슬라임 (약한 몬스터)
MT_Orc = 2, // 오크 (중간급 몬스터)
MT_Skeleton = 3 // 스켈레톤 (강한 몬스터)
};
enum으로 관리하여 가독성을 높이고 유지보수 용이하게 함.struct ObjectInfo {
int type; // 객체의 타입 (플레이어/몬스터)
int hp; // 체력 (Health Point)
int attack; // 공격력
int defence; // 방어력
};
ObjectInfo 구조체를 사용하여 플레이어와 몬스터의 정보를 하나의 데이터 구조로 관리.hp, attack, defence)를 따로 선언하는 대신 구조체를 사용하여 데이터를 묶어 관리.ObjectInfo playerInfo; // 플레이어 정보 저장
ObjectInfo monsterInfo; // 몬스터 정보 저장
void EnterLobby();
void SelectPlayer();
void EnterField();
void CreateRandomMonster();
void EnterBattle();
int main() {
srand(time(0)); // 랜덤 시드 설정 (매번 다른 몬스터 생성)
EnterLobby(); // 게임 로비로 이동
return 0; // 프로그램 종료
}
srand(time(0)): rand() 함수의 결과가 매번 다르게 나오도록 시드 값 설정.EnterLobby();: 로비 함수 호출하여 게임 시작.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; // 게임 종료
}
}
}
void SelectPlayer() {
while (true) {
cout << "직업을 골라주세요!" << endl;
cout << "(1) 기사 (2) 궁수 (3) 법사" << endl;
cout << "> ";
cin >> playerInfo.type;
if (playerInfo.type == PT_Knight) {
playerInfo.hp = 150;
playerInfo.attack = 10;
playerInfo.defence = 5;
break;
} else if (playerInfo.type == PT_Archer) {
playerInfo.hp = 100;
playerInfo.attack = 15;
playerInfo.defence = 3;
break;
} else if (playerInfo.type == PT_Mage) {
playerInfo.hp = 80;
playerInfo.attack = 25;
playerInfo.defence = 0;
break;
}
}
}
void EnterField() {
while (true) {
cout << "필드에 입장했습니다!" << endl;
cout << "[PLAYER] HP : " << playerInfo.hp << " / ATT : " << playerInfo.attack << "/ DEF : " << playerInfo.defence << endl;
CreateRandomMonster(); // 랜덤 몬스터 생성
cout << "(1) 전투 (2) 도주" << endl;
int input;
cin >> input;
if (input == 1) {
EnterBattle();
if (playerInfo.hp == 0) return; // 플레이어 사망 시 종료
} else {
return; // 도주
}
}
}
void CreateRandomMonster() {
monsterInfo.type = 1 + (rand() % 3);
switch (monsterInfo.type) {
case MT_Slime:
monsterInfo.hp = 15;
monsterInfo.attack = 5;
monsterInfo.defence = 0;
break;
case MT_Orc:
monsterInfo.hp = 40;
monsterInfo.attack = 10;
monsterInfo.defence = 3;
break;
case MT_Skeleton:
monsterInfo.hp = 80;
monsterInfo.attack = 15;
monsterInfo.defence = 5;
break;
}
}
void EnterBattle() {
while (true) {
// 플레이어 공격
int damage = playerInfo.attack - monsterInfo.defence;
if (damage < 0) damage = 0;
monsterInfo.hp -= damage;
if (monsterInfo.hp <= 0) {
cout << "몬스터를 처치했습니다!" << endl;
return;
}
// 몬스터 공격
damage = monsterInfo.attack - playerInfo.defence;
if (damage < 0) damage = 0;
playerInfo.hp -= damage;
if (playerInfo.hp <= 0) {
cout << "당신은 사망했습니다... GAME OVER" << endl;
return;
}
}
}