You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
1.8 KiB

#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}
{
}
virtual 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) = 0; // 纯虚函数
};
class Demon : public Player
{
public:
using Player::Player;
virtual 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";
if (dynamic_cast<Demon *>(p)) // 向下转型
{
std::cout << "天使遇到了恶魔,再砍一刀!\n";
p->HP -= attack - p->defence;
}
}
};
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);
}