文章目录

  • 英雄
  • 怪物
  • 武器
    • 武器父类
    • 小刀
    • 屠龙刀
  • 开始游戏main函数
    • 编译运行:
    • 运行结果
  • 总结说明
    • 添加倚天剑实现多态

下面用多态实现一个回合制小游戏:

英雄

Hero.h

#ifndef __HERO_H__
#define __HERO_H__class Weapon;
class Monster;
class Hero
{public:Hero(/* args */);~Hero();std::string m_Name;int m_Atk;int m_Def;int m_Hp;Weapon *weapon;void EquipWeapon(Weapon *weapon);void Attack(Monster *binbin);
};#endif

Hero.cc

#include <iostream>
#include "Weapon.h"
#include "Monster.h"
#include "Hero.h"using namespace std;Hero::Hero(/* args */)
{this->m_Hp = 300;this->m_Atk = 50;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->getBaseDamage();//计算吸血addHp = this->weapon->getSuckBlood();//计算定神isHold = this->weapon->getHold();//计算暴击isCrit = this->weapon->getCrit();}if (isCrit) //暴击,伤害,加成{damage = damage * 2;cout << "触发暴击伤害: " << damage << endl;}if (isHold){cout << "武器触发定身效果。" << endl;}if (addHp > 0){cout << "触发吸血效果,英雄增加血量:" << 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;
}
Hero::~Hero()
{}

怪物

Monster.h

#ifndef __MONSTER_H__
#define __MONSTER_H__class Hero;
class Monster
{private:/* data */
public:Monster(/* args */);~Monster();int m_Hp;int m_Atk;int m_Def;int m_Hold;void Attack(Hero *hero);std::string m_Name;
};#endif

Monster.cc

#include <iostream>#include "Monster.h"
#include "Hero.h"using namespace std;Monster::Monster(/* args */)
{this->m_Hp = 200;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;}Monster::~Monster()
{}

武器

武器父类

Weapon.h

#ifndef __WEAPON_H__
#define __WEAPON_H__//抽象类
class Weapon
{public://  纯虚函数virtual int getBaseDamage() = 0;virtual int getSuckBlood() = 0;virtual bool getHold() = 0;virtual bool getCrit() = 0;virtual ~Weapon(){}std::string m_WeaponName; //武器名称int m_BaseDamage;         //基础伤害
};#endif

小刀

Knife.h

#ifndef __KNIFE_H__
#define __KNIFE_H__#include "Weapon.h"class Knife : public Weapon
{public:Knife();//子类要实现就不写成纯虚函数了virtual int getBaseDamage();virtual int getSuckBlood();virtual bool getHold();virtual bool getCrit();
};#endif

Knife.cc

#include <iostream>
#include "Knife.h"//构造函数
Knife::Knife(){this->m_BaseDamage = 10;this->m_WeaponName = "小刀";
}
int Knife::getBaseDamage(){return m_BaseDamage;
}
int Knife::getSuckBlood(){return 0;
}
bool Knife::getHold(){return false;
}
bool Knife::getCrit(){return false;
}

屠龙刀

DragonSword.h

#ifndef __DRAGONSWORD_H__
#define __DRAGONSWORD_H__
#include "Weapon.h"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);};
#endif

DragonSword.cc

#include <iostream>
#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 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)
{int num = rand() % 100 + 1; // 1-100if (num < Rate){return true;}return false;
}

开始游戏main函数

playgame.cc

#include <iostream>
#include "Hero.h"
#include "Monster.h"
#include "Weapon.h"
#include "Knife.h"
#include "DragonSword.h"using namespace std;int main()
{//创建怪物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 << "赤手空拳干!" << endl;break;case 2:hero->EquipWeapon(kinfe);break;case 3:hero->EquipWeapon(dragon);break;default:break;}int round = 1;while (true){getchar();cout << "------当前为第 " << round << "回合------" << endl;//英雄和怪物互相攻击hero->Attack(monster);monster->Attack(hero);cout << "英雄剩余血量: " << hero->m_Hp << endl;cout << "怪物剩余血量: " << monster->m_Hp << endl;//英雄与怪物死亡判断if (hero->m_Hp <= 0){cout << "英雄死亡,游戏结束" << endl;break;}if (monster->m_Hp <= 0){cout << "怪物死亡,游戏结束" << endl;break;}round++;}//释放delete hero;delete monster;delete kinfe;delete dragon;
}

