학습일지/C와 C++

C/C++ 전직

Tsukino Ren 2026. 3. 10. 22:49

전직 및 전투시스템

// Actor.h

#pragma once
#include <iostream>
#include <string>

class Actor
{
protected:
    Actor(std::string jobname, int level, int hp, int mp, int atk, int def, int speed)
        : jobname(jobname), Level(level), HP(hp), MP(mp), ATK(atk), DEF(def), Speed(speed)
    {
    }

public:
    virtual void attack(Actor& target) = 0;
    virtual ~Actor() {}

    std::string getjobname();
    int getLevel();
    int getHP();
    int getMP();
    int getATK();
    int getDEF();
    int getSpeed();

    void setHP(int HP);
    void setMP(int MP);
    void setATK(int ATK);
    void setDEF(int DEF);
    void setSpeed(int Speed);

protected:
    std::string jobname;
    int Level;
    int HP;
    int MP;
    int ATK;
    int DEF;
    int Speed;

 

// Actor.cpp

#include "Actor.h"

std::string Actor::getjobname()
{
	return jobname;
}
int Actor::getLevel()
{
	return Level;
}
int Actor::getHP()
{
	return HP;
}
int Actor::getMP()
{
	return MP;
}
int Actor::getATK()
{
	return ATK;
}
int Actor::getDEF()
{
	return DEF;
}
int Actor::getSpeed()
{
	return Speed;
}

void Actor::setHP(int HP)
{
	this->HP = HP;
}
void Actor::setMP(int MP)
{
	this->MP = MP;
}
void Actor::setATK(int ATK)
{
	this->ATK = ATK;
}
void Actor::setDEF(int DEF)
{
	this->DEF = DEF;
}
void Actor::setSpeed(int Speed)
{
	this->Speed = Speed;
}
  • Actor 클래스로 모든 살아있는 생명체의 뼈대
  • Actor 클래스로 Player와 Monster로부터 파생된 모든 클래스의 부모 클래스

Actor 후손 Player 클래스

// Player.h

#pragma once
#include "Actor.h"
#include <iostream>
#include <string>

class Player : public Actor
{
protected:
    Player(std::string nickname,
        std::string job,
        int hp,
        int mp,
        int atk,
        int def,
        int acc,
        int speed)
        : Actor(job, 1, hp, mp, atk, def, speed),
        nickname(nickname),
        ACC(acc)
    {
    }

public:
    virtual void attack(Actor& target) = 0;
    virtual ~Player() {}
    void PlayerStatus();

    std::string getnickname();
    int getACC();

    void setnickname(std::string nickname);
    void setACC(int ACC);

protected:
    std::string nickname;
    int ACC;
};

 

// Player.cpp

#include "Player.h"
using namespace std;

std::string Player::getnickname()
{
    return nickname;
}

int Player::getACC()
{
    return ACC;
}

void Player::setnickname(std::string nickname)
{
    this->nickname = nickname;
}

void Player::setACC(int ACC)
{
    this->ACC = ACC;
}

void Player::PlayerStatus()
{
    std::cout << "==================================" << std::endl;
    std::cout << "닉네임 : " << nickname << std::endl;
    std::cout << "직업 : " << jobname << std::endl;
    std::cout << "레벨 : " << Level << std::endl;
    std::cout << "HP : " << HP << std::endl;
    std::cout << "MP : " << MP << std::endl;
    std::cout << "ATK : " << ATK << std::endl;
    std::cout << "DEF : " << DEF << std::endl;
    std::cout << "ACC : " << ACC << std::endl;
    std::cout << "Speed : " << Speed << std::endl;
    std::cout << "==================================" << std::endl;
}
  • 대부분의 필요한 DNA들은 유전받고 추가적인 부분만 변이 파생해서 추가됨
  • Actor 에서 받아온 기본 정보를 토대로 필요한 정보를 추가한 클래스
// Warrior.h

#pragma once
#include "Player.h"
class Warrior :
    public Player
{
public:
    Warrior(std::string nickname);

    virtual void attack(Actor& target) override;
};
-----------------------------------------------------
// Archer.h

#pragma once
#include "Player.h"
class Archer :
    public Player
{
public:
    Archer(std::string nickname);

    virtual void attack(Actor& target);
};
-----------------------------------------------------
// Magician.h

#pragma once
#include "Player.h"
class Magician :
    public Player
{
public:
    Magician(std::string nickname);

    virtual void attack(Actor& target) override;
};
-----------------------------------------------------
// Thief.h

#pragma once
#include "Player.h"
class Thief :
    public Player
{
public:
    Thief(std::string nickname);

    virtual void attack(Actor& target) override;
};
// Warrior.cpp

#include "Warrior.h"

Warrior::Warrior(std::string nickname)
	: Player(nickname, "전사", 2000, 200, 400, 10, 100, 100)
{
}

void Warrior::attack(Actor& target)
{
	int damage = this->ATK - target.getDEF();
	if (damage <= 0)
	{
		damage = 1;
	}
	int hp = target.getHP() - damage;
	target.setHP(hp);
	
	std::cout << "\n" << nickname << "님이 검을 휘둘러 공격하였습니다.\n" << std::endl;
}
-----------------------------------------
// Archer.cpp

#include "Archer.h"

Archer::Archer(std::string nickname)
	: Player(nickname, "궁수", 1200, 1000, 500, 1, 300, 200)
{
}

void Archer::attack(Actor& target)
{
	int damage = this->ATK - target.getDEF();
	if (damage <= 0)
	{
		damage = 1;
	}
	int hp = target.getHP() - damage;
	target.setHP(hp);
	std::cout << "\n" << nickname << "님이 활 시위를 당겻습니다.\n" << std::endl;
}
-----------------------------------------
// Magician.cpp

#include "Magician.h"

Magician::Magician(std::string nickname)
	: Player(nickname, "마법사", 200, 2000, 600, 1, 200, 100)
{
}

void Magician::attack(Actor& target)
{
	int damage = this->ATK - target.getDEF();
	if (damage <= 0)
	{
		damage = 1;
	}
	int hp = target.getHP() - damage;
	target.setHP(hp);
	std::cout << "\n" << nickname << "님이 파이어볼 주문을 외웠습니다..\n" << std::endl;
}
-----------------------------------------
// Thief.cpp

#include "Thief.h"

Thief::Thief(std::string nickname) 
	: Player(nickname, "도적", 1200, 1000, 450, 2, 200, 200)
{
}

void Thief::attack(Actor& target)
{
	int damage = this->ATK - target.getDEF();
	if (damage <= 0)
	{
		damage = 1;
	}
	int hp = target.getHP() - damage;
	target.setHP(hp);
	std::cout << "\n" << nickname << "님이 표창을 던졋습니다.\n" << std::endl;
}
  • Actor 할아버지의 DNA를 이어받은 Player 의 DNA를 이어받은 생명체들이다.
  • Actor -> Player -> Warrior , Archer .... 등등 클래스이다.
// Monster.h

#pragma once
#include "Actor.h"
#include <iostream>
#include <string>

class Monster : public Actor
{
protected:
    Monster(std::string name,
        std::string jobname,
        int level,
        int hp,
        int mp,
        int atk,
        int def,
        int speed)
        : Actor(jobname, level, hp, mp, atk, def, speed),
        name(name)
    {
    }

public:
    virtual ~Monster() {}
    void MonsterStatus();

