诸暨麻将添加redis
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

280 行
9.6 KiB

  1. #ifndef IMMEDIATE_GROUP_HEAD_FILE
  2. #define IMMEDIATE_GROUP_HEAD_FILE
  3. #pragma once
  4. //包含文件
  5. #include "TableFrameHook.h"
  6. #include "MatchServiceHead.h"
  7. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  8. //时钟定义
  9. #define IDI_DELETE_OVER_MATCH (IDI_MATCH_MODULE_START+1) //删除结束的比赛组
  10. #define IDI_CHECK_OVER_MATCH (IDI_MATCH_MODULE_START+2) //检查一场比赛
  11. #define IDI_GROUP_TIMER_START (IDI_MATCH_MODULE_START+10) //比赛组内的定时器
  12. //时钟定义
  13. #define IDI_CHECK_MATCH_GROUP (IDI_GROUP_TIMER_START+1) //轮巡所有开赛比赛组
  14. #define IDI_WAITTABLE_FIRST_ROUND (IDI_GROUP_TIMER_START+2) //等待配桌
  15. #define IDI_WAITTABLE_RAND_TABLE (IDI_GROUP_TIMER_START+3) //等待随机分配
  16. #define IDI_SWITCH_WAIT_TIME (IDI_GROUP_TIMER_START+4) //换桌等待时间
  17. #define IDI_ALL_DISMISS_GAME (IDI_GROUP_TIMER_START+5) //全部解散游戏
  18. #define IDI_LASTMATCHRESULT (IDI_GROUP_TIMER_START+6) //结束比赛
  19. #define IDI_ENTER_NEXT_ROUND (IDI_GROUP_TIMER_START+7) //进入下一个循环
  20. #define IDI_TABLE_REQUEST_USER (IDI_GROUP_TIMER_START+8) //自动分配桌子
  21. //时钟定义
  22. #define IDI_CONTINUE_GAME 1 //继续游戏
  23. #define IDI_LEAVE_TABLE 2 //离开桌子
  24. #define IDI_CHECK_TABLE_START 3 //检查分配桌子是否开始(解决有可能准备后不开始情况)
  25. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  26. //结构定义
  27. //比赛状态
  28. enum enMatchStatus
  29. {
  30. MatchStatus_Null = 0, //无状态
  31. MatchStatus_Signup, //报名中
  32. MatchStatus_Wait, //等待桌子
  33. MatchStatus_FirstRound //首轮比赛
  34. };
  35. //比赛定时器
  36. struct tagMatchTimer
  37. {
  38. DWORD dwTimerID; //定时器ID
  39. int iElapse; //执行间隔秒
  40. WPARAM wParam; //附加参数
  41. LPARAM lParam; //附加参数
  42. };
  43. //分数单项
  44. struct tagMatchScore
  45. {
  46. DWORD dwUserID; //用户I D
  47. SCORE lScore; //用户成绩
  48. IServerUserItem * pUserItem; //用户接口
  49. };
  50. //排名单项
  51. struct tagMatchRanking
  52. {
  53. DWORD dwUserID; //用户I D
  54. SCORE lScore; //用户分数
  55. LONG lExpand; //扩展值
  56. IServerUserItem * pUserItem; //用户接口
  57. };
  58. //比赛桌详情
  59. struct tagTableFrameInfo
  60. {
  61. ITableFrame * pTableFrame; //桌子接口
  62. WORD wTableID; //桌子编号
  63. DWORD dwBaseScore; //基础分数
  64. BYTE cbPlayCount; //游戏局数
  65. bool bRoundTableFinish; //完成标识
  66. bool bSwtichTableFinish; //换桌完成
  67. bool bWaitForNextInnings; //等待下局
  68. };
  69. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  70. //类型定义
  71. //数组定义
  72. typedef CWHArray<tagMatchTimer *> CUserMatchTimerArray;
  73. typedef CWHArray<tagMatchScore *> CUserMatchScoreArray;
  74. typedef CWHArray<IServerUserItem *> CMatchUserItemArray;
  75. typedef CWHArray<tagTableFrameInfo *> CTableFrameMananerArray;
  76. //字典定义
  77. typedef CMap<DWORD, DWORD, IServerUserItem *, IServerUserItem *> CUserItemMap;
  78. typedef CMap<IServerUserItem *, IServerUserItem *, DWORD, DWORD> CUserSeatMap;
  79. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  80. //接口定义
  81. //类型声明
  82. class CImmediateGroup;
  83. //分组回调
  84. interface IImmediateGroupSink
  85. {
  86. //比赛事件
  87. public:
  88. //开始比赛
  89. virtual bool OnEventMatchStart(CImmediateGroup *pMatch) = NULL;
  90. //比赛结束
  91. virtual bool OnEventMatchOver(CImmediateGroup *pMatch) = NULL;
  92. //定时器接口
  93. public:
  94. //删除定时器
  95. virtual bool KillGameTimer(DWORD dwTimerID, CImmediateGroup *pMatch) = NULL;
  96. //设置定时器
  97. virtual bool SetGameTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter, CImmediateGroup *pMatch) = NULL;
  98. //发送函数
  99. public:
  100. //发送数据
  101. virtual bool SendMatchInfo(IServerUserItem * pIServerUserItem) = NULL;
  102. //发送信息
  103. virtual bool SendGroupUserMessage(LPCTSTR pStrMessage, CImmediateGroup *pMatch) = NULL;
  104. //发送分数
  105. virtual bool SendGroupUserScore(IServerUserItem * pIServerUserItem, CImmediateGroup *pMatch) = NULL;
  106. //发送状态
  107. virtual bool SendGroupUserStatus(IServerUserItem * pIServerUserItem, CImmediateGroup *pMatch) = NULL;
  108. //发送消息
  109. virtual bool SendGameMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wMessageType) = NULL;
  110. //发送消息
  111. virtual bool SendRoomMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wMessageType) = NULL;
  112. //发送数据
  113. virtual bool SendGroupData(WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize, CImmediateGroup *pMatch) = NULL;
  114. //发送数据
  115. virtual bool SendData(IServerUserItem * pIServerUserItem, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) = NULL;
  116. //功能函数
  117. public:
  118. //插入空的桌子
  119. virtual void InsertNullTable() = NULL;
  120. //获取机器人
  121. virtual IAndroidUserItem * GetFreeAndroidUserItem() = NULL;
  122. //用户淘汰
  123. virtual bool OnUserOut(IServerUserItem *pUserItem, LPCTSTR szReason, WORD wLen, WORD wRank, CImmediateGroup *pMatch) = NULL;
  124. };
  125. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  126. //比赛分组
  127. class CImmediateGroup : public IMatchEventSink
  128. {
  129. friend class CImmediateMatch;
  130. //状态信息
  131. protected:
  132. DWORD m_dwCurBase; //当前基数
  133. DWORD m_dwMatchNO; //比赛编号
  134. enMatchStatus m_enMatchStatus; //比赛阶段
  135. BYTE m_LoopTimer; //循环定时器
  136. WORD m_wAndroidUserCount; //机器人个数
  137. SYSTEMTIME m_MatchStartTime; //比赛开始
  138. //指针变量
  139. protected:
  140. tagGameMatchOption * m_pMatchOption; //比赛规则
  141. IImmediateGroupSink * m_pMatchSink; //管理回调
  142. //存储变量
  143. protected:
  144. CUserItemMap m_OnMatchUserMap; //参赛用户
  145. CMatchUserItemArray m_FreeUserArray; //空闲用户
  146. CTableFrameMananerArray m_MatchTableArray; //预定比赛桌子
  147. CUserMatchTimerArray m_MatchTimerArray; //比赛专用定时器
  148. //静态变量
  149. protected:
  150. static WORD m_wChairCount; //椅子数目
  151. //函数定义
  152. public:
  153. //构造函数
  154. CImmediateGroup(DWORD dwMatchNO, tagGameMatchOption * pGameMatchOption, IImmediateGroupSink *pIImmediateGroupSink);
  155. //析构函数
  156. virtual ~CImmediateGroup();
  157. //基础接口
  158. public:
  159. //释放对象
  160. virtual VOID Release(){}
  161. //接口查询
  162. virtual VOID * QueryInterface(REFGUID Guid, DWORD dwQueryVer);
  163. //功能函数
  164. public:
  165. //游戏开始
  166. virtual bool OnEventGameStart(ITableFrame *pITableFrame, WORD wChairCount);
  167. //游戏结束
  168. virtual bool OnEventGameEnd(ITableFrame *pITableFrame, WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason);
  169. //用户事件
  170. public:
  171. //用户坐下
  172. virtual bool OnActionUserSitDown(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser);
  173. //用户起来
  174. virtual bool OnActionUserStandUp(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser);
  175. //用户同意
  176. virtual bool OnActionUserOnReady(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize);
  177. //用户事件
  178. public:
  179. //用户报名
  180. bool OnUserSignUpMatch(IServerUserItem *pUserItem);
  181. //用户退赛
  182. BOOL OnUserQuitMatch(IServerUserItem *pUserItem);
  183. //辅助函数
  184. protected:
  185. //比赛结束
  186. void MatchOver();
  187. //效验比赛开始
  188. void EfficacyStartMatch();
  189. //检测参赛人数
  190. bool CheckMatchUser();
  191. //玩家排序
  192. WORD SortMapUser(tagMatchScore score[]);
  193. //所有玩家起立
  194. void RearrangeUserSeat(bool bDismissGame = true);
  195. //定时器消息
  196. bool OnTimeMessage(DWORD dwTimerID, WPARAM dwBindParameter);
  197. WORD GetUserRank(IServerUserItem *pUserItem, ITableFrame *pITableFrame = NULL);
  198. //发送提示
  199. VOID SendWaitTip(ITableFrame *pTableFrame, WORD wChairID = INVALID_CHAIR);
  200. //加入比赛桌子
  201. void AddMatchTable(tagTableFrameInfo* pTableFrameInfo){ m_MatchTableArray.Add(pTableFrameInfo); }
  202. //获取桌子专用接口
  203. tagTableFrameInfo* GetTableInterface(ITableFrame* ITable);
  204. //空闲桌子拉空闲用户
  205. void TabelRequestUser(bool bPrecedeSit = true);
  206. //发送一组信息
  207. void SendGroupBox(LPCTSTR pStrMessage);
  208. //设置所有用户离开
  209. void AllUserExitTable(ITableFrame *pITableFrame);
  210. //本桌继续游戏
  211. void ContinueGame(ITableFrame *pITableFrame);
  212. //获取优先坐下用户
  213. WORD GetPrecedeSitUser(DWORD dwCurTime);
  214. //实现该函数可保证Free组唯一
  215. void InsertFreeGroup(IServerUserItem *pUserItem);
  216. //发送比赛信息
  217. void SendTableUserMatchInfo(ITableFrame *pITableFrame, WORD wChairID);
  218. //定局排名游戏结束
  219. void FirstRoundRuleInningsGameEnd(ITableFrame *pITableFrame);
  220. //标记函数
  221. protected:
  222. //检测标记
  223. bool CheckRoundTableFinish();
  224. //检测标记
  225. bool CheckSwitchTableFinish();
  226. //设置标记
  227. void SetRoundTableFinish(ITableFrame *pITableFrame);
  228. //设置标记
  229. void SetSwitchTableFinish(ITableFrame *pITableFrame);
  230. //定时器函数
  231. protected:
  232. //捕获定时器
  233. void CaptureMatchTimer();
  234. //杀死定时器
  235. void AllKillMatchTimer();
  236. //杀死定时器
  237. bool KillMatchTimer(INT_PTR dwIndexID);
  238. //杀死定时器
  239. bool KillMatchTimer(DWORD dwTimerID, WPARAM wParam);
  240. //投递定时器
  241. void PostMatchTimer(DWORD dwTimerID, int iElapse, WPARAM wParam = 0, LPARAM lParam = 0);
  242. //杀死定时器
  243. void KillMatchGameTimer(DWORD dwTimerID);
  244. //设定定时器
  245. void SetMatchGameTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter);
  246. };
  247. #endif