내일배움캠프-언리얼

[내일배움캠프 - 언리얼] DAY 8 - 간단한 상태창 만들기

이시보 2025. 12. 8. 20:55
#include <iostream>
#include <string>

using namespace std;

// [HP, MP, 공격력, 방어력, 힘, 민첩, 지능] 배열 생성
// 배열 초기화
int status[7] = {0, 0, 0, 0, 0, 0, 0};
// 포션 생성 및 초기화
int HPPotion, MPPotion = 0;
// 레벨, 경험치 생성 및 초기화
int level, expP = 0;

// HP, MP 입력 함수
void HPMP()
{
	cout << "HP와 MP를 입력해주세요: ";
	cin >> status[0] >> status[1]; // HP, MP 상태 배열에 입력 받기

	if (status[0] <= 50 || status[1] <= 50) // HP 또는 MP 가 50 이하일 경우
	{
		cout << "HP나 MP의 값이 너무 작습니다. 다시 입력해주세요." << endl;
		HPMP(); // 함수 재실행
	}
}

// 공격력, 방어력 입력 함수
void AtkDef()
{
	cout << "공격력과 방어력을 입력해주세요: ";
	cin >> status[2] >> status[3]; // 공격력, 방어력 상태 배열에 입력 받기

	if (status[2] <= 0 || status[3] <= 0) // 공격력 또는 방어력이 0 이하일 경우
	{
		cout << "공격력이나 방어력의 값이 너무 작습니다. 다시 입력해주세요." << endl;
		AtkDef(); // 함수 재실행
	}
}

// 힘, 민첩, 지능 입력 함수
void StrDexInt()
{
	cout << "힘과 민첩과 지능을 입력해주세요: ";
	cin >> status[4] >> status[5] >> status[6]; // 힘, 민첩, 지능 상태 배열에 입력 받기

	if (status[4] < 0 || status[5] < 0 || status[6] < 0) // 힘, 민첩 또는 지능이 0 미만일 경우
	{
		cout << "힘이나 민첩 또는 지능의 값이 너무 작습니다. 다시 입력해주세요." << endl;
		StrDexInt(); // 함수 재실행
	}
}

// 포션 개수 추가 설정 함수
void setPotion(int count, int* p_HPPotion, int* p_MPPotion)
{
	*p_HPPotion += count;
	*p_MPPotion += count;
}

// 레벨 초기화 함수
void setLevel()
{
	level = 1;
}

// 레벨업 함수
void levelUp()
{
	if (++expP == 6) // 경험치를 1 올리며 6 일시 레벨+1 후 경험치 초기화
	{
		level++;
		expP = 0;
	}
}

// 상태창 변경 함수
void changeStatus()
{
	int input = 0; // 입력 받을 번호
	cout << "번호를 선택해주세요: ";
	cin >> input;

	switch(input)
	{
		case 0: // 프로그램 종료
			cout << "프로그램을 종료합니다." << endl;
			return;
		case 1: // HP 증가
			if (HPPotion > 0)
			{
				status[0] += 20;
				HPPotion--;
				cout << "* HP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
				cout << "현재 HP: " << status[0] << endl << "남은 포션 수: " << HPPotion << endl;
			}
			else
			{
				cout << "포션이 부족합니다." << endl;
			}
			break;
		case 2: // MP 증가
			if (MPPotion > 0)
			{
				status[1] += 20;
				MPPotion--;
				cout << "* MP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
				cout << "현재 MP: " << status[1] << endl << "남은 포션 수: " << MPPotion << endl;
			}
			else
			{
				cout << "포션이 부족합니다." << endl;
			}
			break;
		case 3: // 공격력 증가
			status[2] *= 2;
			cout << "* 공격력이 2배로 증가되었습니다." << endl;
			cout << "현재 공격력: " << status[2] << endl;
			break;
		case 4: // 방어력 증가
			status[3] *= 2;
			cout << "* 방어력이 2배로 증가되었습니다." << endl;
			cout << "현재 방어력: " << status[3] << endl;
			break;
		case 5: // 상태창 표시
			cout << "* Level : " << level << endl; // 레벨 출력
			cout << "* HP : " << status[0] << ", MP : " << status[1] << ", 공격력 : " << status[2] << ", 방어력 : " << status[3] << endl;
			cout << "* 힘 : " << status[4] << ", 민첩 : " << status[5] << ", 지능 : " << status[6] << endl; // 힘, 민첩, 지능 출력
			cout << "* HP/MP 포션 : " << HPPotion << "/" << MPPotion << endl; // 남은 포션 수 출력
			break;
		case 6: // 레벨업
			setPotion(1, &HPPotion, &MPPotion); // 포션 충전 함수
			levelUp();
			cout << "* 레벨업! HP/MP 포션이 지급됩니다." << endl;
			cout << "남은 HP/MP 포션 수 : " << HPPotion << "/" << MPPotion << endl;
			cout << "현재 레벨 : " << level << ", 현재 경험치 : " << expP << "/6" << endl;
			break;
		default: // 잘못된 번호 입력
			cout << "잘못된 번호를 입력하였습니다. 다시 입력해주세요." << endl;
			break;
	}
	changeStatus(); // 함수 재실행
}

int main()
{
	HPMP();
	AtkDef();
	StrDexInt();
	setPotion(5, &HPPotion, &MPPotion);
	setLevel();

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

	changeStatus();

	return 0;
}

과제 1번인 상태창 만들기이다.

기본 값을 입력 받을 때 범위 내의 값이 아니면 자기자신을 다시 실행하는 재귀함수로 하였다.