티스토리 뷰

🟩 오늘의 목표

  • 사용자 입력을 기반으로 캐릭터의 기본 능력치를 설정한다.
  • 조건문과 반복문을 활용해 스탯 관리 메뉴 구조를 구현한다.
  • 포션 사용·능력치 강화·레벨업 기능을 설계하고 직접 구현한다.
  • 함수와 포인터의 개념을 프로그램 구조에 적용해본다.

 

🟧C++ 문법 학습 – 스탯 관리 시스템 구현


🟦 능력치 입력 및 검증

  • HP/MP는 최소 50 이상, ATK/DF는 최소 1 이상
  • while문을 이용한 재입력 처리
  • 사용자 입력값 기반 캐릭터 초기 스탯 구성

🟦 포션 지급 및 메뉴 UI 구성

  • HP/MP 포션 각각 5개 지급
  • 무한 반복 메뉴
  • 0 입력 시 프로그램 종료

🟦 능력치 강화 기능

  • HP/MP → +20
  • ATK/DF → ×2
  • 변경 즉시 출력 + 포션 차감

🟦 Level Up 기능

  • 레벨업 시 포션 1개씩 지급
  • 추후 setPotion 적용 가능

🟦 내가 구현한 스탯 관리 시스템 코드

 
#include <iostream>
using namespace std;

void setPotion(int count, int* p_HPPotion, int* p_MPPotion)
{
    *p_HPPotion = count;
    *p_MPPotion = count;
}

int main() 
{
    int HP = 0;
    int MP = 0;
    int ATK = 0;
    int DF = 0;
    int stat[] = {HP, MP, ATK, DF};

    cout << "HP의 값을 입력해주세요. (50이상)" << endl;
    cin >> HP;
    while (HP < 50)
    {
        cout << "HP의 값이 너무 작습니다. 다시 입력해주세요. (50이상)" << endl;
        cin >> HP;
    }

    cout << "MP의 값을 입력해주세요. (50이상)" << endl;
    cin >> MP;
    while (MP < 50) 
    {
        cout << "MP의 값이 너무 작습니다. 다시 입력해주세요. (50이상)" << endl;
        cin >> MP;
    }

    cout << "공격력을 입력해주세요. (1이상)" << endl;
    cin >> ATK;
    while (ATK <= 0)
    {
        cout << "공격력을 다시 입력해주세요. (1이상)" << endl;
        cin >> ATK;
    }

    cout << "방어력을 입력해주세요. (1이상)" << endl;
    cin >> DF;
    while (DF <= 0)
    {
        cout << "방어력을 다시 입력해주세요. (1이상)" << endl;
        cin >> DF;
    }

    int choice = 0;
    int HPPotion = 5;
    int MPPotion = 5;
    cout << "* 포션이 지급되었습니다. (HP, MP 포션 각 5개)" << endl;
    cout << "=============================================" << endl;
    cout << "<스텟 관리 시스템> (1. HP UP 2. MP UP 3. 공격력 UP 4. 방어력 UP 5. 현재 능력치 6. Level Up 0. 나가기)" << endl;

    while (1)
    {
        cout << "번호를 선택해주세요 : ";
        cin >> choice;

        if (choice == 0)
        {
            cout << "프로그램을 종료합니다.";
            return 0;
        }
        else if (choice == 1)
        {
            HP += 20;
            HPPotion--;
            cout << "* HP가 20증가되었습니다. 포션이 1개 차감됩니다." << endl << "현재 HP : " << HP << endl << "남은 포션 수 : " << HPPotion << endl;
        }
        else if (choice == 2)
        {
            MP += 20;
            MPPotion--;
            cout << "* MP가 20증가되었습니다. 포션이 1개 차감됩니다." << endl << "현재 MP : " << MP << endl << "남은 포션 수 : " << MPPotion << endl;
        }
        else if (choice == 3)
        {
            ATK *= 2;
            cout << "* 공격력이 2배로 증가되었습니다." << endl << "현재 공격력 : " << ATK << endl;
        }
        else if (choice == 4)
        {
            DF *= 2;
            cout << "* 방어력이 2배로 증가되었습니다." << endl << "현재 방어력 : " << DF << endl;
        }
        else if (choice == 5)
        {
            cout << "현재 능력치" << endl << "* HP : " << HP << ", MP : " << MP << ", 공격력 : " << ATK << ", 방어력 : " << DF << endl;
        }
        else if (choice == 6)
        {
            HPPotion++;
            MPPotion++;
            cout << "* 레벨업! HP/MP 포션이 지급됩니다." << endl << "남은 HP/MP 포션 수 : " << HPPotion << "/" << MPPotion << endl;
        }
        else
        {
            cout << "잘못된 번호입니다." << endl;
        }
    }

    return 0;
}

 

🟧 오늘 배운 내용 요약


🟦 제어 흐름

  • 무한 반복문에서 메뉴 선택 처리
  • return vs break 의 차이 이해

🟦 포인터 함수

  • 주소를 전달해 외부 변수 값을 변경하는 방식 학습

🟦 배열 초기값 복사 개념

  • stat 배열은 초기값만 반영됨

 

🟫 오늘 느낀 점

  • 기능 하나하나를 직접 구현하면서 C++ 문법이 실제 게임 시스템 구조로 연결되는 느낌을 받을 수 있었다.

 

🟧 보완해야 할 점 & 개선안 예시 코드

👉 (GPT가 제안한 개선 방향입니다.)

🟦 1. stat 배열이 실제 스탯과 동기화되지 않음

  • 현재 배열은 초기값만 저장됨 → 변화 반영 X

✅ 개선안 예시 코드

 
void updateStatArray(int stat[], int HP, int MP, int ATK, int DF) {
    stat[0] = HP;
    stat[1] = MP;
    stat[2] = ATK;
    stat[3] = DF;
}

 

  • 그리고 능력치가 바뀔 때마다 :
updateStatArray(stat, HP, MP, ATK, DF);

 

🟦 2. 포션이 0개일 때도 사용됨 (음수 가능)

❌ 현재 문제

HPPotion--;
  • 포션이 0이어도 사용됨.

✅ 개선안 예시 코드

if (HPPotion > 0) {
    HP += 20;
    HPPotion--;
} else {
    cout << "HP 포션이 부족합니다!" << endl;
}

 

🟦 3. Level Up 기능에서 setPotion 활용 가능

❌ 현재

HPPotion++;
MPPotion++;

✅ 개선안 예시 코드

 
setPotion(HPPotion + 1, &HPPotion, &MPPotion);

 

🟦 4. 스탯 출력 함수로 중복 제거

❌ 현재

  • print 코드가 여러 곳에 반복됨

✅ 개선안 예시 코드

void printStatus(int HP, int MP, int ATK, int DF) {
    cout << "현재 능력치\n";
    cout << "* HP : " << HP 
         << ", MP : " << MP 
         << ", 공격력 : " << ATK 
         << ", 방어력 : " << DF << endl;
}

🟦 5. 반복문 종료에 return 대신 break 사용 권장

❌ 현재

return 0;

✅ 개선안 예시 코드

 
if (choice == 0) {
    cout << "프로그램을 종료합니다." << endl;
    break;
}

'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글

TIL - 12일차  (0) 2025.12.12
TIL - 11일차  (1) 2025.12.11
TIL - 9일차  (0) 2025.12.09
TIL - 8일차  (0) 2025.12.08
TIL - 7일차  (1) 2025.12.05