标签:
最近马上就要学习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的学习中,会有更大的进步。
标签:
原文地址:http://www.cnblogs.com/zzuli-liuxin/p/5819609.html