回合制PK小游戏
回合制PK小游戏
需要英雄,怪物,武器
一、武器类
1、abstractweapon.h
将武器类抽象化作为基类为派生类服务,这样要使用武器的话就只需要提供一个接口了
#pragma once//抽象武器类
#include<string>
using std::string;
class abstractweapon
{
public:
string weaponname;//名字
int basedamage;//伤害值
//武器的三个功能:基础伤害,暴击,吸血
virtual int getbasedemage()=0;//获取基础伤害值
virtual int getsucklood()=0;//吸血
virtual bool getcrit() = 0;//是否暴击
};
abstractweapon.cpp
#include "abstractweapon.h"
2、sword.h
创建一个剑类
#pragma once
#include"abstractweapon.h"//要包含抽象武器类的头文件
class sword:public abstractweapon//多态---要继承才行
{
public:
virtual int getbasedemage();//获取基础伤害值
virtual int getsucklood();//吸血
virtual bool getcrit();//是否暴击
sword();
};
sword.cpp
#include "sword.h"
int sword::getbasedemage()
{
return this->basedamage;//接收基础的伤害值
}
int sword::getsucklood()
{
return 0;//无法吸血
}
bool sword::getcrit()
{
return false;//无法暴击
}
sword::sword()//构造函数---初始化剑类
{
this->weaponname = "大宝剑";//武器名字
this->basedamage = 10;//武器的基础伤害值
}
3、knife.h
创建一个刀类
#pragma once
#include"abstractweapon.h"
class knife:public abstractweapon
{
public:
virtual int getbasedemage();//获取基础伤害值
virtual int getsucklood();//吸血
virtual bool getcrit();//是否暴击
//这把刀可以吸血,也可以暴击
int suckrate;//吸血率
int critrate;//暴击率
//用bool类型判断是否产生暴击
bool istrigger(int rate);
knife();//初始化这个类
};
knife.cpp
#include "knife.h"
int knife::getbasedemage()
{
return this->basedamage;//获取这把刀的基础伤害
}
int knife::getsucklood()
{
if (istrigger(suckrate))
{
return basedamage*2;//如果吸血,吸多少血量
}
return false;
}
bool knife::getcrit()
{
if (istrigger(critrate))
{
return true;
}
return false;
}
bool knife::istrigger(int rate)
{
int num = rand() % 100;//随机num(0~99)
if (num < rate)
{
return true;
}
return false;
}
knife::knife()
{
this->basedamage = 20;//基础伤害值
this->critrate = 20;//暴击率
this->suckrate = 20;//吸血率
this->weaponname = "刀";//武器的名字
}
二、怪物类
1、monster.h
#pragma once
#include<string>
using std::string;
class monster
{
public:
int atk;//攻击力
int def;//防御力
int hp;//血量
string name;//怪物的名字
monster();//初始化怪物属性
};
monster.cpp
#include "monster.h"
monster::monster()
{
this->atk = 110;
this->def = 60;
this->hp = 1000;
this->name = "杰顿";
}
三、英雄类
1、hero.h
#pragma once
#include"abstractweapon.h"//英雄要使用武器,所以要包含头文件
#include<string>
using std::string;
class hero
{
public:
int atk;//攻击
int def;//防御值
int hp;//血量
string name;//名字
abstractweapon* weapon;//武器,包含武器类
//装备武器,看使用什么武器
void equipweapon(abstractweapon* weapon);
hero();
};
hero.cpp
#include "hero.h"
void hero::equipweapon(abstractweapon * weapon)
{
this->weapon = weapon;//第二个weapon就是你要传进来的武器指针地址
this->atk += weapon->getbasedemage();//这个就是计算,你装备了武器之后,你的攻击力提高到了多少
}
hero::hero()//初始化英雄类
{
this->atk = 100;
this->def = 50;
this->hp = 900;
this->weapon = NULL;//最开始是没有装备武器的
this->name = "杰克";
}
四、管理类
这个是最重要的,创建一个新的类来管理英雄,武器,怪物
1.manage.h
#pragma once
#include"hero.h"
#include"knife.h"
#include"monster.h"
#include"sword.h"
#include<iostream>
#include<time.h>//因为前面吸血率,暴击率使用了随机数
using std::cout;
using std::cin;
using std::endl;
#define DELE_BOJ(p) {if(p!=NULL){delete p;p=NULL;}}
class manage
{
hero* Hero;//创建英雄类指针
monster* Monster;//创建怪物类指针
public:
manage();
~manage();//因为new了对象,要释放内存,加一个析构函数
void initgame();//初始化游戏
void updatagame();//刷新游戏
private://加在私有属性下面,因为这些功能不需要让使用者知道
void select();//选择对武器的使用
void heroattack();//英雄攻击
void monsterattack();//怪物攻击
};
manage.cpp
#include "manage.h"
manage::manage()
{
Hero = NULL;
Monster = NULL;//最开始,让两个指针为空
}
manage::~manage()
{
DELE_BOJ(Hero);
DELE_BOJ(Monster);//释放内存
}
void manage::initgame()
{
//new出两个对象,英雄和怪物
this->Hero = new hero;
this -> Monster = new monster;
//创建随机数种子
srand((unsigned)time(NULL));
}
void manage::updatagame()//刷新游戏
{
select();//选择使用武器否
getchar();//回车实现作用
while (1)
{
heroattack();//英雄攻击
if (this->Monster->hp <= 0)
{
printf("英雄%s剩余血量:%d\n", this->Hero->name.c_str(), this->Hero->hp);
printf("怪物%s剩余血量:%d\n", this->Monster->name.c_str(), this->Monster->hp);
cout << "英雄打死了怪物" << endl;
break;
}
printf("英雄%s剩余血量:%d\n", this->Hero->name.c_str(), this->Hero->hp);
printf("怪物%s剩余血量:%d\n", this->Monster->name.c_str(), this->Monster->hp);
monsterattack();
if (this->Monster->hp <= 0)
{
printf("英雄%s剩余血量:%d\n", this->Hero->name.c_str(), this->Hero->hp);
printf("怪物%s剩余血量:%d\n", this->Monster->name.c_str(), this->Monster->hp);
cout << "怪物打死了英雄" << endl;
break;
}
printf("英雄%s剩余血量:%d\n", this->Hero->name.c_str(), this->Hero->hp);
printf("怪物%s剩余血量:%d\n", this->Monster->name.c_str(), this->Monster->hp);
getchar();
system("pause");
}
getchar();
}
void manage::select()
{
int num = 0;
cout << "1不要武器\t2装备剑\t3装备刀" << endl;
cin >> num;
switch (num)
{
case 1:
this->Hero->weapon = NULL;//选1是没有武器的
cout << "你没有装备武器就上了" << endl;
break;
case 2:
this->Hero->equipweapon(new sword);//装备了剑
cout << "你装备武器[剑]" << endl;
break;
case 3:
this->Hero->equipweapon(new knife);//装备了刀
cout << "你装备武器[刀]" << endl;
default:
break;
}
}
void manage::heroattack()//英雄攻击怪物
{
//先初始化
int damage = 0;//伤害
int addhp = 0;//吸血量
bool iscrit = false;//是否暴击
if (this->Hero->weapon != NULL)//如果装备了武器
{
//看是否暴击
iscrit = this->Hero->weapon->getcrit();
//看能吸多少血
addhp = this->Hero->weapon->getsucklood();//吸血量
}
damage = this->Hero->atk;//英雄加上武器的伤害
if (iscrit)//如果暴击,造成的暴击效果
{
damage *= 2;
cout << "触发暴击,伤害翻倍" << endl;
}
if (addhp > 0)//吸血量大于0,造成的效果
{
this->Hero->hp += addhp;
cout << "吸取血量" << addhp << endl;
}
int truedamage = 0;//真实伤害,因为怪物还有防御值
truedamage = (damage - (this->Monster->def) )> 0 ?( damage - (this->Monster->def)) : 1;
//更新怪物的血量
this->Monster->hp -= truedamage;
printf("英雄%s:打了一下怪物:%s,怪物掉了%d血量\n", this->Hero->name.c_str(), this->Monster->name.c_str(), truedamage);
}
void manage::monsterattack()//怪物攻击英雄
{
int truedamage = ((this->Monster->atk - this->Hero->def) > 0) ? (this->Monster->atk - this->Hero->def) : 1;
this->Hero->hp -= truedamage;
printf("怪物%s:打了一下英雄:%s,英雄掉了%d血量\n", this->Monster->name.c_str(), this->Hero->name.c_str(), truedamage);
}