编译运行:

g++ playgame.cc Monster.cc Hero.cc DragonSword.cc Knife.cc -o play
./play

运行结果

总结说明

我们通过武器类实现多态,当我们要扩展武器的时候,只需要添加新武器类型,就可以使用新的武器。
比如添加一个倚天剑:

添加倚天剑实现多态

我的倚天剑继承屠龙刀属性和函数,所以我仅修改倚天剑的参数属性就可以了。

SkySword.h

#ifndef __SKYSWORD_H__
#define __SKYSWORD_H__
#include "DragonSword.h"class SkySword : public DragonSword
{public:SkySword();//继承了DragonSword的成员函数与变量//虚函数与普通函数区别就是用于多态。虚函数是用来重写进行多态的。也可以继承来使用。//纯虚函数则子类必须重写。};
#endif

SkySword.cc

#include <iostream>
#include "SkySword.h"SkySword::SkySword()
{this->m_BaseDamage = 30;this->m_WeaponName = "倚天剑";this->suckRate = 50;//吸血概率this->holdRate = 30;this->critRate = 50;//暴击概率
}

main函数中添加判断

 //创建怪物Monster *monster = new Monster;//创建英雄Hero *hero = new Hero;//创建武器Weapon *kinfe = new Knife;Weapon *dragon = new DragonSword;Weapon *skySword = new SkySword;cout << "选择一个武器:" << endl;cout << "1. 赤手空拳" << endl;cout << "2. 小刀" << endl;cout << "3. 屠龙刀" << endl;cout << "4. 倚天剑" << endl;int oper;cin >> oper;switch (oper){case 1:cout << "赤手空拳干!" << endl;break;case 2:hero->EquipWeapon(kinfe);break;case 3:hero->EquipWeapon(dragon);break;case 4:hero->EquipWeapon(skySword);break;default:break;}

C++学习笔记 —— 回合制小游戏案例相关推荐

  1. (蔡坤 VS 吴凡)java实现回合制小游戏开发

    (蔡坤 VS 吴凡)java实现回合制小游戏开发 首先定义属性(get set 有参,无参) 代码如下 java package com.jie; import java.util.Random; c ...

  2. C#面向对象总结小项目之实现英雄联盟回合制小游戏(文字版)

    完成模拟英雄联盟1V1对战的回合制文字游戏 具体要求如下: 英雄初始没有学习技能,也没有装备 英雄每回合可以 1 选择学习⼀个技能[每个英雄最多学习4个技能] 或给学过的技能升⼀级[每个技能最⾼3级, ...

  3. Unity学习笔记-切水果小游戏第一发

    楼主学习Unity的时间有限,每天最多能抽出1小时看看,主要还是周末的时间了. 最近打算开发几个小游戏练练手.最简单的水果忍者就被我相中了,来吧,骚年,一起来一发. 先分析下切水果的几个要点: 1)手 ...

  4. Web前端学习笔记——JavaScript之面向对象游戏案例:贪吃蛇

    面向对象游戏案例:贪吃蛇 案例相关源码以上传到 GitHub :https://github.com/lipengzhou/new-snake 案例介绍 游戏演示 在线演示地址:贪吃蛇 案例目标 游戏 ...

  5. c语言循环写回合制小游戏_告别黑框框——用C语言Easyx图形库实现图形界面

    很早以前就接触到了Easyx图形库,当时感叹还有这么简单的C图形库供我们使用.后开用Easyx做过推箱子.图形界面钢琴等等简单的小游戏.今天给大家介绍一下Easyx图形库. Easyx图形库是针对C+ ...

  6. c语言循环写回合制小游戏_【资源】60个C语言项目源码免费领取!

    序言 今天的资源特意是为大三.大四的童鞋准备的, 整理了一波有关于C语言开发的游戏.系统.效果.小项目的源码!!源码!!源码!! 小编之前发过一波毕业项目的资源, 还没有获取的伙伴,直接申请进群就能获 ...

  7. 韩顺平 javascript教学视频_学习笔记17_js超级玛丽小游戏

    采用面向对象思想设计超级马里奥游戏人物 怎么用通过按键,来控制图片的位置 这个小游戏,用面向对象会很方便,不用面向对象会很麻烦很麻烦,比如以后要讲解的坦克大战的游戏,要是用纯的面向过程或函数式的方式写 ...

  8. c语言 回合制小游戏,一个回合制小游戏的设计笔记

    发在这的目的: 1.做个记录 2.与人交流讨论 场景:二维方格组成的场景,一个格子里只能有一个单位,每个单位都会占据自己的格子. 行为:每个回合里,每个单位都有一定的行为点数,单位的任何行为都需要消耗 ...

  9. Unity学习笔记[一] RollBall小游戏

    目录 一.适配vs 二.初识Unity 2.1 unity核心模块 2.2 Unity基本操作和场景操作 2.3 世界坐标系和局部坐标系 2.4 工具栏 QWER 三.基础知识 3.1 基本组件 3. ...

  10. 回合制小游戏(英文)

    #include<bits/stdc++.h> #include<windows.h> using namespace std;void color(int n)//颜色 {S ...

最新文章

  1. 超时流式处理 - 没有消息流入的数据异常监控
  2. 超时,重试,熔断,限流
  3. SpringMVC拦截器HandlerInterceptor使用
  4. Linux中shell变量作用域笔记
  5. 2017.4.16 幂次方 思考记录
  6. 怎么把arraylist集合的值放在实体类的属性了_原创 | 使用JPA实现DDD持久化-O/R映射元数据:类级映射-实体和值对象...
  7. bootstrap modal弹出框实现及实现按钮点击复制功能
  8. win7查找计算机图片,win7电脑图片查看器丢失了的修复教程
  9. 维盟路由器pppoe服务配置(价值80元的帖子)
  10. 相对定位(relative)和绝对定位(absolute)的区别
  11. 多种多样的Photoshop 的撤消命令
  12. android脚本实现自动捉妖,一起来捉妖自动秒杀脚本下载-一起来捉妖自动秒杀辅助 最新版_爱下手机站...
  13. 如何制作地图符号的实验报告
  14. 透视映客半年报:亏损背后的长期价值
  15. html调用手机NFC,如何使用手机上NFC的功能
  16. 全球首富贝索斯宣布辞职!“我不想一直盯着流量,要用更多时间探索太空”...
  17. 常用linux命令(摘自他人笔记)
  18. GNU Radio系列教程(二):初级篇之GNU Radio介绍
  19. Java 线程池等待队列问题
  20. 关于dojo的dialog和form的最佳用法

热门文章

  1. 关于pr(premier)2020不能使用beat edit的解决方法
  2. 前端可视化的四种方式
  3. 每日新闻丨阿里巴巴香港IPO指引价每股176港元左右;全球超级计算机500强榜单出炉...
  4. STM8系列芯使用STVP烧写程序设定读保护和如何解除读保护操作
  5. java 单点_java实现单点登录的两种方式
  6. java 随机生成六位数的密码 (000001-999999)
  7. matlab中适应度函数怎么编写,matlab常用的几个适应度评价函数
  8. 51单片机的交流电流检测系统设计(程序+原理图+PCB)
  9. 微信+html5+播放音频+自动播放,html5音频实现微信语音播放效果
  10. 正弦交流电的最大值、有效值、和瞬间值概念解析和计算