본문 바로가기

숙제

C++ 1번 과제(상태창 구현하기)

필수 기능

  • 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;
		}
	}
}

결과

모두 잘 출력된다.