    std::string getname();
    void setname(std::string name);

protected:
    std::string name;
};
// Monster.cpp

#include "Monster.h"

using namespace std;

std::string Monster::getname()
{
	return name;
}


void Monster::setname(std::string name)
{
	this->name = name;
}


void Monster::MonsterStatus()
{
	std::cout << "==================================" << std::endl;
	std::cout << "종족 : " << name << std::endl;
	std::cout << "직업 : " << jobname << std::endl;
	std::cout << "레벨 : " << Level << std::endl;
	std::cout << "HP : " << HP << std::endl;
	std::cout << "MP : " << MP << std::endl;
	std::cout << "ATK : " << ATK << std::endl;
	std::cout << "DEF : " << DEF << std::endl;
	std::cout << "Speed : " << Speed << std::endl;
	std::cout << "==================================" << std::endl;
}
  • Actor로 부터 파생된 클래스로 Player 와는 다른 Monster 클래스
// Ork.h

#pragma once
#include "Monster.h"

class Ork :
    public Monster
{
public:
    Ork();

    virtual void attack(Actor& target) override;
};
// Ork.cpp

#include "ork.h"

Ork::Ork()
	: Monster("오크", "오크 전사", 13, 5000, 0, 20, 60, 50)
{
}

void Ork::attack(Actor& target)
{
	int damage = this->ATK - target.getDEF();
	if (damage <= 0)
	{
		damage = 1;
	}
	int hp = target.getHP() - damage;
	target.setHP(hp);
	std::cout << "\n오크 전사의 몽둥이 휘두르기 강타!\n" << std::endl;

}
  • Monster 클래스로부터 DNA를 이어받아 형체가 완성된 Ork 클래스
  • Actor -> Monster -> Ork 구조

  • 이런식으로 반복 턴제가 되겠다.

개선 및 배운점과 느낀점

  • include <ctime> , rend() 100% 를 사용해 회피를 구현했다.
  • 처음 Player 와 Monster 가 부모 클래스 없이 개별 클래스라 어떻게 서로 공격하고 피해를 받나 햇다가 방법을 모르겟어서 그냥 부모 클래스를 만들어버렷다.
  • 부모 클래스 추가 후 자꾸 attack()가 이상한데 연결되길래 구글링을 통해 해결법을 찾다보니 부모클래스에 있는 내용이 자식클래스에 같이 있어서 문제가 생긴거라는걸 배웠다.
  • 다음에 만들땐 첫 설계구간에서 큰틀을 정해두고 시작해야겟다

 

'학습일지 > C와 C++' 카테고리의 다른 글

C++ RPG 전투 시스템 구현 과제  (0) 2026.03.11
C++ 복사 생성자와 오버로딩  (0) 2026.03.11
C/C++ Class  (0) 2026.03.09
C++ Console IO  (0) 2026.03.08
C/C++ 지금까지 배운 C 문법 활용해보기!  (0) 2026.03.06