⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpg.cpp

📁 一个C++RPG游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<iostream.h>
#include<time.h>
#include<stdlib.h>
enum propte {sw,ar,mg};
class container//人物的小包裹,用来装东西的....目前只装两种物品~有兴趣的可以自己加点东西进去`嘿嘿~
{
 friend class player;//定义一个基类
 friend class Swordsman;//定义一个剑士
 friend class Archer;//定义一个弓剑手
 friend class Mage;//定义一个魔法师,其实我们以前玩的都是这样做的~只要把这些类附给一个人物身上就行了
 friend void ShowWindows(player &p1,player &p2);//显示框框~当前状态的函数
protected:
 int NumHeal;//生命回复剂
 int NumMgWorter;//魔法恢复剂
public:
    container ();//构造函数,....目前可有可无的样子~~
 bool IsNumHealEmpoty();//判断还有没有生命恢复剂
 bool IsMWEmpoty();//判断还有没有魔法恢复剂
 void display();//显示当前还有多少魔法恢复剂和生命恢复剂
};
container::container()
{
 NumHeal = 0;
 NumMgWorter = 0;
}
bool container::IsNumHealEmpoty()
{
 return NumHeal == 0?true:false;
}
bool container::IsMWEmpoty()
{
 return NumMgWorter == 0?true:false;
}
void container::display()
{
 cout << "还剩下回复剂(HP+100) " << NumHeal << "个" << endl;
 cout << "还剩下魔法剂 (MP+80) " << NumMgWorter << "个" << endl;
}
 

class player//人物的基类
{
 friend class Swordsman;
 friend class Archer;
 friend class Mage;//这些都是朋友关系~又是父与子的关系~- -! 好象有点复杂的样子~
 friend void ShowWindows(player &p1,player &p2);//上面已经说过了~不再重复
 
protected:
 int Hp,HpMax,Mp,MpMax,speed,Ap,Dp,EXP,LV;//最大血量和最大魔法值,当前血量,魔法值,等等~望文生意
 char name[10];//人物名称
    propte role;//人物职业类型
 bool death ;//是否死亡函数
 container bag;//人物的小包包~~^^
public:
 void IsDead();//判断人物是否死亡
 bool Dead();//确认人物当前死亡状态~有返回值哦~
 bool UseHeal();//好累...不过还是继续打字~ 使用生命回复剂
 bool UseMW();//....跟上面差不多~
 void Getbag(player &p);//如果电脑死亡....就拿走他的小包包里面的东西~
 void Shourole();//显示当前人物的职业~....这个是额外的函数~乱写的~
 void HpMpfull();//每打完一关敌人~HP,MP全满~
 virtual bool attack(player &p) = 0;
 virtual bool TSattack(player &p) = 0;
 virtual void IsLvUp() = 0;//上面三个都是纯虚函数~分别代表 人物的普通攻击~特殊攻击和是否升级
};

void player::HpMpfull()
{
 Hp = HpMax;
 Mp = MpMax;
}
void player::IsDead()
{
 if (Hp <= 0 )
 {
  death = 1;
 }
}
bool player::Dead()
{
 return death == 1? true:false;
}
bool player::UseHeal()
{
 if ( !bag.IsNumHealEmpoty() )
 {
  Hp +=100;
  bag.NumHeal --;
  cout << name << "使用了恢复剂,生命值恢复了100点" << endl;
  if (Hp > HpMax)
  {
   Hp = HpMax;
  }
  return true;
 }
 else 
 {
  cout << "没有回复剂了 " << endl;
  return false;
 }
}
bool player::UseMW()
{
 if ( !bag.IsMWEmpoty() )
 {
  Mp += 80;
  bag.NumMgWorter --;
  cout << name << "使用了魔法恢复剂,魔法值恢复了80点" << endl;
  if (Mp > MpMax)
  {
   Mp = MpMax;
  }
  return true;
 }
 else
 {
  cout << "没有魔法恢复剂了~" << endl;
  return false;
 }
}
void player::Getbag(player &p)
{
 cout << name << "获得了对方物品" << endl;
    cout << "获得了回复剂 " << p.bag.NumHeal << "个" << endl;
    cout << "获得了魔法回复剂 " << p.bag.NumMgWorter << "个" << endl;
    bag.NumHeal += p.bag.NumHeal;
 bag.NumMgWorter += p.bag.NumMgWorter;
}
void player::Shourole()
{
 switch(role)
 {
 case sw:
  cout << "职业:剑士" << endl;
  break;
 case ar:
  cout << "职业:弓箭手" << endl;
  break;
 case mg:
  cout << "职业:魔法师" << endl;
  break;
 }
}

