내일배움캠프-언리얼

[내일배움캠프 - 언리얼] DAY 13 - 간단한 직업(클래스) 만들기 - 2

이시보 2025. 12. 15. 18:18

Monster.h

#pragma once
#include "Player.h"
#include <string>
using namespace std;

class Monster {
public:
    Monster(string name);  // 생성자

    // 몬스터의 공격 함수
    void attack(Player* player);

    // 몬스터의 속성값을 리턴하는 get 함수
    string getName();
    int getHP();
    int getPower();
    int getDefence();
    int getSpeed();

    // 몬스터의 속성값을 정의하는 set 함수
    void setName(string name);
    bool setHP(int HP);
    void setPower(int power);
    void setDefence(int defence);
    void setSpeed(int speed);

protected:
    string name; // 몬스터의 이름
    int HP; // 몬스터의 HP
    int power; // 몬스터의 공격력
    int defence; // 몬스터의 방어력
    int speed; // 몬스터의 스피드
};

 

Monster.cpp

#include "Monster.h"
#include <iostream>

Monster::Monster(string name) {
    setName(name);
    setHP(10);
    setPower(30);
    setDefence(10);
    setSpeed(10);
}

void Monster::attack(Player* player) {
    int damage = 0;
    damage = getPower() - player->getDefence();  // - 몬스터의 공격력 - 플레이어의 방어력을 데미지로 정의합니다.
    if (damage <= 0) damage = 1;  // - 만약 위에서 계산한 데미지가 0 이하라면, 데미지를 1로 정의합니다.
    cout << "* " << getName() << "(이)가 " << player->getNickname() << "에게 " << damage << "만큼의 피해를 주었습니다." << endl;  // - 플레이어에게 얼마나 데미지를 입혔는지 출력합니다.
    if (player->setHP(player->getHP() - damage)) {  // - setHP에서 리턴 받은 생존 여부를 기준으로 분기문이 실행됩니다.
        cout << "* " << player->getNickname() << "의 남은 HP : " << player->getHP() << endl;  // - 생존했을 경우, 플레이어의 남은 HP만 출력합니다.
    }
    else {  // - 생존하지 못했을 경우, 플레이어의 남은 HP와 몬스터의 승리 문구를 출력합니다.
        cout << "* " << player->getNickname() << "의 남은 HP : " << player->getHP() << endl;
        cout << "* " << getName() << "(이)가 승리하였습니다!" << endl;
    }
}

string Monster::getName() { return name; }
int Monster::getHP() { return HP; }
int Monster::getPower() { return power; }
int Monster::getDefence() { return defence; }
int Monster::getSpeed() { return speed; }

void Monster::setName(string name) { this->name = name; }
bool Monster::setHP(int HP) { this->HP = HP; if (this->HP > 0) return true; else { this->HP = 0; return false; } }
void Monster::setPower(int power) { this->power = power; }
void Monster::setDefence(int defence) { this->defence = defence; }
void Monster::setSpeed(int speed) { this->speed = speed; }

Player 클래스에 monster 공격 추가

class Monster;
 
virtual void attack(Monster* monster) = 0;

직업 클래스에 monster 공격 구현 (전사 예시)

void Warrior::attack(Monster* monster) {
    int damage = 0;
    damage = getPower() - monster->getDefence();  // - 플레이어의 공격력 - 몬스터의 방어력을 데미지로 정의합니다.
    if (damage <= 0) damage = 1;  // - 만약 위에서 계산한 데미지가 0 이하라면, 데미지를 1로 정의합니다.
    cout << "* " << getNickname() << "(이)가 " << monster->getName() << "에게 대검으로 " << damage << "만큼의 피해를 주었습니다." << endl;  // - 몬스터에게 얼마나 데미지를 입혔는지 출력합니다.
    if (monster->setHP(monster->getHP() - damage)) {  // - setHP에서 리턴 받은 생존 여부를 기준으로 분기문이 실행됩니다.
        cout << "* " << monster->getName() << "의 남은 HP : " << monster->getHP() << endl;  // - 생존했을 경우, 몬스터의 남은 HP만 출력합니다.
    }
    else {  // - 생존하지 못했을 경우, 몬스터의 남은 HP와 플레이어의 승리 문구를 출력합니다.
        cout << "* " << monster->getName() << "의 남은 HP : " << monster->getHP() << endl;
        cout << "* " << getNickname() << "(이)가 승리하였습니다!" << endl;
    }

궁수, 도적의 공격 방식 변경 (도적 예시)

for (int i = 0; i < 5; i++) {
        cout << "* " << getNickname() << "(이)가 " << monster->getName() << "에게 단검으로" << damage << "만큼의 피해를 주었습니다." << endl;  // - 몬스터에게 얼마나 데미지를 입혔는지 출력합니다.
        if (monster->setHP(monster->getHP() - damage)) {  // - setHP에서 리턴 받은 생존 여부를 기준으로 분기문이 실행됩니다.
            cout << "* " << monster->getName() << "의 남은 HP : " << monster->getHP() << endl;  // - 생존했을 경우, 몬스터의 남은 HP만 출력합니다.
        }
        else {  // - 생존하지 못했을 경우, 몬스터의 남은 HP와 플레이어의 승리 문구를 출력합니다.
            cout << "* " << monster->getName() << "의 남은 HP : " << monster->getHP() << endl;
            cout << "* " << getNickname() << "(이)가 승리하였습니다!" << endl;
            break;
        }
    }