class CItem
{
private:
string Name;
int Cnt;
int Price=0;
public:
CItem(string _Name, int _Cnt) : Name(_Name), Cnt(_Cnt) {}
string GetName();
int GetPrice();
int GetCnt();
void SetPrice(int);
public:
void ReduceCnt();
void IncreaseCnt();
virtual void Use() = 0;
};
아이템은 기본적으로 이름, 갯수, 가격을 가지고 있음
Use 가상함수를 통해서 각 아이템마다 사용효과를 적용해야 함
#include "CItem.h"
string CItem::GetName()
{
return Name;
}
int CItem::GetPrice()
{
return Price;
}
int CItem::GetCnt()
{
return Cnt;
}
void CItem::SetPrice(int _Price)
{
Price = _Price;
}
void CItem::ReduceCnt()
{
Cnt--;
}
void CItem::IncreaseCnt()
{
Cnt++;
}
#include "CItem.h"
class CHealthPotion
: public CItem
{
private:
int Amount = 50;
public:
CHealthPotion(string _Name, int _Cnt) : CItem(_Name, _Cnt) { SetPrice(10); }
int GetAmount();
public:
virtual void Use() override;
};
HealthPotion 클래스가 Item 클래스를 상속받게 하여 이름, 아이템 갯수, 가격에 대한 정보를 갖도록 하고, 체력 회복량을 정해줬음
#include "CHealthPotion.h"
#include "CPlayer.h"
int CHealthPotion::GetAmount()
{
return Amount;
}
void CHealthPotion::Use()
{
ReduceCnt();
CPlayer::GetInst()->Heal(Amount);
}
체력 회복 포션을 사용하게되면 Item 클래스의 ReduceCnt 함수를 통해 아이템 갯수를 감소하고, Player 클래스의 Heal 함수를 통해 체력을 증가시킴
#include "CItem.h"
class CAttackBoost
: public CItem
{
private:
int Amount = 10;
public:
CAttackBoost(string _Name, int _Cnt) : CItem(_Name, _Cnt) { SetPrice(15); }
int GetAmount();
public:
virtual void Use() override;
};
AttackBoost 클래스가 Item 클래스를 상속받게 하여 이름, 아이템 갯수, 가격에 대한 정보를 갖도록 하고, 공격력 증가량을 정해줬음
#include "CAttackBoost.h"
#include "CPlayer.h"
int CAttackBoost::GetAmount()
{
return Amount;
}
void CAttackBoost::Use()
{
ReduceCnt();
CPlayer::GetInst()->IncreaseDamage(Amount);
}
공격력 증가 포션을 사용하게되면 Item 클래스의 ReduceCnt 함수를 통해 아이템 갯수를 감소하고, Player 클래스의 IncreaseDamage 함수를 통해 공격력을 증가시킴
#include "CItem.h"
class CMonsterLeather
: public CItem
{
public:
CMonsterLeather(string _Name, int _Cnt) : CItem(_Name, _Cnt) { SetPrice(5); }
virtual void Use() override;
};
MonsterLeather 클래스가 Item 클래스를 상속받게 하여 이름, 아이템 갯수, 가격에 대한 정보를 갖도록 함
- 기타아이템 느낌으로 추가한 아이템
- 상점에서 팔지않고 드롭 아이템으로만 얻을 수 있음
#include "CMonsterLeather.h"
void CMonsterLeather::Use()
{
//can not use
}
몬스터 가죽은 사용할 수 없음
void CStartStage::StartScene()
{
string PlayerID;
CPlayer* Player = CPlayer::GetInst(); // 플레이어 싱글톤 객체 호출
WelcomeMessage(); // 게임 시작 로고 출력
printf(" Please type your PlayerID and Press Enter \n");
printf(" ( alphabet and numbers / 10 characters or less ) \n");
printf(" ");
// 플레이어 ID 입력
do
{
PlayerID = GetInputID();
} while (PlayerID == "");
// 플레이어 ID 저장
Player->SetName(PlayerID);
printf(" \n");
printf(" Press Space Bar to Start! \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
}
GetInputID함수로 플레이어 아이디를 입력받고 규칙에 맞는 아이디가 입력되면 플레이어 아이디로 저장함
string CStartStage::GetInputID()
{
int cnt = 0; // 입력받은 문자 갯수
string ID = ""; // 입력받은 문자들
std::regex e("[a-zA-Z0-9]+"); // 영문자와 숫자만 입력받기 위한 정규표현식
while (1)
{
// ID의 최대 길이가 넘어갈때 초기화하고 다시 입력받음
if (cnt > CPlayer::GetInst()->GetMaxNameLength()) // ID의 최대길이는 10
{
PressAgainIDPart();
cnt = 0;
}
// getch()함수를 통해 문자하나 입력받음
char c = _getch();
// 기능키 정리
switch (c)
{
case 3: // press 'CTRL+C' exit
_exit(0);
case 13: // press 'ENTER'
return ID;
default:
break;
}
// 현재까지 받은 문자열에 뒤로 붙여줌
ID.push_back(c);
//if korean -> 2byte
if (_kbhit()) {
c = _getch();
ID.push_back(c);
}
//no alphabets and numbers
if(!std::regex_match(ID, e))
{
// 초기화하고 재입력
PressAgainIDPart();
cnt = 0;
ID = "";
continue;
}
// 입력받은 문자를 화면에 표시해주고 갯수를 늘려줌
printf("%c", c);
cnt++;
}
return ID;
}
// 화면을 모두지우고 다시 로고와 문구를 띄워줌
void CStartStage::PressAgainIDPart()
{
system("cls");
WelcomeMessage();
printf(" Please enter a word of 10 characters or less \n");
printf(" Using only alphabets and numbers \n");
printf(" ");
}
<conio.h> 헤더의 getch 함수로 키보드 입력을 받고, 입력된 키에 따라 각각 처리해줌