class Swordsman:public player//从基类派生出的一个类,是关于剑士的~
{
  
public:
    Swordsman(int i, char *chname)//构造函数~赋予当前人物的属性值
 {
  role = sw;
  int j;
  for (j=0; j<10; j++)
  {
   name[j] = chname[j];
  }
  Hp = 150 + 8 * (i - 1);
  HpMax = 150 + 8 * (i - 1);
  Mp = 80 + 3 * (i - 1);
  MpMax = 80 + 3 * (i - 1);
  Ap = 25 + 4 * (i - 1);
  Dp = 25 + 4 * (i - 1);
  speed = 25 + 2 * (i - 1);
  LV = i;
  death = 0;
  EXP = 0;
  bag.NumHeal = i * 5;
  bag.NumMgWorter = i * 5;
 }
 bool attack(player &p);//剑士的普通攻击
 bool TSattack(player &p);//特殊攻击
 void IsLvUp();//判断下是否升级
 void AI(player &p);//规定了电脑只能是剑士..当然~如果要电脑是其他角色就要写多点代码~可惜我比较懒..
};

bool Swordsman::attack(player &p)
{
 int Hphit;
 int EXPhit;
 cout  << name << "攻击" << endl;
 srand(time(NULL));
 int j = rand()%100;
 if (speed >= p.speed && j <= 25)
 {
  cout << "挥着大剑向敌人砍去" << endl;
        cout << "会心一击" << endl;
  Hphit = p.Hp;
  p.Hp = p.Hp - (Ap + j%10 + 10 - p.Dp) * 2 + 2 * (LV - 1);
        cout << "直接命中敌人脑门,顿时鲜血四溅" << endl;
  cout << "敌人损失Hp " << Hphit - p.Hp << endl;
  EXPhit = EXP;
  EXP += Hphit - p.Hp;
  cout << name <<"获得经验 " << EXP - EXPhit << endl;
  p.IsDead();
  return true;
 }
 else if(speed <= p.speed && (j >25 || j <=50) )
 {
  cout << "拿着剑摇摇晃晃的朝敌人砍去。。。" << endl;
        cout << "敌人躲避" << endl;
  return true;
 }
 else if(j < 100 && j > 50)
 {
  cout << "挥剑向敌人砍去" << endl;
  Hphit = p.Hp;
  p.Hp = p.Hp - (Ap + j%10 + 5 - p.Dp) + 2 * (LV - 1);
        cout << "命中敌人" << endl;
  cout << "敌人损失Hp " << Hphit - p.Hp << endl;
  EXPhit = EXP;
  EXP += Hphit - p.Hp;
  cout << name << "获得EXP " << EXP - EXPhit << endl;
  p.IsDead();
  return true;
 }
 else
  return false;
}
bool Swordsman::TSattack(player &p)
{
 srand( time(NULL) );
 int j = rand()%100;
 int Hphit;
 int EXPhit;
 if ( Mp >= 50 )
 {
  cout << "万剑诀" << endl;
  Mp -= 40;
  if (j <= 49 || j >= 60)
  {
   cout << "完全命中目标 " << endl;
            cout << "敌人完全吸收了伤害" << endl;
   Hphit = p.Hp;
   p.Hp = p.Hp - (Ap + j/10 + 10 - p.Dp) * 3 + 2 * ( LV -1);
   cout << "敌人损失Hp " << Hphit - p.Hp << endl;
   EXPhit = EXP;
   EXP += Hphit - p.Hp;
   cout << "获得EXP " << EXP - EXPhit << endl;
   p.IsDead();
   return true;
  }
  else
  {
            cout << "敌人无意中的躲避, 躲开攻击" << endl;
            cout << "攻击无效" << endl;
   return true;
  }
 }
 else
 {
  cout << "魔法不足! " << endl;
     return false;
 }
}
void Swordsman::IsLvUp()
{
 if (EXP >= LV * LV * 75)
 {
  EXP -= LV * LV * 75;
  ++LV;
  HpMax = 150 + 8 * (LV -1);
  MpMax = 80 + 3 * (LV -1);
  Ap += 3;
  Dp += 3;
  speed += 4;
  cout << " 恭喜,"<< name <<"升级了~~ " << " 等级为" << LV << endl;
 }
}
void Swordsman::AI(player &p)
{
 int Hphit;
 srand( time(NULL) );
 int j = rand()%100;
 if (Hp <= 70 && j <=90 && !bag.IsNumHealEmpoty() )
 {
  cout << "敌人使用了回复剂,体力恢复了100点 " << endl;
  Hp +=100;
  bag.NumHeal --;
  if ( Hp > HpMax )
  {
   Hp = HpMax;
  }
 }
 else if ( (Mp>=50 && j<=80) || (p.Hp<=75 && Mp>=50 && j<=50) )
 {
  cout << "敌人的特殊攻击(还没想好- -!) " << endl;
  Mp -= 40;
  if ( speed <= p.speed && (j >= 20 || j <= 30) )
  {
            cout << p.name << "无意中的走位 " << endl;
   cout << p.name << "躲开了敌人攻击无效 " << endl;
  }
  else
  {
   cout << p.name << "受到猛烈冲击 " << endl;
   Hphit = p.Hp;
   p.Hp -= (Ap + j%10 + 10  - p.Dp) * 2 + 2 * (LV - 1);
   cout << p.name << "损失Hp " << Hphit - p.Hp << endl;
   p.IsDead();
  }
 }
    else if (Mp < 50 && j <=40 && !bag.IsMWEmpoty() )
 {
     cout << "敌人使用魔法剂,魔法值恢复了80点~ " << endl;
  Mp += 80;
  bag.NumMgWorter --;
  if (Mp > MpMax)
  {
   Mp = MpMax;
  }
 }
 else  
 {
  cout << "敌人的普通攻击 " << endl;
  if ( j <= 25 && speed <= p.speed )
  {
   cout << p.name << " 躲开攻击 " << endl;
  }
  else
  {
   cout << p.name <<"受到伤害 " << endl;
   Hphit = p.Hp;
   p.Hp -= (Ap + j%10 + 10 - p.Dp) + (LV - 1);
   cout << "损失Hp " << Hphit - p.Hp << endl;
   p.IsDead();
  }
 }
}
 
class Archer:public player//差不多拉~只是数值和绝招要改改~其他的没什么了~只是少了个AI电脑智能函数
{
public:
    Archer(int i, char *chname)
 {
  role = ar;
  int j;
  for (j=0; j<10; j++)
  {
   name[j] = chname[j];
  }
  Hp = 150 + 8 * (i - 1);
  HpMax = 150 + 8 * (i - 1);
  Mp = 80 + 3 * (i - 1);
  MpMax = 80 + 3 * (i - 1);
  Ap = 25 + 4 * (i - 1);
  Dp = 25 + 4 * (i - 1);
  speed = 25 + 2 * (i - 1);
  LV = i;
  death = 0;
  EXP = LV * LV * 75;
  bag.NumHeal = i * 5;
  bag.NumMgWorter = i * 5;
 }
 bool attack(player &p);
 bool TSattack(player &p);
 void IsLvUp();
};
bool Archer::attack(player &p)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -