最近立刻就要學習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的學習中,會有更大的進步。