最近,在做游戏逻辑部分时,看到写的代码有很多的重复性的劳动。比如:改造系统,强化/分解系统,每日津贴奖励等。总是想有没有什么办法能把些系统的重复代码整合起来呢?
首先,分析这些系统有个共同点就是通过一定的条件获取一些东西。
然后,又分析了一下游戏中的其他系统,比如:任务系统,副本兑换,一些零散的活动的。都有这共同点(通过一定条件获得一些物品)。
最后,分析能不能将这些共同点抽象出来,从而介绍重复性的劳动。
最终得到了以下解决方案。
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) 编辑 收藏 引用