본캠프 24일차_팀 과제 2일차_캐릭터 Class 생성

YU YEON WON·2025년 9월 5일

1. 오늘 배운 내용(키워드)

15조에 속한 나는 <텍스트 RPG 만들기> 팀 과제에서 캐릭터 클래스 생성을 맡았다. 캐릭터 클래스 - 이 게임의 주인공 객체를 생성하는 것이다.
여태까지 배우고 만들었던 과제에서 다루었던 코드로 각 기능을 구현하는 것이 목표이다. 게임 매니저(게임 시스템 관리) 클래스는 팀장님이 나머지 몬스터, 상점, 아이템 클래스는 다른 팀원분들과 나눠 맡아서 진행하였다. 어제부터 클래스 생성을 하고 세부 내용(변수, 함수)를 작성하였다.
특히, 팀 프로젝트를 하면서 소통이 많이 필요하게 되었다.
다음과 같은 이유로 팀원분들과 많은 소통이 필요하다.

  • 변수, 함수명 통일
  • 각 클래스와 상호작용을 하기위한 함수에 대한 정보 공유
  • 각 클래스를 참조할 때 주의사항 등

나는 아래와 같이 캐릭터 클래스를 만들었다.

#pragma once
#include <string>
#include <vector>
using namespace std;

class Item;

class Character
{
private:

	Character();
	Character(string name);

	static Character* instance;
	string name;
	int level;
	int HP;
	int maxHP;
	int attack;
	int experience;
	int gold;
	vector <item*> inventory; //아이템 클래스 전방선언

public:

먼저 캐릭터에서 사용하는 변수를 선언하였다.
그리고 생성자도 만들었다.
생성자가 프라이빗에 있는 이유는 디자인 패턴 중 싱글톤 방식에 따라 캐릭터 클래스의 인스턴스를 오직 하나만 생성하도록 보장하고, 전역적으로 접근할 수 있는 방식이다.
레벨, 체력, 최대체력 등과 경험치, 골드, 아이템 인벤토리 등을 선언하였다.

public:

	Character(const Character&) = delete; //복사 생성자 삭제하여 복사 방지
	Character& operator=(const Character&) = delete; //대입 연산자 삭제하여 대입 방지

	static Character* Getinstance(string = "");
	void Displaystatus();
	void Levelup();
	void UseItem(int index);
	void Addgold(int amount);
	void Spendgold(int amount);
	void Takedamage(int damage);
	bool Isdead() const;

	//getter
	string Getname();
	int Getlevel();
	int GetHP();
	int GetmaxHP();
	int Getattack();
	int Getexperience();
	int Getgold() const;

	//setter
	void Setname(string name);
	void Setlevel(int level);
	void SetHP(int HP);
	void SetmaxHP(int maxHP);
	void Setattack(int attack);
	void Setexprience(int experience);
	void Setgold(int gold);
};

위와 같이 캐릭터 클래스의 퍼블릭 부분에는 첫번째로 디자인패턴 싱글톤 방식을 이용하기 위해 복사 생성자, 대입 연산자 생성 방지 함수를 넣었다.
그 밑으로는 캐릭터에 대한 정보와 상호작용을 위해 필요한 함수들을 선언하였다.

  • 상태표시
  • 레벨업
  • 아이템사용
  • 골드 얻기
  • 골드 쓰기
  • 피격 데미지
  • 사망 여부

그리고 변수들을 가져오고 설정하는 Get, Set 함수들을 작성하였다.

#include "Character.h"
#include <iostream>
using namespace std;

Character::Character()
{
	name = "Player";
	level = 1;
	HP = 200;
	maxHP = 200;
	attack = 30;
	experience = 0;
	gold = 15;
}

Character::Character(string name)
{
	this->name = name;
	this->level = 1;
	this->HP = 200;
	this->maxHP = 200;
	this->attack = 30;
	this->experience = 0;
	this->gold = 15;
}

cpp파일에는 위와 같이 캐릭터 생성자를 만들었다. 기본 생성자와 이름이 입력됐을 때 생성자를 만들었다.
'기본레벨 1, HP 200, 최대HP 200, 공격력 30, 경험치 0, 골드 15' 캐릭터가 생성된다.

Character* Character::Getinstance(string name)
{
	if (instance == nullptr)
	{
		instance = new Character(name);
	}
	return instance;
}
Character* Character::instance = nullptr;

