一个开宝箱游戏的基本描述为:游戏中有多种类型的人物(Role),如战士(Solider)、魔法师(Mage)等,主角的类型只能选择其中一种,且游戏中不再更改。游戏中还有各种宝箱(Box),如装有不同数目金钱的宝箱、装有毒物的宝箱等。当任一种类型的主角打开装有金钱的宝箱时,宝箱中的金钱会增加给主角,同时宝箱的金钱数目变成0;当战士打开装有毒物的宝箱时,战士的生命值(HP)会减少10%,但金钱(Money)增加20%;当魔法师打开装有毒物的宝箱时,魔法师的生命值(HP)会减少30%,但金钱(Money)增加40% 。请根据上述描述,给出相应类的设计并完整实现,要求你的设计应具有良好的扩展性,如增加新角色类型及箱子种类时,不需要修改已有的设计及实现。
实现代码如下:
class Box;
class Role {
public:
Role(int theMoney,int theHP):money(theMoney),hp(theHP) { }
virtual ~Role( ) {}
int GetMoney( ) const { return money;}
void SetMoney(int m) { money = m; }
void Open (Box& aBox) { aBox.BeOpened(*this); }
virtual void PoisonHurt( ) = 0;
protected:
int money;
int hp;
};
class Solider:public Role {
public:
Solider(int theMoney,int theHP):Role(theMoney,theHP) { }
virtual void PoisonHurt( ) {
hp *=0.9;
money *=1.2;
}
};
class Mage:public Role {
public:
Mage (int theMoney,int theHP):Role(theMoney,theHP) { }
virtual void PoisonHurt( ) {
hp *=0.7;
money *=1.4;
}
};
class Box {
public:
virtual ~Box( ) {}
virtual void BeOpened(Role& role) = 0;
};
class MoneyBox:public Box {
public:
MoneyBox(int m):boxMoney(m) { }
virtual void BeOpened(Role& role) {
role.SetMoney(role.GetMoney( ) + boxMoney );
boxMoney = 0;
}
protected:
int boxMoney;
};
class PoisonBox:public Box {
public:
virtual void BeOpened(Role& role) { role. PoisonHurt ( ); }
};