设计模式-开宝箱

一个开宝箱游戏的基本描述为:游戏中有多种类型的人物(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 ( ); }
};

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值