c++(多态)一个游戏中有多种怪物(Monster),怪物之间可能要发生战斗(fight),每场战斗都是一个怪物与另一怪物之间的一对一战斗。

一个游戏中有多种怪物(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;

}

“等一人邂逅,绘一城烟火,只愿一世逍遥。
惜一人白首,忆一城永恒,只愿岁月静好。”

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值