전체 코드

1. 프로젝트 개요

이 코드는 텍스트 기반 RPG 게임으로, 플레이어가 직업을 선택하고 랜덤으로 생성되는 몬스터전투를 진행하는 구조입니다.

  • struct(구조체)와 enum(열거형)을 사용하여 데이터를 효율적으로 관리합니다.
  • 게임은 여러 개의 함수로 나뉘어 있으며, 로비 → 필드 입장 → 몬스터 생성 → 전투 흐름으로 진행됩니다.
  • 랜덤 요소를 활용하여 매번 다른 몬스터와 전투를 할 수 있습니다.
  • 게임 종료 조건: 플레이어가 전투에서 패배하면 게임이 종료됩니다.

2. 코드 분석 (한 줄씩 상세 주석 포함)

🔹 헤더 및 네임스페이스 설정

#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) 선언

enum PlayerType {
    PT_Knight = 1,  // 기사 (체력 높고 방어력 있음)
    PT_Archer = 2,  // 궁수 (공격력 높음)
    PT_Mage = 3     // 법사 (공격력 매우 높으나 방어력 없음)
};

enum MonsterType {
    MT_Slime = 1,    // 슬라임 (약한 몬스터)
    MT_Orc = 2,      // 오크 (중간급 몬스터)
    MT_Skeleton = 3  // 스켈레톤 (강한 몬스터)
};
  • 플레이어 직업과 몬스터 종류를 enum으로 관리하여 가독성을 높이고 유지보수 용이하게 함.

🔹 구조체(struct) 선언

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();
  • 함수가 정의되기 전에 전방 선언(Prototype)을 작성하여 함수의 존재를 컴파일러에게 알림.
  • 함수 정의 순서가 뒤죽박죽이어도 컴파일 에러 없이 사용할 수 있도록 함.

3. 메인 함수 (프로그램 실행)

int main() {
    srand(time(0)); // 랜덤 시드 설정 (매번 다른 몬스터 생성)
    EnterLobby();   // 게임 로비로 이동
    return 0;       // 프로그램 종료
}
  • srand(time(0)): rand() 함수의 결과가 매번 다르게 나오도록 시드 값 설정.
  • EnterLobby();: 로비 함수 호출하여 게임 시작.

4. 로비 (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;       // 게임 종료
        }
    }
}
  • 로비 입장 후 플레이어 직업 선택 → 필드 입장 or 게임 종료.

5. 플레이어 직업 선택 (SelectPlayer)

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;
        }
    }
}
  • 플레이어는 직업을 선택하며, 선택에 따라 체력(HP), 공격력(Attack), 방어력(Defence)이 다르게 설정됨.

6. 필드 입장 (EnterField)

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; // 도주
        }
    }
}
  • 랜덤 몬스터 생성 후 전투 또는 도주 선택.

7. 랜덤 몬스터 생성 (CreateRandomMonster)

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;
    }
}
  • 랜덤하게 3가지 몬스터 중 하나가 생성됨.

8. 전투 (EnterBattle)

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;
        }
    }
}
  • 턴 방식 전투 시스템 구현.

profile
李家네_공부방

0개의 댓글