1. 我们 要实现打斗场景,第一,我们需要有打斗的双方,一个是英雄,一个是怪物,他们都有自己的属性,比如攻击,防御,血量。其次我们的英雄还会有武器。武器上有一些加成属性,可以帮英雄更好的打怪物,武器也有多种武器可以让英雄进行选择。

  2. 首先我们做武器类的声明,一个武器要有名称,还基础伤害,其次一些武器可能会有暴击,吸血,定身的效果,我们要对此进行判断。由于我们并不实现武器这个类,我们仅仅希望,后面的实现的武器继承他的属性并实现,所以我们武器类的属性都用纯虚函数来写。

    #pragma once
    #include<iostream>
    #include<string>
    using namespace std;//抽象类
    class Weapon
    {
    public://获取基础伤害virtual int getBaseDamage() = 0;//获取吸血virtual int getSuckBlood() = 0;//获取是否定身virtual bool getHold()=0;//获取是否暴击virtual bool getCrit() = 0;string m_WeaponName; //武器名称int m_BaseDamage;//基础伤害};
    
  3. 我们有了武器类,就可以细化做武器了,我们这里就做两个武器,一个是普通的小刀,另外一个是比较厉害的屠龙刀,我们先做小刀类的声明。小刀是武器,所以它要继承武器类的属性,并拥有自己的构造函数。虚函数可以实现动态多态

     #pragma once#include<iostream>#include"Weapon.h"#include<string>using namespace std;class Knife :public Weapon{public:Knife();//获取基础伤害virtual int getBaseDamage() ;//获取吸血virtual int getSuckBlood() ;//获取是否定身virtual bool getHold();//获取是否暴击virtual bool getCrit();};
    
  4. 有了小刀类的声明后,我们可以在类外实现小刀这个类,小刀没有别的属性,所以,我们只用在构造中,把"小刀"这个名字和基础攻击力赋值,然后获取攻击力的函数中,返回基础攻击力就可以。

     #include"Knife.h"Knife::Knife(){this->m_BaseDamage = 10;this->m_WeaponName = "小刀";}int Knife::getBaseDamage(){return this->m_BaseDamage;}int Knife::getSuckBlood(){return 0;}bool Knife::getHold(){return false;}bool Knife::  getCrit(){return false;}
    
  5. 我们声明屠龙刀类,屠龙刀依旧是继承武器类,此外,作为一个强大的武器,它还必须具有其他的属性,它还有吸血,暴击,和可以让怪物定身的能力,但是它的这些能力,并不是一定会触发,需要一些属性也就是概率来触发。

     #pragma once  //防止头文件重复编译#include<iostream>#include"Weapon.h"#include<string>using namespace std;class DragonSword :public Weapon{public:DragonSword();//获取基础伤害virtual int getBaseDamage();//获取吸血virtual int getSuckBlood();//获取是否定身virtual bool getHold();//获取是否暴击virtual bool getCrit();//吸血率,暴击率,定身率int SuckRate;int holdRate;int critRate;//传入概率 判断是否触发bool isTrigger(int rate);};
    
  6. 屠龙刀的实现:再构造中,把它的基本属性赋值,其他的属性,我们通过一个成员函数来判断是否触发特效,我们在构造中把触发特效的概率写出来,然后在判断概率函数中,设置一个随机数,如果这个随机数比概率小,则触发特效。

     #include"DragonSword.h"DragonSword::DragonSword(){this->m_BaseDamage = 20;this->m_WeaponName = "屠龙宝刀";this->SuckRate = 20;this->holdRate = 30;this->critRate = 35;}int DragonSword::getBaseDamage(){return this->m_BaseDamage;}int DragonSword::getSuckBlood(){if (isTrigger(SuckRate)){return  this->m_BaseDamage*0.5;    //按照武器基础伤害一半吸血}return 0;}bool DragonSword::getHold(){if (isTrigger(holdRate)){return true;}return false;}bool DragonSword::getCrit(){if (isTrigger(critRate)){return true;}return false;}bool DragonSword::isTrigger(int rate){//通过isTrigger判断是否触发特效//随机一个0~100的数字//rand()%100 是0~99之间的随机数 +1后是1~100之间的一个随机数//如果产生的随机数比设定的概率值小则发生,否则不发生int num = rand() % 100 + 1;if (num < rate){return true;}return false;}
    
  7. 有了武器后,我们声明英雄类,英雄除了基本属性外,还要判断是否有武器,有什么样的武器

     #pragma once#include<iostream>#include"Weapon.h"#include<string>#include"Monster.h"using namespace std;class Monster;class Hero{public:Hero();string m_Name;//人名int m_Atk;//攻击力int m_Def;//防御力int m_Hp;//血量Weapon * weapon;//武器void EquipWeapon(Weapon * weapon);void Attack(Monster * monster);};
    
  8. 英雄类的实现。

     #include"Hero.h"Hero::Hero(){this->m_Hp = 500;this->m_Atk = 45;this->m_Def = 50;this->m_Name = "刘法师";this->weapon = NULL;}//装备武器void  Hero::EquipWeapon(Weapon * weapon){this->weapon = weapon;cout << "英雄:" << this->m_Name << "装备了武器" <<  this->weapon->m_WeaponName  << endl;}void  Hero::Attack(Monster * monster){int damage = 0;int addHp = 0;bool isHold = false;bool isCrit = false;if (this->weapon == NULL) //武器为空,没有加成{damage = this->m_Atk;}else{//基础伤害damage = this->m_Atk + this->weapon->m_BaseDamage;//计算吸血addHp = this->weapon->getSuckBlood();//计算定身isHold = this->weapon->getHold();//计算暴击isCrit = this->weapon->getCrit();if (isCrit) //暴击 伤害加成{damage = damage * 1.5;cout << "英雄的武器触发了暴击效果,怪物受到了高额伤害,伤害值:" << damage << endl;}if (isHold){cout << "英雄的武器触发了定身效果,怪物停止攻击一回合" << endl;}if (addHp){cout << "英雄的武器触发了吸血效果,英雄" << this->m_Name << "的血量增加了" << addHp << endl;}}//设置怪物定身monster->m_Hold = isHold;//计算真实伤害int trueDamage = (damage - monster->m_Def) > 0 ? damage - monster->m_Def : 1;monster->m_Hp -= trueDamage;this->m_Hp += addHp;cout << "英雄" << this->m_Name << "攻击了敌人" << monster->m_Name << "造成了伤害" << trueDamage << endl;}
    
  9. 接下来我们就要声明怪物类,怪物里除了基本属性外,还有一些特殊属性,比如是否被定身。

     #pragma once#include<iostream>#include"Weapon.h"#include<string>#include"Hero.h"using namespace std;class Hero;class Monster{public:Monster();string m_Name;int m_Hp;int m_Atk;int m_Def;bool m_Hold;void Attack(Hero * hero);};
    
  10. 怪物类的实现

    #include"Monster.h"Monster::Monster()
    {this->m_Hp = 300;this->m_Atk = 70;this->m_Def = 40;this->m_Hold = false;this->m_Name = "比克大魔王";
    }void  Monster::Attack(Hero* hero)
    {if (this->m_Hold){cout << "怪物" << this->m_Name << "被定身了,本回合无法攻击" << endl;return;}//计算攻击的伤害int damage = (this->m_Atk - hero->m_Def ) > 0 ? this->m_Atk - hero->m_Def : 1;hero->m_Hp -= damage;cout << "怪物" << this->m_Name << "攻击了英雄" << hero->m_Name << "造成了伤害" << damage << endl;
    }
    
  11. 最后就是一个打斗的实现了

    #include<iostream>
    #include"Hero.h"
    #include"Monster.h"
    #include"Weapon.h"
    #include"Knife.h"
    #include"DragonSword.h"
    using namespace std;void play()
    {//创建怪物Monster * monster = new Monster;//创建英雄Hero *hero = new Hero;//创建武器Weapon * kinfe = new Knife;Weapon * dragon =new DragonSword;//让用户选择武器cout << "请选择武器:" << endl;cout << "1. 赤手空拳" << endl;cout << "2. 小刀" << endl;cout << "3. 屠龙刀" << endl;int oper;cin >> oper;switch (oper){case 1:cout << "你真牛X,你还是太年轻了" << endl;break;case 2:hero->EquipWeapon(kinfe);break;case 3:hero->EquipWeapon(dragon);break;default:cout << "没有你要选择的武器" << endl;break;}getchar();//输入缓冲区里有个回车,多获取一次值int round = 1;while (true){getchar();system("cls");cout << "--当前第" << round << "回合开始-----" << endl;if (hero->m_Hp <= 0){cout << "英雄" << hero->m_Name << "已挂,游戏结束" << endl;break;}hero->Attack(monster);if (monster->m_Hp <= 0){cout << "怪物" << monster->m_Name << "已挂,顺利通关" << endl;break;}monster->Attack(hero);if (hero->m_Hp <= 0){cout << "英雄" << hero->m_Name << "已挂,游戏结束" << endl;break;}cout << "英雄" << hero->m_Name << "剩余血量" << hero->m_Hp << endl;cout << "怪物" << monster->m_Name << "剩余血量" << monster->m_Hp << endl;round++;}delete monster;delete hero;delete kinfe;delete dragon;}
    

运行结果



《凡人修仙传》中打斗场景(c++多态实现)相关推荐

  1. 如何调整按钮里的文字的位置android_UI设计中按钮场景分析

    别无他话,今天就和大家聊一聊设计宿敌--按钮设计.按钮的设计看似简单,其实按钮的功能不同,设计形式上也会有差异,今天我就针对按钮的场景分析,对按钮进行全面的解析. 按照功能性分类,按钮主要包括行为召唤 ...

  2. 在SAP PI中建立场景

    在SAP PI中建立场景 如果需要在PI中建立场景(scenario),要从主页开始. 主页界面如下: 主页有以下四个工作区的超链接: 企业服务库(ESR) 集成目录(ID) 系统规划(SL) 配置和 ...

  3. Unity制作游戏中的场景

    Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...

  4. 所有库在门不显示封装_COB全天候通透屏,在商业显示中的场景应用

            一.COB集成封装LED显示产品已成为行业发展大势 从2015年开始行业就已经预测到COB集成封装就是未来LED显示领域户内外小间距的发展方向,在不同的文章上也可以看到这样的推论:&q ...

  5. PMCAFF微课堂 | 运营女神揭秘产品运营推广中的场景思维

    ▎报名方式:回复"报名"至PMCAFF公众账号(pmcaffcom),即可进入报名环节 ▎温馨提示:微课堂视频只限当晚哟! ▎上课地点 PMCAFF微课堂将在网站上开放在线教室供大 ...

  6. 3D场景中选取场景中的物体。

    杨航最近在学Unity3D 在一些经典的游戏中,需要玩家在一个3D场景中选取场景中的物体.例如<仙剑奇侠传>,选择要攻击的敌人时.为我方角色增加血量.为我方角色添加状态,通常我们使 ...

  7. 面试官系统精讲Java源码及大厂真题 - 35 经验总结:各种锁在工作中使用场景和细节

    35 经验总结:各种锁在工作中使用场景和细节 富贵必从勤苦得. 引导语 本章主要说一说锁在工作中的使用场景,主要以 synchronized 和 CountDownLatch 为例,会分别描述一下这两 ...

  8. 面试官系统精讲Java源码及大厂真题 - 25 整体设计:队列设计思想、工作中使用场景

    25 整体设计:队列设计思想.工作中使用场景 人生太短,要干的事太多,我要争分夺秒. --爱迪生 引导语 本章我们学习了 LinkedBlockingQueue.ArrayBlockingQueue. ...

  9. Unity中的场景切换

    Unity中的场景切换 与电影类似,一个游戏往往需要多个场景.而如果场景中资源较少,那么可以很快的完成切换,如果较多的话,可能需要十几秒时间.在这段时间内播放加载动画等等,可以减少玩家的不耐烦. 同步 ...

最新文章

  1. Python图像处理:形态学操作
  2. VC检测OLE控件是否已经注册,并注册它
  3. 快速排序 java 实现
  4. lucene源码分析(1)基本要素
  5. Windows上mount NFS V4
  6. matlab simulink 视频,使用 MATLAB 和 Simulink 让控制系统的开发更轻松
  7. C++——赫夫曼编码-译码器(Huffman Coding)
  8. ASP.NET中的数据绑定:哪个更快? (转)
  9. windows log日志分割_如何将日志记录到 Windows事件日志 中
  10. 虚拟机安装黑群晖_【群晖系统】HEI群辉DSM 6.2.1 系统安装图文教程 (19年2月)
  11. 关于腾讯云丢数据事件的一些看法
  12. 领导叫我要好好带新人。。。
  13. 《maven的学习》 尚硅谷Maven视频(maven零基础入门)B站
  14. Ununtu下安装搜狗拼音输入法
  15. 达梦 DCA 培训总结
  16. 如何提升邮箱邮件安全性,邮箱管理制度有哪些?
  17. Java三目运算符 (Ternary Operator ? :)
  18. pycharm python下载_PyCharm下载|PyCharm(Python开发工具) V2019.2 官方最新版 下载_当下软件园_软件下载...
  19. 【Python爬虫】MongoDB爬虫实践:爬取虎扑论坛
  20. 推荐一款超级好用的AI模型训练平台——Tesra超算网络!

热门文章

  1. perl 用网易发邮件报错 554 DT:SPM 163 smtp14
  2. linux ubuntu 关于vim得一些基本命令
  3. mysql基本命令入门
  4. Java基础知识学习04-自定义类、ArrayList集合
  5. 009-MailUtils工具类模板
  6. hihocoder-Week173--A Game
  7. DOM 基础 HTML标签 元素 属性
  8. So easy Webservice 1.Socket建设web服务
  9. (转)走进AngularJs(六) 服务
  10. CString 类型和引用