필수 기능
- HP, MP, 공격력, 방어력을 크기 4의 int형 배열로 선언 및 0으로 초기화합니다.
- (배열 이름이 status라면 status[0]은 체력, status[3]은 방어력)
- HP와 MP를 입력받고, HP나 MP가 하나라도 50 이하의 숫자를 입력받을 경우 다시 입력받습니다.
- HP와 MP에 값을 입력받은 후 공격력과 방어력을 입력받습니다. 공격력이나 방어력이 하나라도 0 이하의 숫자를 입력받을 경우 다시 입력 받습니다.
- 스탯 관리 시스템을 시작합니다.
- HP 회복 2. MP 회복 3. HP 강화 4. MP 강화 5. 공격 스킬 사용 6. 필살기 사용
- 선택지를 출력한 후, int형 정수 하나를 입력받아서 해당 선택지를 실행합니다.
- call by pointer를 사용해봅시다. HP, MP포션은 5개씩 기본 지급되며, HP, MP 포션 개수로 5를 저장합니다. 함수는 다음과 같이 정의합니다.
- void setPotion(int count, int* p_HPPotion, int* p_MPPotion)
- 1, 2번을 선택시 각각 HP/MP가 20 증가하고, 포션의 개수가 1개씩 차감됩니다. 포션이 0개일 경우 사용할 수 없습니다.
- 3, 4번을 선택시 각각 HP/ MP가 2배씩 증가합니다. 이 연산은 두가지 방법이 있으니 잘 생각해보시길 바랍니다.
- 5번 선택시 MP가 50 차감됩니다
도전 기능
- 6번은 필살기이기 때문에, 현재 MP의 50% 만큼 소모합니다.
- 7번을 선택하면 프로그램을 종료합니다.
위에서부터 한줄씩 읽어가며 필요한 변수와 함수를 하나씩 생각해가며 작성했다.
헤더파일에는 선언만 하고 소스파일에 구현을 하는 연습을 하기위해 헤더와 소스파일을 나눴다.
// State.h에 작성했음.
#pragma once
class State
{
private:
// HP, MP, 공격력, 방어력을 크기 4의 int형 배열로 선언 및 0으로 초기화.
int HP = 0; //HP
int MP = 0; //MP
int AD = 0; //공격력
int DF = 0; //방어력
int status[4] = {HP, MP, AD, DF}; // 배열에 각 값 넣고 0으로 초기화.
int CountHPPotion = 0; // HP포션 개수
int CountMPPotion = 0; // MP포션 개수
public:
// main에서 입력받은 HP, MP, 공격력, 방어력 값을 멤버변수에 넣기위한 함수
void setHP(int hp);
void setMP(int mp);
void setAD(int ad);
void setDF(int df);
// call by pointer 사용
void setPotion(int count, int* p_HPPotion, int* p_MPPotion);
};
// State.cpp에 작성했음.
#include "State.h"
#include <iostream>
using namespace std;
//call by pointer, 인자로 주소값을 받아서 값에 count를 대입하고 그 값을 멤버변수에 저장.
void State::setPotion(int count, int* p_HPPotion, int* p_MPPotion)
{
*p_HPPotion = count;
*p_MPPotion = count;
CountHPPotion = *p_HPPotion;
CountMPPotion = *p_MPPotion;
}
// 외부에서 입력받은 값을 멤버변수에 저장
void State::setHP(int hp)
{
HP = hp;
}
void State::setMP(int mp)
{
MP = mp;
}
void State::setAD(int ad)
{
AD = ad;
}
void State::setDF(int df)
{
DF = df;
}
// main.cpp에 작성했음.
#include "State.h"
#include <iostream>
using namespace std;
int main()
{
// 사용자의 입력을 받을 변수 선언
int hp = 0;
int mp = 0;
int ad = 0;
int df = 0;
State s; // State 클래스를 담은 변수 s 선언
while (hp <= 50 || mp <= 50) // hp, mp 둘중 하나라도 50 이하일 시 재입력 받기 위한 반복문
{
cout << "HP 입력: ";
cin >> hp;
cout << "MP 입력: ";
cin >> mp;
if (hp <= 50 || mp <= 50) // 다시 입력하라는 문구 출력을 위한 조건문
{
cout << "HP나 MP의 값이 너무 작습니다. 다시 입력해주세요." << endl;
}
}
s.setHP(hp); // 입력받은 hp값을 State의 멤버변수 HP에 저장.
s.setMP(mp); // 입력받은 mp값을 State의 멤버변수 MP에 저장.
while (ad <= 0 || df <= 0) // ad, df 둘중 하나라도 0 이하일 시 재입력 받기 위한 반복문
{
cout << "공격력 입력: ";
cin >> ad;
cout << "방어력 입력: ";
cin >> df;
if (ad <= 0 || df <= 0) // 다시 입력하라는 문구 출력을 위한 조건문
{
cout << "공격력과 방어력의 값이 너무 작습니다. 다시 입력해주세요." << endl;
}
}
s.setAD(ad); // 입력받은 ad값을 State의 AD에 저장.
s.setDF(df); // 입력받은 df값을 State의 DF에 저장.
int CounthpPotion = 0; // hp 포션 개수
int CountmpPotion = 0; // mp 포션 개수
s.setPotion(5, &CounthpPotion, &CountmpPotion); // call by pointer, 인자로 주소값 넣기
cout << "* 포션이 지급되었습니다. (HP, MP 포션 각 5개)" << endl << "=====================================================================" << endl;
int num = 0; // 선택지 입력 받을 변수 선언
//스탯 관리 시스템 시작
cout << "1. HP 회복 2. MP 회복 3. HP 강화 4. MP 강화 5. 공격 스킬 사용 6. 필살기 사용 7. 나가기" << endl;
while(num <= 7)
{
cout << "번호를 선택해주세요: ";
cin >> num; // 선택지 입력
//입력 받은 값과 각 상황에 따라 출력되는 메세지 정리.
if (num == 1 && CounthpPotion > 0)
{
hp += 20;
CounthpPotion -= 1;
cout << "HP 20회복되었습니다. 포션이 1개 차감됩니다." << endl << "현재 HP : " << hp << endl << "남은 HP포션 : " << CounthpPotion << endl;
}
else if (num == 1 && CounthpPotion <= 0)
{
cout << "HP포션이 부족합니다." << endl;
}
else if (num == 2 && CountmpPotion > 0)
{
mp += 20;
CountmpPotion -= 1;
cout << "MP 20회복되었습니다. 포션이 1개 차감됩니다." << endl << "현재 MP : " << mp << endl << "남은 MP포션 : " << CountmpPotion << endl;
}
else if (num == 2 && CountmpPotion <= 0)
{
cout << "MP포션이 부족합니다." << endl;
}
else if (num == 3)
{
hp *= 2;
cout << "HP가 2배 회복됐습니다. 현재 HP: " << hp << endl;
}
else if (num == 4)
{
mp *= 2;
cout << "MP가 2배 회복됐습니다. 현재 HP: " << mp << endl;
}
else if (num == 5 && mp > 50)
{
mp -= 50;
cout << "* 스킬을 사용하여 MP가 50 소모되었습니다." << endl << "현재 MP: " << mp << endl;
}
else if (num == 5 && mp <= 50)
{
cout << "MP가 부족하여 스킬 사용이 불가합니다." << endl;
}
//5까지 입력받는게 필수 기능, 아래는 도전 기능 6, 7 입력받기
else if (num == 6 && mp > 0)
{
mp /= 2;
cout << "* 필살기를 사용하여 MP 50% 소모합니다." << endl << "현재 MP: " << mp << endl;
}
else if (num == 6 && mp <= 0)
{
cout << "MP가 부족하여 필살기 사용이 불가합니다." << endl;
}
else if (num == 7)
{
cout << "프로그램을 종료합니다.";
return 0;
}
}
}
결과
모두 잘 출력된다.
'숙제' 카테고리의 다른 글
C++ 숙제(메모리 누수 발생 코드 분석하고 보완하기, 스마트 포인터를 활용한 로그분석기 구현) (0) | 2025.08.19 |
---|---|
C++ 2번 과제(전직 시스템과 전투 시스템) (0) | 2025.08.18 |
C++ 숙제 (핸드폰 정보 출력 프로그램 구현하기) (2) | 2025.08.14 |
C++ 숙제(다형성을 활용한 게임 스킬 사용 프로그램 구현하기) (2) | 2025.08.14 |
C++ 숙제(배터리 관리 클래스 만들기) (2) | 2025.08.13 |