诸暨麻将添加redis
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

163 lines
4.6 KiB

  1. #ifndef DISTRIBUTE_MANAGER_HEAD_FILE
  2. #define DISTRIBUTE_MANAGER_HEAD_FILE
  3. #pragma once
  4. #include "Stdafx.h"
  5. //////////////////////////////////////////////////////////////////////////////////
  6. //同桌信息
  7. struct tagSameTableInfo
  8. {
  9. WORD wPlayerCount; //玩家数目
  10. DWORD wPlayerIDSet[16]; //玩家集合
  11. };
  12. //分组数据
  13. struct tagDistributeInfo
  14. {
  15. WORD wDistribute; //分配等级
  16. DWORD dwClientAddr; //玩家地址
  17. DWORD dwInsertStamp; //插入时间
  18. IServerUserItem * pIServerUserItem; //用户接口
  19. VOID * pPertainNode; //所属结点
  20. };
  21. //分组结点
  22. struct tagDistributeNode
  23. {
  24. tagDistributeNode * pPrepDistributeNode; //前一结点
  25. tagDistributeNode * pNextDistributeNode; //下一结点
  26. tagDistributeInfo DistributeInfo; //分组信息
  27. tagDistributeNode()
  28. {
  29. pPrepDistributeNode = NULL;
  30. pNextDistributeNode = NULL;
  31. }
  32. ~tagDistributeNode()
  33. {
  34. pPrepDistributeNode = NULL;
  35. pNextDistributeNode = NULL;
  36. }
  37. };
  38. //////////////////////////////////////////////////////////////////////////////////
  39. //类型定义
  40. typedef CWHArray<tagDistributeInfo> CDistributeInfoArray; //分组数组
  41. typedef CWHArray<tagSameTableInfo *> CSameTableArray; //同坐数组
  42. typedef CMap<DWORD, DWORD, tagSameTableInfo *, tagSameTableInfo*> CSameTableMap; //同桌信息
  43. //////////////////////////////////////////////////////////////////////////////////
  44. //结点池
  45. class CDistributeNodePool
  46. {
  47. //管理变量
  48. public:
  49. static const int BLOCK_SIZE;
  50. static tagDistributeNode * m_pHeadOfFreeList;
  51. //函数定义
  52. public:
  53. //构造函数
  54. CDistributeNodePool();
  55. //析构函数
  56. ~CDistributeNodePool();
  57. //功能函数
  58. public:
  59. //分配结点
  60. tagDistributeNode * AllocNode();
  61. //释放结点
  62. VOID FreeNode(void * pNode);
  63. };
  64. //////////////////////////////////////////////////////////////////////////////////
  65. //分组管理
  66. class CDistributeManager
  67. {
  68. //数目变量
  69. protected:
  70. WORD m_wNodeCount; //结点数目
  71. WORD m_wRealCount; //真人数目
  72. WORD m_wAndroidCount; //机器数目
  73. //存储变量
  74. protected:
  75. CSameTableArray m_SameTableBuffer; //同桌缓冲
  76. CSameTableArray m_SameTableActive; //同桌数组
  77. CSameTableMap m_SameTableMap; //同桌字典
  78. //管理变量
  79. protected:
  80. CDistributeNodePool m_DistributeNodePool; //结点池
  81. tagDistributeNode * m_pHeadNode; //头部结点
  82. //分组变量
  83. protected:
  84. BYTE m_cbDistributeRule; //分组规则
  85. //函数定义
  86. public:
  87. //构造函数
  88. CDistributeManager();
  89. //析构函数
  90. virtual ~CDistributeManager();
  91. //内联函数
  92. public:
  93. //结点数目
  94. inline WORD GetCount() { return m_wNodeCount; }
  95. //真人数目
  96. inline WORD GetRealCount() { return m_wRealCount; };
  97. //机器数目
  98. inline WORD GetAndroidCount() { return m_wAndroidCount; };
  99. //设置规则
  100. inline VOID SetDistributeRule(BYTE cbDistributeRule) { m_cbDistributeRule = cbDistributeRule; }
  101. //功能函数
  102. public:
  103. //移除结点
  104. VOID RemoveAll();
  105. //插入结点
  106. BOOL InsertDistributeNode(const tagDistributeInfo & DistributeInfo);
  107. //移除结点
  108. VOID RemoveDistributeNode(tagDistributeNode * pDistributeNode);
  109. //移除结点
  110. VOID RemoveDistributeNode(const IServerUserItem * pIServerUserItem);
  111. //执行分组
  112. WORD PerformDistribute(CDistributeInfoArray & DistributeInfoArray, WORD wNeedCount);
  113. //功能函数
  114. public:
  115. //获取信息
  116. tagSameTableInfo * GetUserSameTableInfo(DWORD dwUserID);
  117. //移除信息
  118. VOID RemoveUserSameTableInfo(DWORD dwUserID);
  119. //内部函数
  120. protected:
  121. //激活对象
  122. tagSameTableInfo * ActiveSameTableInfo();
  123. //移除对象
  124. VOID RemoveSameTableInfo(tagSameTableInfo * pSameTableInfo);
  125. //查找结点
  126. tagDistributeNode* SearchNode(const IServerUserItem * const pIServerUserItem);
  127. //规则函数
  128. protected:
  129. //IP同址
  130. inline BOOL FilterRuleExitsIPAddr(const CDistributeInfoArray & DistributeInfoArray, DWORD dwClientAddr);
  131. //机器过滤
  132. inline BOOL FilterRuleIsAllAndroid(const CDistributeInfoArray & DistributeInfoArray, IServerUserItem * const pIServerUserItem);
  133. //上局同桌
  134. inline BOOL FilterRuleIsLastSameTable(const CDistributeInfoArray & DistributeInfoArray, DWORD dwUserID);
  135. };
  136. //////////////////////////////////////////////////////////////////////////////////
  137. #endif