Add player_v1.cpp

main
p68710245 1 year ago
parent 6a6af9bd87
commit 0ee0ee5bd7

@ -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方法
// 充分体现了动态多态性的魅力
}
Loading…
Cancel
Save