前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】PK游戏(玩转多态)

【C++】PK游戏(玩转多态)

作者头像
后端码匠
发布2022-12-05 09:21:55
3460
发布2022-12-05 09:21:55
举报
文章被收录于专栏:后端码匠

0x1 【C++】PK游戏(玩转多态)

0x11 简介

本案例为多态应用; 武器类属性:基础伤害、特效(吸血、定身、暴击);屠龙刀:吸血、定身、暴击的几率

小刀:无任何能力

英雄:攻击力、防御、血量、武器、装备武器、攻击怪物

怪物:攻击力、防御、血量、攻击英雄

核心算法:通过isTrigger判断是否触发特效 系统随机产生 1~100的数字(例如传进来一个30,然后产生一个随机数,如果这个随机数在1-30之间,则触发特效)

0x12 代码实现(h)

0x121 Dragonsword.h

代码语言:javascript
复制
//
// Created by 24607 on 2022/11/10.
//

#ifndef TEST_DRAGONSWORD_H
#define TEST_DRAGONSWORD_H

#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);
};


#endif //TEST_DRAGONSWORD_H

0x122 Hero.h

代码语言:javascript
复制
//
// Created by 24607 on 2022/11/10.
//

#ifndef TEST_HERO_H
#define TEST_HERO_H
#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);//攻击怪物
};

#endif //TEST_HERO_H

0x123 Knife.h

代码语言:javascript
复制
//
// Created by 24607 on 2022/11/10.
//

#ifndef TEST_KNIFE_H
#define TEST_KNIFE_H
#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();

};

#endif //TEST_KNIFE_H

0x124 Monster.h

代码语言:javascript
复制
//
// Created by 24607 on 2022/11/10.
//

#ifndef TEST_MONSTER_H
#define TEST_MONSTER_H
#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);

};

#endif //TEST_MONSTER_H

0x125 Weapon.h

代码语言:javascript
复制
//
// Created by 24607 on 2022/11/10.
//

#ifndef TEST_WEAPON_H
#define TEST_WEAPON_H


#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; //基础伤害
};

#endif //TEST_WEAPON_H

0x13 实现部分(cpp)

0x131 Dragonsword.cpp

代码语言:javascript
复制
//
// Created by 24607 on 2022/11/10.
//

#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;
}

//通过isTrigger判断是否触发特效
//随机 1~100的数字
//(例如传进来一个30,然后产生一个随机数,如果这个随机数在1-30之间,则触发特效)
bool DragonSword::isTrigger(int rate) {
    int num = rand() % 100 + 1;//产生随机数1-100
    if (num < rate) {
        return true;
    }
    return false;
}

0x132 Hero.cpp

代码语言:javascript
复制
//
// Created by 24607 on 2022/11/10.
//

#include "Hero.h"

Hero::Hero() {
    this->m_Hp = 500;//血量

    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;
}

0x133 Knife.cpp

代码语言:javascript
复制
//
// Created by 24607 on 2022/11/10.
//

#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;
}

0x134 Monster.cpp

代码语言:javascript
复制
//
// Created by 24607 on 2022/11/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;
}

0x135 主函数调用部分

代码语言:javascript
复制
#include <iostream>

#define _CRT_SECURE_NO_WARNINGS

#include "Hero.h"
#include "Monster.h"
#include "Weapon.h"
#include "Knife.h"
#include "DragonSword.h"
#include <ctime>

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;
    }

    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;

}

/**
 * pk游戏(玩转多态)
 *
 * @return
 */
int main() {
    srand((unsigned int) time(NULL));
    play();
    system("pause");
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端码匠 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x1 【C++】PK游戏(玩转多态)
    • 0x11 简介
      • 0x12 代码实现(h)
        • 0x121 Dragonsword.h
        • 0x122 Hero.h
        • 0x123 Knife.h
        • 0x124 Monster.h
        • 0x125 Weapon.h
      • 0x13 实现部分(cpp)
        • 0x131 Dragonsword.cpp
        • 0x132 Hero.cpp
        • 0x133 Knife.cpp
        • 0x134 Monster.cpp
        • 0x135 主函数调用部分
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档