诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

269 lines
7.7 KiB

  1. #ifndef GAME_LOGIC_HEAD_FILE
  2. #define GAME_LOGIC_HEAD_FILE
  3. #pragma once
  4. #include "Stdafx.h"
  5. //////////////////////////////////////////////////////////////////////////
  6. //////////////////////////////////////////////////////////////////////////
  7. //逻辑掩码
  8. #define MASK_COLOR 0xF0 //花色掩码
  9. #define MASK_VALUE 0x0F //数值掩码
  10. //////////////////////////////////////////////////////////////////////////
  11. //动作定义
  12. //动作标志
  13. #define WIK_NULL 0x00 //没有类型
  14. #define WIK_LEFT 0x01 //左吃类型
  15. #define WIK_CENTER 0x02 //中吃类型
  16. #define WIK_RIGHT 0x04 //右吃类型
  17. #define WIK_PENG 0x08 //碰牌类型
  18. #define WIK_GANG 0x10 //杠牌类型
  19. #define WIK_LISTEN 0x20 //吃牌类型
  20. #define WIK_CHI_HU 0x40 //吃胡类型
  21. #define WIK_ZI_MO 0x80 //自摸
  22. //////////////////////////////////////////////////////////////////////////
  23. //胡牌定义
  24. //胡牌
  25. #define CHK_NULL 0x00 //非胡类型
  26. #define CHK_CHI_HU 0x01 //胡类型
  27. #define CHR_QIANG_GANG 0x00000001 //抢杠
  28. #define CHR_GANG_SHANG_PAO 0x00000002 //杠上炮
  29. #define CHR_GANG_KAI 0x00000004 //杠上花
  30. #define CHR_TIAN_HU 0x00000008 //天胡
  31. #define CHR_DI_HU 0x00000010 //地胡
  32. #define CHR_DA_DUI_ZI 0x00000020 //大对子
  33. #define CHR_QING_YI_SE 0x00000040 //清一色
  34. #define CHR_QI_XIAO_DUI 0x00000080 //暗七对
  35. #define CHR_DAI_YAO 0x00000100 //带幺
  36. #define CHR_JIANG_DUI 0x00000200 //将对
  37. #define CHR_SHU_FAN 0x00000400 //素番
  38. #define CHR_QING_DUI 0x00000800 //清对
  39. #define CHR_LONG_QI_DUI 0x00001000 //龙七对
  40. #define CHR_QING_QI_DUI 0x00002000 //清七对
  41. #define CHR_QING_YAO_JIU 0x00004000 //清幺九
  42. #define CHR_QING_LONG_QI_DUI 0x00008000 //清龙七对
  43. //////////////////////////////////////////////////////////////////////////
  44. #define ZI_PAI_COUNT 7
  45. #pragma pack(1)
  46. //类型子项
  47. struct tagKindItem
  48. {
  49. BYTE cbWeaveKind; //组合类型
  50. BYTE cbCenterCard; //中心扑克
  51. BYTE cbCardIndex[3]; //扑克索引
  52. BYTE cbValidIndex[3]; //实际扑克索引
  53. };
  54. //组合子项
  55. struct tagWeaveItem
  56. {
  57. BYTE cbWeaveKind; //组合类型
  58. BYTE cbCenterCard; //中心扑克
  59. BYTE cbPublicCard; //公开标志
  60. WORD wProvideUser; //供应用户
  61. };
  62. //杠牌结果
  63. struct tagGangCardResult
  64. {
  65. BYTE cbCardCount; //扑克数目
  66. BYTE cbCardData[4]; //扑克数据
  67. };
  68. //分析子项
  69. struct tagAnalyseItem
  70. {
  71. BYTE cbCardEye; //牌眼扑克
  72. bool bMagicEye; //牌眼是否是王霸
  73. BYTE cbWeaveKind[4]; //组合类型
  74. BYTE cbCenterCard[4]; //中心扑克
  75. BYTE cbCardData[4][4]; //实际扑克
  76. };
  77. #pragma pack()
  78. //////////////////////////////////////////////////////////////////////////
  79. #define MASK_CHI_HU_RIGHT 0x0fffffff
  80. /*
  81. // 权位类。
  82. // 注意,在操作仅位时最好只操作单个权位.例如
  83. // CChiHuRight chr;
  84. // chr |= (chr_zi_mo|chr_peng_peng),这样结果是无定义的。
  85. // 只能单个操作:
  86. // chr |= chr_zi_mo;
  87. // chr |= chr_peng_peng;
  88. */
  89. class CChiHuRight
  90. {
  91. //静态变量
  92. private:
  93. static bool m_bInit;
  94. static DWORD m_dwRightMask[MAX_RIGHT_COUNT];
  95. //权位变量
  96. private:
  97. DWORD m_dwRight[MAX_RIGHT_COUNT];
  98. public:
  99. //构造函数
  100. CChiHuRight();
  101. //运算符重载
  102. public:
  103. //赋值符
  104. CChiHuRight & operator = ( DWORD dwRight );
  105. //与等于
  106. CChiHuRight & operator &= ( DWORD dwRight );
  107. //或等于
  108. CChiHuRight & operator |= ( DWORD dwRight );
  109. //与
  110. CChiHuRight operator & ( DWORD dwRight );
  111. CChiHuRight operator & ( DWORD dwRight ) const;
  112. //或
  113. CChiHuRight operator | ( DWORD dwRight );
  114. CChiHuRight operator | ( DWORD dwRight ) const;
  115. //功能函数
  116. public:
  117. //是否权位为空
  118. bool IsEmpty();
  119. //设置权位为空
  120. void SetEmpty();
  121. //获取权位数值
  122. BYTE GetRightData( DWORD dwRight[], BYTE cbMaxCount );
  123. //设置权位数值
  124. bool SetRightData( const DWORD dwRight[], BYTE cbRightCount );
  125. private:
  126. //检查权位是否正确
  127. bool IsValidRight( DWORD dwRight );
  128. };
  129. //////////////////////////////////////////////////////////////////////////
  130. //数组说明
  131. typedef CWHArray<tagAnalyseItem,tagAnalyseItem &> CAnalyseItemArray;
  132. //游戏逻辑类
  133. class CGameLogic
  134. {
  135. //变量定义
  136. protected:
  137. static const BYTE m_cbCardDataArray[MAX_REPERTORY]; //扑克数据
  138. BYTE m_cbMagicIndex; //钻牌索引
  139. //函数定义
  140. public:
  141. //构造函数
  142. CGameLogic();
  143. //析构函数
  144. virtual ~CGameLogic();
  145. //控制函数
  146. public:
  147. //混乱扑克
  148. void RandCardData(BYTE cbCardData[], BYTE cbMaxCount);
  149. //删除扑克
  150. bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard);
  151. //删除扑克
  152. bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], const BYTE cbRemoveCard[], BYTE cbRemoveCount);
  153. //删除扑克
  154. bool RemoveCard(BYTE cbCardData[], BYTE cbCardCount, const BYTE cbRemoveCard[], BYTE cbRemoveCount);
  155. //设置钻牌
  156. void SetMagicIndex( BYTE cbMagicIndex ) { m_cbMagicIndex = cbMagicIndex; }
  157. //钻牌
  158. bool IsMagicCard( BYTE cbCardData );
  159. //辅助函数
  160. public:
  161. //有效判断
  162. bool IsValidCard(BYTE cbCardData);
  163. //扑克数目
  164. BYTE GetCardCount(const BYTE cbCardIndex[MAX_INDEX]);
  165. //组合扑克
  166. BYTE GetWeaveCard(BYTE cbWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4]);
  167. //等级函数
  168. public:
  169. //动作等级
  170. BYTE GetUserActionRank(BYTE cbUserAction);
  171. //胡牌等级
  172. WORD GetChiHuActionRank(const CChiHuRight & ChiHuRight);
  173. //动作判断
  174. public:
  175. //吃牌判断
  176. BYTE EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
  177. //碰牌判断
  178. BYTE EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
  179. //杠牌判断
  180. BYTE EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
  181. //动作判断
  182. public:
  183. //杠牌分析
  184. BYTE AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult);
  185. //吃胡分析
  186. BYTE AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, CChiHuRight &ChiHuRight);
  187. //听牌分析
  188. BYTE AnalyseTingCard( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount );
  189. //是否听牌
  190. bool IsTingCard( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount );
  191. //是否花猪
  192. bool IsHuaZhu( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount );
  193. //转换函数
  194. public:
  195. //扑克转换
  196. BYTE SwitchToCardData(BYTE cbCardIndex);
  197. //扑克转换
  198. BYTE SwitchToCardIndex(BYTE cbCardData);
  199. //扑克转换
  200. BYTE SwitchToCardData(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT]);
  201. //扑克转换
  202. BYTE SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX]);
  203. //胡法分析
  204. protected:
  205. //大对子
  206. bool IsPengPeng( const tagAnalyseItem *pAnalyseItem );
  207. //清一色牌
  208. bool IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount,const BYTE cbCurrentCard);
  209. //七小对牌
  210. bool IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[],const BYTE cbWeaveCount,const BYTE cbCurrentCard);
  211. //带幺
  212. bool IsDaiYao( const tagAnalyseItem *pAnalyseItem );
  213. //将对
  214. bool IsJiangDui( const tagAnalyseItem *pAnalyseItem );
  215. //内部函数
  216. private:
  217. //分析扑克
  218. bool AnalyseCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbItemCount, CAnalyseItemArray & AnalyseItemArray);
  219. //排序,根据牌值排序
  220. bool SortCardList( BYTE cbCardData[MAX_COUNT], BYTE cbCardCount );
  221. };
  222. //////////////////////////////////////////////////////////////////////////
  223. #endif