|
|
|
@ -0,0 +1,82 @@
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <string>
|
|
|
|
|
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方法,
|
|
|
|
|
// 充分体现了动态多态性的魅力
|
|
|
|
|
}
|