
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 함수들도 만들었다.
조금씩 여러 함수들을 읽고 쓰는 것에 익숙해지고 있는 것 같다.(본인 느낌)
과제 진행 사항 중 수정 사항 확인 및 타 클래스와 상호작용 이상유무 확인
디자인 패턴 복습