전체 코드


📌 1. Text RPG 코드 구조

main()
 ├── EnterLobby()  // 로비 진입
 │    ├── CreatePlayer()  // 플레이어 생성
 │    ├── PrintStatInfo()  // 플레이어 스탯 출력
 │    └── EnterGame()  // 게임 시작
 │         ├── CreateMonsters()  // 몬스터 생성
 │         ├── PrintStatInfo()  // 몬스터 정보 출력
 │         ├── EnterBattle()  // 전투 진행
 │         └── PrintMessage()  // 게임 메시지 출력

💡 핵심 개념 정리

  • 포인터(*): 메모리 주소를 직접 다뤄 데이터 변경 가능
  • 참조(&): 복사 없이 원본 데이터 참조 가능, const와 함께 안전하게 사용
  • 배열([]): 여러 개의 동일한 데이터 저장, 포인터처럼 전달 가능

📌 2. 주요 개념 정리 (포인터, 참조, 배열)

1️⃣ StatInfo 구조체

struct StatInfo {
    int hp = 0;
    int attack = 0;
    int defence = 0;
};
  • 플레이어와 몬스터의 상태 정보를 저장하는 구조체
  • 스택에 할당되며, 각 함수에서 이를 포인터(*) 또는 참조(&)로 전달하여 사용

2️⃣ CreatePlayer(StatInfo* playerInfo) - 포인터 활용

void CreatePlayer(StatInfo* playerInfo) {
    bool ready = false;
    while (!ready) {
        PrintMessage("캐릭터 생성창");
        PrintMessage("[1] 기사 [2] 궁수 [3] 법사");
        cout << "> ";
        int input;
        cin >> input;

        switch (input) {
        case PT_Knight:
            playerInfo->hp = 100;
            playerInfo->attack = 10;
            playerInfo->defence = 5;
            ready = true;
            break;
        case PT_Archer:
            playerInfo->hp = 80;
            playerInfo->attack = 15;
            playerInfo->defence = 3;
            ready = true;
            break;
        case PT_Mage:
            playerInfo->hp = 50;
            playerInfo->attack = 25;
            playerInfo->defence = 1;
            ready = true;
            break;
        }
    }
}

✅ 분석

  • StatInfo* playerInfo포인터를 통해 직접 데이터 수정
  • playerInfo->hp = 100; → 포인터(->)를 이용해 멤버 변수 접근
  • 스택 메모리에 저장된 값이 변경됨, 새로운 메모리를 할당하지 않음

📍함수 호출 방식

StatInfo playerInfo;
CreatePlayer(&playerInfo);  // playerInfo의 주소를 전달
  • &playerInfo → 포인터로 주소를 전달하면 값이 복사되지 않고 직접 수정 가능

3️⃣ PrintStatInfo(const char* name, const StatInfo& info) - 참조 활용

void PrintStatInfo(const char* name, const StatInfo& info) {
    cout << "*****************************\n";
    cout << name << " : HP = " << info.hp 
         << ", ATT = " << info.attack 
         << ", DEF = " << info.defence << '\n';
    cout << "*****************************\n";
}

✅ 분석

  • const StatInfo& info → 참조(&)를 사용하여 복사 없이 접근
  • const 사용 → 함수 내에서 info 값 변경 불가능 (안전한 접근)

📍함수 호출 방식

PrintStatInfo("Player", playerInfo);
  • playerInfo복사되지 않고 직접 참조되므로 메모리 절약 효과가 있음

4️⃣ CreateMonsters(StatInfo monsterInfo[], int count) - 배열 활용

void CreateMonsters(StatInfo monsterInfo[], int count) {
    for (int i = 0; i < count; i++) {
        int randValue = (rand() % 3) + 1;

        switch (randValue) {
        case MT_Slime:
            monsterInfo[i].hp = 30;
            monsterInfo[i].attack = 5;
            monsterInfo[i].defence = 1;
            break;
        case MT_Orc:
            monsterInfo[i].hp = 40;
            monsterInfo[i].attack = 8;
            monsterInfo[i].defence = 2;
            break;
        case MT_Skeleton:
            monsterInfo[i].hp = 50;
            monsterInfo[i].attack = 15;
            monsterInfo[i].defence = 3;
            break;
        }
    }
}

✅ 분석

  • StatInfo monsterInfo[]배열을 함수에 전달할 때 포인터처럼 동작
  • monsterInfo[i] → 배열 요소 접근 가능

📍함수 호출 방식

StatInfo monsterInfo[2];
CreateMonsters(monsterInfo, 2);
  • 배열 이름(monsterInfo)은 첫 번째 요소의 주소를 나타냄
  • 배열을 포인터로 전달하면, 함수 내에서 값을 직접 변경 가능

5️⃣ EnterBattle(StatInfo* playerInfo, StatInfo* monsterInfo) - 포인터 활용

bool EnterBattle(StatInfo* playerInfo, StatInfo* monsterInfo) {
    while (true) {
        int damage = playerInfo->attack - monsterInfo->defence;
        if (damage < 0) damage = 0;
        monsterInfo->hp -= damage;
        if (monsterInfo->hp < 0) monsterInfo->hp = 0;
        PrintStatInfo("Monster ", *monsterInfo);

        if (monsterInfo->hp == 0) {
            PrintMessage("몬스터를 처치했습니다!");
            return true;
        }

        damage = monsterInfo->attack - playerInfo->defence;
        if (damage < 0) damage = 0;
        playerInfo->hp -= damage;
        if (playerInfo->hp < 0) playerInfo->hp = 0;
        PrintStatInfo("Player ", *playerInfo);

        if (playerInfo->hp == 0) {
            PrintMessage("사망 했습니다!");
            return false;
        }
    }
}

✅ 분석

  • StatInfo* playerInfo, StatInfo* monsterInfo → 포인터로 구조체 전달
  • 함수 내에서 직접 hp 값을 수정 가능 (*playerInfo*monsterInfo를 사용)
  • PrintStatInfo("Player", *playerInfo);참조(*playerInfo)를 사용해 데이터 출력

profile
李家네_공부방

0개의 댓글