C++_DOS命令下_貓狗大戰小遊戲(初識QT小練習)

最近立刻就要學習QT了,在此複習一下C++一些基本的知識。即:封裝,繼承,多態。還有this,new,delete,namespace等關鍵字的用法。windows

IDE:QT creator 2.8.0函數

操做系統:windows XP學習

遊戲介紹:遊戲才用回合制,相互「傷害」,血量爲0或者爲負值的一方戰敗,遊戲結束。測試

              在血量>=%80時,  其戰鬥力係數爲  1       防護力系數爲 1this

              在血量>=%60時,  其戰鬥力係數爲  0.75  防護力系數爲 0.7spa

              在血量>=%40時,  其戰鬥力係數爲  0.5    防護力系數爲  0.6操作系統

              在血量<%40時,    其戰鬥力係數爲  3!(俗話說:狗急了跳牆就是這個道理!)對象

 

戰鬥雙方各有一下屬性:名字,血量,防護力,戰鬥力。blog

下面創建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的學習中,會有更大的進步。

相關文章
相關標籤/搜索