C++_DOS命令下_猫狗大战小游戏(初识QT小练习)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++_DOS命令下_猫狗大战小游戏(初识QT小练习)相关的知识,希望对你有一定的参考价值。

最近马上就要学习QT了,在此复习一下C++一些基本的知识。即:封装,继承,多态。还有this,new,delete,namespace等关键字的用法。

IDE:QT creator 2.8.0

操作系统:windows XP

游戏介绍:游戏才用回合制,相互“伤害”,血量为0或者为负值的一方战败,游戏结束。

              在血量>=%80时,  其战斗力系数为  1       防御力系数为 1

              在血量>=%60时,  其战斗力系数为  0.75  防御力系数为 0.7

              在血量>=%40时,  其战斗力系数为  0.5    防御力系数为  0.6

              在血量<%40时,    其战斗力系数为  3!(俗话说:狗急了跳墙就是这个道理!)

 

战斗双方各有一下属性:名字,血量,防御力,战斗力。

下面建立Monster类:

class Monster
{
   /* 基本属性 */
   string   m_szName;  // 名字
   int      m_dHP;     // 血量
   int      m_dAP;     // 防御力
   int      m_dDP;     // 攻击力
   int      flag;
public :
   /* 含参构造器 */
   Monster(string m_szName,int m_dHP,int m_dAP,int m_dDP);
   /* 实现计算伤害方法 */
   virtual int attack(Monster &m)=0;
   /* 回合制攻击 */
   void fight(Monster &m);
   /* 显示属性 */
   void show();

   /* 获得方法 */
   string getName()const
   {
       return m_szName;
   }
   double getHP()const
   {
       return m_dHP;
   }
   double getAP()const
   {
       return m_dAP;
   }
   double getDP()const
   {
       return m_dDP;
   }
   /*设置方法*/
   void setHP(int HP)
   {
       m_dHP = HP;
   }
   void setAP(int AP)
   {
       m_dAP = AP;
   }
   void setDP(int DP)
   {
       m_dDP = DP;
   }
   void setFlag(int flag)
   {
       flag = flag;
   }
   double getFlag()const
   {
       return flag;
   }
};

下面是最重要的环节,书写attack和fight方法

我们都玩过游戏,在回合制游戏中,有的人伤害会爆炸,出现成倍的伤害,下面就在attack函数中实现伤害的倍数随机。

int Cat::attack(Monster &m)
{
    // 完成功能:
    // 1. 计算伤害
    int iHurt = 0;
    int min = 2,max = 8;
    srand((unsigned)time(NULL));
    int num = rand()%(max-min) + min;
    iHurt = num * getAP() - m.getDP()+ 5.0;
    if (iHurt < 1)
        iHurt = 1;
    // 2. 减少受攻击怪物的血量
    m.setHP(m.getHP() - iHurt);
    // 3. 描述怪物攻击的过程
    cout << "怪物:" << getName() << "  用爪子抓怪物: " << m.getName() << endl;
    cout << "怪物:" << m.getName() << "  血量减少: " << iHurt << " HP" << endl;
    return 0;
}

实现原理:用srand,rand函数随机出2 - 8 的一个数,作为倍击伤害的倍数,这样就可以达到倍击伤害的效果。

猫的攻击方式是用 爪子去抓对方,狗的attack方式类似,只不过它攻击的方式是用嘴了,为了方便,攻击方式用cout输出文字介绍。

随着血量的减少,攻击力和防御力也会减少,但是在血量低于%40的时候,会暴怒,就像DNF的狂战,血量低的时候攻击力爆表,下面来实现这个功能。

fight方法:

int Cat::fight(Monster &m)
{
    cout << m.getFlag()<< endl;
    int num = 0; // 记录战斗回合数
    while (1)
    {
        // 回合制攻击
        // 首先A攻击B,B血量减少,检查B的血量
        Sleep(1000);
        num++;
        cout << "第 " << num <<" 回合" << endl;
        attack(m);
        if (m.getHP() < 0)
        {
            cout << m.getName() <<"死亡,战斗结束" << endl;
            cout << "双方战斗了:" << num << " 回合" << endl;
            break;
        }
        if (m.getHP() >= m.getFlag()*0.8)
        {
            m.setAP(m.getAP()*1);
            m.setDP(m.getDP()*1);
        }
        else if (m.getHP() <= m.getFlag()*0.8 && m.getHP() >= m.getFlag()*0.6)
        {
            m.setAP(m.getAP()*0.7);
            m.setDP(m.getDP()*0.75);
        }
        else if (m.getHP() <= m.getFlag()*0.6 && m.getHP()>= m.getFlag()*0.4)
        {
            m.setAP(m.getAP()*0.6);
            m.setDP(m.getDP()*0.5);
        }
        else
        {
            m.setAP(m.getAP()*3);
            m.setDP(m.getDP()*0.4);
        }
        // 其次B攻击A,A血量减少,检查A的血量
        m.attack(*this);
        if (getHP() < 0)
        {
            cout << getName() << "死亡,战斗结束" << endl;
            cout << "双方战斗了:" << num << " 回合" << endl;
            break;
        }
        if (this->getHP() >= this->getFlag()*0.8)
        {
            this->setAP(m.getAP()*1);
            this->setDP(m.getDP()*1);
        }
        else if (this->getHP() <= this->getFlag()*0.8 && this->getHP() >= this->getFlag()*0.6)
        {
            this->setAP(this->getAP()*0.7);
            this->setDP(this->getDP()*0.75);
        }
        else if (this->getHP() <= this->getFlag()*0.6 && this->getHP()>= this->getFlag()*0.4)
        {
            this->setAP(this->getAP()*0.6);
            this->setDP(this->getDP()*0.5);
        }
        else
        {
            this->setAP(this->getAP()*3);
            this->setDP(this->getDP()*0.4);
        }
        cout << "猫的攻击力:" << this->getAP() << endl;
        cout << "狗的攻击力:" << m.getAP() << endl;
    }
    return 0;

}

为了简便,项目中使用了默认的含参构造器,直接生成两个对象“叮当猫”,“旺财”去战斗。

    Cat c("叮当猫",10000,400,600);
    Dog d("旺财",8000,500,800);
    c.fight(d);

测试:

技术分享

技术分享

 

到此,这个小游戏就基本完成了,里面需要用到 <time.h> <windows.h>等头文件里的某几个函数。

通过这个小项目复习了一下C++的特点,收获不少,巩固了自己的C++的语言基础,相信在以后的QT的学习中,会有更大的进步。

 

以上是关于C++_DOS命令下_猫狗大战小游戏(初识QT小练习)的主要内容,如果未能解决你的问题,请参考以下文章

猫狗大战

“猫狗大战”的代码能实现单一图片识别吗?

P1489 猫狗大战

vijos1153猫狗大战

洛谷P1489 猫狗大战

luogu P1489 猫狗大战