最近马上就要学习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的学习中,会有更大的进步。