cpp虚函数作业

#include <iostream>
#include <utility>
#include <random>

class 怪物 {
public:
  std::string 名字;
  int 生命值;
  int 攻击力;

  explicit 怪物(std::string &名字, int 生命值, int 攻击力)
    : 生命值(生命值), 攻击力(攻击力), 名字(名字) {}

};

class 英灵 {
protected:
  std::string 名字;
  int 生命值;
  int 攻击力;
  double 命中率;
  double 暴击率;
  double 暴击倍率;
  std::default_random_engine 随机数生成器;
  std::bernoulli_distribution 命中;
  std::bernoulli_distribution 暴击;
public:
  explicit 英灵(std::string &名字, int 生命值, int 攻击力, double 命中率, double 暴击率, double 暴击倍率)
    : 名字(std::move(名字)), 生命值(生命值), 攻击力(攻击力), 命中率(命中率), 暴击率(暴击率), 暴击倍率(暴击倍率) {
    随机数生成器.seed(time(nullptr));
    命中生成器();
    暴击生成器();
  }
  void 命中生成器() {
    命中 = std::bernoulli_distribution(命中率);
  }
  void 暴击生成器() {
    暴击 = std::bernoulli_distribution(暴击率);
  }
  void 显示伤害(std::string &对手名字, int 扣血量) {
    std::cout << 名字 << "对" << 对手名字 << "造成" << 扣血量 << "点伤害" << std::endl;
  }
  virtual void 攻击怪物(怪物 &) = 0;
};

class 法阶 : public 英灵 {
protected:
  int 法术加成;
public:
  explicit 法阶(std::string &名字, int 生命值, int 攻击力, double 命中率, double 暴击率, double 暴击倍率, int 法术加成)
    : 英灵(名字, 生命值, 攻击力, 命中率, 暴击率, 暴击倍率), 法术加成(法术加成) {}

  void 攻击怪物(怪物 &) override {

    int 扣血量 = 0;
    if (命中(随机数生成器)) {
      扣血量 = 攻击力 + 法术加成;
      if (暴击(随机数生成器)) {
        扣血量 = (int) (扣血量 * 暴击倍率);
      }
    }.生命值 -= 扣血量;
    显示伤害(.名字, 扣血量);
  };
};

class 弓阶 : public 英灵 {
protected:
  int 物理加成;
public:
  explicit 弓阶(std::string &名字, int 生命值, int 攻击力, double 命中率, double 暴击率, double 暴击倍率, int 物理加成)
    : 英灵(名字, 生命值, 攻击力, 命中率, 暴击率, 暴击倍率), 物理加成(物理加成) {}

  void 攻击怪物(怪物 &) override {
    int 扣血量 = 0;
    if (命中(随机数生成器)) {
      扣血量 = 攻击力 + 物理加成;
      if (暴击(随机数生成器)) {
        扣血量 = (int) (扣血量 * 暴击倍率);
      }
    }.生命值 -= 扣血量;
    显示伤害(.名字, 扣血量);
  };
};

int main() {
  auto 盖提亚 = new 怪物(*new std::string("盖提亚"), 10000, 0);
  auto 卫宫士郎 = new 弓阶(*new std::string("卫宫士郎"), 100, 120, 0.8, 0.3, 1.2, 90);
  auto 梅林 = new 法阶(*new std::string("梅林"), 100, 100, 0.6, 0.5, 1.2, 200);
  while (盖提亚->生命值 > 0) {
    卫宫士郎->攻击怪物(*盖提亚);
    梅林->攻击怪物(*盖提亚);
  }
  delete (盖提亚);
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值