void Character::Levelup() // 레벨업 할 경우 능력치 상승 및 체력 100% 회복
{
	if (level < 10)
	{
		if (experience == 100)
		{
			this->level += 1;
			this->maxHP += (level * 20);
			this->HP += this->maxHP;
			this->attack += (level * 5);
			this->experience = 0;
		}
	}
	else
	{
		cout << "최대 레벨에 도달했습니다." << '\n';
	}

}

싱글톤 디자인패턴에 대한 함수와 레벨업에 대한 함수를 작성하였다. 그 다음에 레벨이 10까지로 과제에 명시되어 있어 10까지로만 레벨업 가능하도록 if문으로 작성하였다. 경험치가 100이 되면 레벨업을 하는 상황을 만들었다.

void Character::UseItem(int index)
{
	inventory[index]->Use(); // 아이템 사용
	cout << inventory[index]->Getname() << " 아이템을 사용했습니다. \n";

	delete inventory[index];
	inventory[index] = nullptr;
}

void Character::Addgold(int amount) // 골드 증가 
{
	if (amount > 0)
	{
		gold += amount;
		cout << "골드를 얻었습니다." << amount << " 현재 골드 : " << gold << '\n';
	}
}

void Character::Spendgold(int amount) // 골드 감소
{
	if (amount > 0)
		gold -= amount;
	cout << "골드를 소비하였습니다. " << amount << " 남은 골드 : " << gold << '\n';
}

void Character::Takedamage(int damage) // 캐릭터가 데미지 받는 함수
{
	if (damage <= 0) // 음수 데미지 방지
	{
		return;
	}
	// 데미지 적용
	HP -= damage;
	cout << name << "이(가)" << damage << "만큼의 데미지를 받았다." << '\n';
}

bool Character::Isdead() // 사망 여부 확인을 위한 함수
{
	if (HP <= 0)
	{
		HP = 0;
		return true; // 사망시 트루
	}
	else
	{
		return false; // 생존시 폴스
	}
}

아이템 사용과 골드증가/감소 함수를 만들었다. 그리고 데미지를 받았을 때 상황과 사망 상황에 대한 함수를 구현하였다.

void Character::Displaystatus() // 캐릭터 상태
{
	cout << "---------Statsus---------" << '\n';
	cout << " 이름 : " << name << '\n';
	cout << "Lv. : " << level << '\n';
	cout << "HP / 최대HP : / " << HP << " / " << maxHP << '\n';
	cout << "공격력 : " << attack << '\n';
	cout << "경험치 : " << experience << '\n';
	cout << "보유 골드 : " << gold << '\n';
	cout << "" << '\n'; // 아이템 보유 현황
	cout << "=========================" << '\n';
}

캐릭터 상태를 보여주는 함수도 만들어 플레이어가 캐릭터의 상황을 볼 수 있도록 하였다.

// getter 함수
string Character::Getname()
{
	return string();
}

int Character::Getlevel()
{
	return level;
}

int Character::GetHP()
{
	return HP;
}

int Character::GetmaxHP()
{
	return maxHP;
}

int Character::Getattack()
{
	return attack;
}

int Character::Getexperience()
{
	return experience;
}

int Character::Getgold() const
{
	return gold;
}


//setter 함수
void Character::Setname(string name)
{
	this->name = name;
}

void Character::Setlevel(int level)
{
	this->level = level;
}

void Character::SetHP(int HP)
{
	this->HP = HP;
}
void Character::SetmaxHP(int maxHP)
{
	this->maxHP = maxHP;
}

void Character::Setattack(int attack)
{
	this->attack = attack;
}

void Character::Setexprience(int experience)
{
	this->experience += experience; // 경험치 누적
}

void Character::Setgold(int gold)
{
	this->gold = gold;
}

각 변수들을 불러오거나 설정할 수 있는 get, set 함수들도 만들었다.

2. 느낀점

조금씩 여러 함수들을 읽고 쓰는 것에 익숙해지고 있는 것 같다.(본인 느낌)

3. 차주 학습 할 것

과제 진행 사항 중 수정 사항 확인 및 타 클래스와 상호작용 이상유무 확인
디자인 패턴 복습

profile
🕹️🎮🍱✈️📸 안녕하세요! 게임개발에 도전하고 있습니다!

0개의 댓글