#ifndef DISTRIBUTE_MANAGER_HEAD_FILE #define DISTRIBUTE_MANAGER_HEAD_FILE #pragma once #include "Stdafx.h" ////////////////////////////////////////////////////////////////////////////////// //同桌信息 struct tagSameTableInfo { WORD wPlayerCount; //玩家数目 DWORD wPlayerIDSet[16]; //玩家集合 }; //分组数据 struct tagDistributeInfo { WORD wDistribute; //分配等级 DWORD dwClientAddr; //玩家地址 DWORD dwInsertStamp; //插入时间 IServerUserItem * pIServerUserItem; //用户接口 VOID * pPertainNode; //所属结点 }; //分组结点 struct tagDistributeNode { tagDistributeNode * pPrepDistributeNode; //前一结点 tagDistributeNode * pNextDistributeNode; //下一结点 tagDistributeInfo DistributeInfo; //分组信息 tagDistributeNode() { pPrepDistributeNode = NULL; pNextDistributeNode = NULL; } ~tagDistributeNode() { pPrepDistributeNode = NULL; pNextDistributeNode = NULL; } }; ////////////////////////////////////////////////////////////////////////////////// //类型定义 typedef CWHArray CDistributeInfoArray; //分组数组 typedef CWHArray CSameTableArray; //同坐数组 typedef CMap CSameTableMap; //同桌信息 ////////////////////////////////////////////////////////////////////////////////// //结点池 class CDistributeNodePool { //管理变量 public: static const int BLOCK_SIZE; static tagDistributeNode * m_pHeadOfFreeList; //函数定义 public: //构造函数 CDistributeNodePool(); //析构函数 ~CDistributeNodePool(); //功能函数 public: //分配结点 tagDistributeNode * AllocNode(); //释放结点 VOID FreeNode(void * pNode); }; ////////////////////////////////////////////////////////////////////////////////// //分组管理 class CDistributeManager { //数目变量 protected: WORD m_wNodeCount; //结点数目 WORD m_wRealCount; //真人数目 WORD m_wAndroidCount; //机器数目 //存储变量 protected: CSameTableArray m_SameTableBuffer; //同桌缓冲 CSameTableArray m_SameTableActive; //同桌数组 CSameTableMap m_SameTableMap; //同桌字典 //管理变量 protected: CDistributeNodePool m_DistributeNodePool; //结点池 tagDistributeNode * m_pHeadNode; //头部结点 //分组变量 protected: BYTE m_cbDistributeRule; //分组规则 //函数定义 public: //构造函数 CDistributeManager(); //析构函数 virtual ~CDistributeManager(); //内联函数 public: //结点数目 inline WORD GetCount() { return m_wNodeCount; } //真人数目 inline WORD GetRealCount() { return m_wRealCount; }; //机器数目 inline WORD GetAndroidCount() { return m_wAndroidCount; }; //设置规则 inline VOID SetDistributeRule(BYTE cbDistributeRule) { m_cbDistributeRule = cbDistributeRule; } //功能函数 public: //移除结点 VOID RemoveAll(); //插入结点 BOOL InsertDistributeNode(const tagDistributeInfo & DistributeInfo); //移除结点 VOID RemoveDistributeNode(tagDistributeNode * pDistributeNode); //移除结点 VOID RemoveDistributeNode(const IServerUserItem * pIServerUserItem); //执行分组 WORD PerformDistribute(CDistributeInfoArray & DistributeInfoArray, WORD wNeedCount); //功能函数 public: //获取信息 tagSameTableInfo * GetUserSameTableInfo(DWORD dwUserID); //移除信息 VOID RemoveUserSameTableInfo(DWORD dwUserID); //内部函数 protected: //激活对象 tagSameTableInfo * ActiveSameTableInfo(); //移除对象 VOID RemoveSameTableInfo(tagSameTableInfo * pSameTableInfo); //查找结点 tagDistributeNode* SearchNode(const IServerUserItem * const pIServerUserItem); //规则函数 protected: //IP同址 inline BOOL FilterRuleExitsIPAddr(const CDistributeInfoArray & DistributeInfoArray, DWORD dwClientAddr); //机器过滤 inline BOOL FilterRuleIsAllAndroid(const CDistributeInfoArray & DistributeInfoArray, IServerUserItem * const pIServerUserItem); //上局同桌 inline BOOL FilterRuleIsLastSameTable(const CDistributeInfoArray & DistributeInfoArray, DWORD dwUserID); }; ////////////////////////////////////////////////////////////////////////////////// #endif