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