一个游戏中有多种怪物(Monster),怪物之间可能要发生战斗(fight),每场战斗都是一个怪物与另一怪物之间的一对一战斗。每个怪物都有自己的生命值(hitpoint)、攻击力值(damage)和防御力值(defense),每种怪物都有各自特有的攻击(attack)方式,产生相应的攻击效果;战斗时,两个怪物依次攻击对方,即怪物a首先攻击怪物b, 然后轮到怪物b攻击怪物a, 之后,怪物a再次攻击怪物b,…, 直到一方生命值为0。
请根据你对上述描述的理解:
(1)定义并实现怪物类Monster,成员的设计可以包括数据成员hitpoint、damage和defense,以及其他任意需要的成员函数。要求包括一个纯虚函数attack,作为派生类对象各自实现攻击细节的接口;要求定义一个非虚的成员函数fight,用来描述与另外一个怪物进行战斗的过程,该函数的实现可为Monster类的任意派生类所复用(派生类不需重新定义及实现)。不必考虑怪物的生命值减少至0后如何处理。
猫进攻导致对方的生命值减少量:(猫的攻击力值— 对方的防御力值)
并且若上式小于1,则取1
狗进攻导致对方的生命值减少量:
(狗的攻击力值 — 对方的防御力值 +5 )*2
若上式小于2,则取2
(2)作为怪物的特例,猫和狗的攻击效果如下表所示。在Monster的基础上,以继承手段定义并实现这两个类。
(3)再增加其他派生类,如Cock类,自行定义进攻对方的生命值减少量。
自行设计并实现游戏的测试函数,输出相互攻击的实时生命力值,并给出胜负结果。
#include<iostream>
#include<cmath>
using namespace std;
class Monster
{
public:
Monster(int hit,int dam,int def)
{
hitpoint=hit;
damage=dam;
defense=def;
}
bool fight(Monster &other)
{
while(true)
{
attack(other);
if(other.GetHP()<=0)
return true;
other.attack(*this);
if(hitpoint<=0)return false;
}
}
virtual void attack(Monster &other)=0;
void ReduceHP(int harm)
{
hitpoint=hitpoint-harm;
if(hitpoint<0)
hitpoint=0;
}
int GetHP()const
{
return hitpoint;
}
int GetDamage()const
{
return damage;
}
int GetDefense()const
{
return defense;
}
protected:
int hitpoint;//生命值
int damage;//攻击力值
int defense;//防御力值
};
class Cat:public Monster
{
public:
Cat(int hit,int dam,int def):Monster(hit,dam,def)
{
}
virtual void attack(Monster &other)
{
int harm=damage*2-other.GetDefense();//harm代表生命值减少量
if(harm<1) harm=1;
other.ReduceHP(harm);
}
};
class Dog:public Monster
{
public:
Dog(int hit,int dam,int def):Monster(hit,dam,def)
{
}
virtual void attack(Monster &other)
{
int harm=(damage-other.GetDefense()+5)*2;
if(harm<2) harm=2;
other.ReduceHP(harm);
}
};
class Clock:public Monster
{
public:
Clock(int hit,int dam,int def):Monster(hit,dam,def)
{
}
virtual void attack(Monster &other)
{
int harm=(damage*2-other.GetDefense())*2;
if(harm<3)
harm=3;
other.ReduceHP(harm);
}
};
int main()
{
Dog d(100,10,7);
Cat c(120,8,9);
cout<<"DOG VS CAT"<<endl;
if(d.fight(c))
cout<<"DOG WIN"<<endl;
else cout<<"DOG LOSE"<<endl;
cout<<endl;
Clock e(15,5,3);
cout<<"Clock VS DOG"<<endl;
if(e.fight(d))
cout<<"Clock WIN"<<endl;
else cout<<"Clock LOSE"<<endl;
}
“等一人邂逅,绘一城烟火,只愿一世逍遥。
惜一人白首,忆一城永恒,只愿岁月静好。”