首页 > 代码库 > C++_DOS命令下_猫狗大战小游戏(初识QT小练习)

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小练习)