posts - 0,  comments - 0,  trackbacks - 0
最近,在做游戏逻辑部分时,看到写的代码有很多的重复性的劳动。比如:改造系统,强化/分解系统,每日津贴奖励等。总是想有没有什么办法能把些系统的重复代码整合起来呢?
首先,分析这些系统有个共同点就是通过一定的条件获取一些东西。
然后,又分析了一下游戏中的其他系统,比如:任务系统,副本兑换,一些零散的活动的。都有这共同点(通过一定条件获得一些物品)。
最后,分析能不能将这些共同点抽象出来,从而介绍重复性的劳动。
最终得到了以下解决方案。
1.定义条件数据
//条件数据信息
struct SCon
{
   unsigned int Type;  //条件类型
   unsigned int Id;  //条件所需的物品Id具体应用看子实现
   unsigned int Num;  //该条件指定的数量
   unsigned int DelStatuts;//区分该条件是否需要扣除
};

2.定义条件接口
//条件抽象处的接口
class CCon
{
friend class CConMgr;
public:
 CCon();
 virtual ~CCon();
 
public:
 virtual unsigned int Check( CUser *pUser ) = 0; //检查是否满足该条件
 virtual bool DelCon( CUser *pUser ) = 0;  //从玩家身上扣除该条件的的约束(比如:扣掉玩家身上钱,物品等)
 
private:
 SCon m_SCon;      //条件的数据
};

3.定义一些具体条件类

//指定数量物品的条件
class CConItem
{
public:
 CConItem();
 virtual ~CConItem();
 
public:
 virtual unsigned int Check( CUser *pUser ); //检查是是否有足够数量的物品
 virtual bool DelCon( CUser *pUser );  //扣除该条件制定的物品数量了
};

//指定数量金钱的条件
class CConMoney
{
public:
 CConMoney();
 virtual ~CConMoney();
 
public:
 virtual unsigned int Check( CUser *pUser ); //检查是是否有足够数量的金钱
 virtual bool DelCon( CUser *pUser );  //扣除该条件制定的金钱数量
};

4.条件管理类

class CConMgr
{
public:
 CConMgr();
 ~CConMgr();

public:
 /**
 *@ pUser玩家对象
 *@ ConId条件Id
 *@ 返回值:检查条件结果
 */
 unsigned int Check( CUser *pUser, unsigned int ConId );
 
 /**
 *@ pUser玩家对象
 *@ ConId条件Id
 *@ 返回值:无
 */
 void DelCon( CUser *pUser, unsigned int ConId );
 
public:
 static CCon *CreateCon(unsigned int Type);
 
private:
 //<条件Id, 条件列表 >
 std::map<unsigned int, std::vector<CCon *> > ConList;
};


对于奖励部分和条件部分接口类似,直接贴上代码

//奖励数据信息
struct SReward
{
 unsigned int Type;  //奖励类型
 unsigned int Id; //奖励物品等Id
 unsigned int Num; //奖励数量
 unsigned int Prob; //获得该奖励的概率
};

奖励基类
class CReward
{
public:
 CReward();
 virtual ~CReward();
 
public:
 bool Check( CUser *pUser ) = 0;//检查获得该奖励的合法性,比如:会不会导致背包满等
 void Gain( CUser *pUser ) = 0;
 
private:
 SReward m_SReward;
};

//奖励物品
class CRewardItem:public CReward
{
public:
 CRewardItem();
 virtual ~CRewardItem();
 
public:
 bool Check( CUser *pUser ) ;//检查获得该奖励的合法性,比如:会不会导致背包满等
 void Gain( CUser *pUser ); //获取奖励接口
 
private:
 SReward m_SReward;
};

//奖励经验
class CRewardExp:public CReward
{
public:
 CRewardExp();
 virtual ~CRewardExp();
 
public:
 bool Check( CUser *pUser );//检查获得该奖励的合法性,比如:会不会导致背包满等
 void Gain( CUser *pUser )0;
 
private:
 SReward m_SReward;
};

//奖励管理类
class CRewardMgr
{
public:
 CRewardMgr();
 ~CRewardMgr();
 
public:
 unsigned int Check( CUser *pUser, unsigned int RewardId );
 unsigned int Gain( CUser *pUser, unsigned int RewardId );
 
public:
 static CReward *CreateReward( unsigned int Type );
 
private:
 std::map<unsigned int, std::vecotr<CReward *> > RewardList;
};


总结:
设计:用到了简单工场模式和享元模式

思想:1.善于发现共性 2.思考问题时不可以“就事论事”。

第一次,写博客,希望大家多多指教,有什么问题可以一起讨论。

posted on 2011-11-06 22:01 完美残废 阅读(96) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理



<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

文章档案

搜索

  •  

最新评论