Unreal Track 1기 [25.01.15] - TextRPG(3)

chooha·2025년 1월 15일

TIL

목록 보기
21/60

< 아이템 구현 >

1. Item

▸ CItem.h

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 가상함수를 통해서 각 아이템마다 사용효과를 적용해야 함

▸ CItem.cpp

#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++;
}

2. Health Potion

▸ CHealthPotion.h

#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 클래스를 상속받게 하여 이름, 아이템 갯수, 가격에 대한 정보를 갖도록 하고, 체력 회복량을 정해줬음

▸ CHealthPotion.cpp

#include "CHealthPotion.h"
#include "CPlayer.h"

int CHealthPotion::GetAmount()
{
	return Amount;
}

void CHealthPotion::Use()
{
	ReduceCnt();
	CPlayer::GetInst()->Heal(Amount);
}

체력 회복 포션을 사용하게되면 Item 클래스의 ReduceCnt 함수를 통해 아이템 갯수를 감소하고, Player 클래스의 Heal 함수를 통해 체력을 증가시킴


3. Attack Boost

▸ CAttackBoost.h

#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 클래스를 상속받게 하여 이름, 아이템 갯수, 가격에 대한 정보를 갖도록 하고, 공격력 증가량을 정해줬음

▸ CAttackBoost.cpp

#include "CAttackBoost.h"
#include "CPlayer.h"

int CAttackBoost::GetAmount()
{
	return Amount;
}

void CAttackBoost::Use()
{
	ReduceCnt();
	CPlayer::GetInst()->IncreaseDamage(Amount);
}

공격력 증가 포션을 사용하게되면 Item 클래스의 ReduceCnt 함수를 통해 아이템 갯수를 감소하고, Player 클래스의 IncreaseDamage 함수를 통해 공격력을 증가시킴


4. Monster Leather

▸ CMonsterLeather.h

#include "CItem.h"

class CMonsterLeather
	: public CItem
{
public:
	CMonsterLeather(string _Name, int _Cnt) : CItem(_Name, _Cnt) { SetPrice(5); }
	virtual void Use() override;
};

MonsterLeather 클래스가 Item 클래스를 상속받게 하여 이름, 아이템 갯수, 가격에 대한 정보를 갖도록 함
- 기타아이템 느낌으로 추가한 아이템
- 상점에서 팔지않고 드롭 아이템으로만 얻을 수 있음

▸ CMonsterLeather.cpp

#include "CMonsterLeather.h"

void CMonsterLeather::Use()
{
	//can not use
}

몬스터 가죽은 사용할 수 없음


< ID 입력 구현 >

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 함수로 키보드 입력을 받고, 입력된 키에 따라 각각 처리해줌


< 체크 포인트 >

키보드입력 함수

0개의 댓글