From 0ee0ee5bd720434fdbf911d70c8159975abd621a Mon Sep 17 00:00:00 2001 From: p68710245 Date: Wed, 24 Apr 2024 21:04:06 +0800 Subject: [PATCH] Add player_v1.cpp --- player_v1.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 player_v1.cpp diff --git a/player_v1.cpp b/player_v1.cpp new file mode 100644 index 0000000..0de314f --- /dev/null +++ b/player_v1.cpp @@ -0,0 +1,82 @@ +#include +#include +using std::cout, std::string, std::endl; + +class Player +{ +public: // 放了方便后续代码编写,暂时将基类数据设定为公有 + string name; + int attack, defence, HP; // 进攻 防御 生命 + +public: + Player(string _name, int _attack, int _defence, int _HP) + : name{_name}, attack{_attack}, defence{_defence}, HP{_HP} + { + } + void pk(Player &p) + { + while (HP > 0) + { + hit(p); + if (p.HP <= 0) + { + std::cout << p.name << "死亡!\n"; + return; + } + p.hit(*this); + } + std::cout << name << "死亡!\n"; + } + + virtual void hit(Player &p) // 设定虚函数的接口 + { + } +}; + +class Demon : public Player +{ +public: + using Player::Player; + void hit(Player &p) + { + p.HP -= attack - p.defence; + HP += attack - p.defence; + std::cout << name << "砍了" << p.name << "一刀,并吸了一口血\n"; + } +}; + +class Angel : public Player +{ +public: + using Player::Player; + void hit(Player &p) + { + p.HP -= attack - p.defence; + p.HP -= attack - p.defence; + std::cout << name << "砍了" << p.name << "两刀\n"; + } +}; + +class Ghost : public Player +{ +public: + using Player::Player; + virtual void hit(Player &p) + { + p.HP -= (attack - p.defence) * 1.5; + HP += (attack - p.defence) * 0.5; + std::cout << name << "砍了" << p.name << "一大刀,并吸了一小口血\n"; + } +}; + +int main() +{ + Angel a{"孙悟空", 100, 20, 1000}; + Demon d{"牛魔王", 100, 20, 1000}; + Ghost g{"白骨精", 100, 20, 1000}; + a.pk(d); + // 改成a.pk(g)试试不同? + // 在本例当中,无论从Player派生出多少新的类, + // 只要遵守虚函数的规定,在pk函数中都可以通过各自对象来调用各自的hit方法, + // 充分体现了动态多态性的魅力 +} \ No newline at end of file