티스토리 뷰
🟩 오늘의 목표
- 사용자 입력을 기반으로 캐릭터의 기본 능력치를 설정한다.
- 조건문과 반복문을 활용해 스탯 관리 메뉴 구조를 구현한다.
- 포션 사용·능력치 강화·레벨업 기능을 설계하고 직접 구현한다.
- 함수와 포인터의 개념을 프로그램 구조에 적용해본다.
🟧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 |

