诸暨麻将添加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.
 
 
 
 
 
 

277 rivejä
8.1 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. #define CHR_MEN_QING_ZHONG_ZHANG 0x00010000 //门清中张(不吃不杠不碰)
  44. #define GAMETYPE_XZDD 1 //血战到底
  45. #define GAMETYPE_XLCH 2 //血流成河
  46. #define GAMETYPE_LFSZ 3 //两房三张
  47. #define GAMETYPE_DDH 4 //倒到胡
  48. //////////////////////////////////////////////////////////////////////////
  49. #define ZI_PAI_COUNT 7
  50. #pragma pack(1)
  51. //类型子项
  52. struct tagKindItem
  53. {
  54. BYTE cbWeaveKind; //组合类型
  55. BYTE cbCenterCard; //中心扑克
  56. BYTE cbCardIndex[3]; //扑克索引
  57. BYTE cbValidIndex[3]; //实际扑克索引
  58. };
  59. //组合子项
  60. struct tagWeaveItem
  61. {
  62. BYTE cbWeaveKind; //组合类型
  63. BYTE cbCenterCard; //中心扑克
  64. BYTE cbPublicCard; //公开标志
  65. WORD wProvideUser; //供应用户
  66. };
  67. //杠牌结果
  68. struct tagGangCardResult
  69. {
  70. BYTE cbCardCount; //扑克数目
  71. BYTE cbCardData[4]; //扑克数据
  72. };
  73. //分析子项
  74. struct tagAnalyseItem
  75. {
  76. BYTE cbCardEye; //牌眼扑克
  77. bool bMagicEye; //牌眼是否是王霸
  78. BYTE cbWeaveKind[4]; //组合类型
  79. BYTE cbCenterCard[4]; //中心扑克
  80. BYTE cbCardData[4][4]; //实际扑克
  81. };
  82. #pragma pack()
  83. //////////////////////////////////////////////////////////////////////////
  84. #define MASK_CHI_HU_RIGHT 0x0fffffff
  85. /*
  86. // 权位类。
  87. // 注意,在操作仅位时最好只操作单个权位.例如
  88. // CChiHuRight chr;
  89. // chr |= (chr_zi_mo|chr_peng_peng),这样结果是无定义的。
  90. // 只能单个操作:
  91. // chr |= chr_zi_mo;
  92. // chr |= chr_peng_peng;
  93. */
  94. class CChiHuRight
  95. {
  96. //静态变量
  97. private:
  98. static bool m_bInit;
  99. static DWORD m_dwRightMask[MAX_RIGHT_COUNT];
  100. //权位变量
  101. private:
  102. DWORD m_dwRight[MAX_RIGHT_COUNT];
  103. public:
  104. //构造函数
  105. CChiHuRight();
  106. //运算符重载
  107. public:
  108. //赋值符
  109. CChiHuRight & operator = ( DWORD dwRight );
  110. //与等于
  111. CChiHuRight & operator &= ( DWORD dwRight );
  112. //或等于
  113. CChiHuRight & operator |= ( DWORD dwRight );
  114. //与
  115. CChiHuRight operator & ( DWORD dwRight );
  116. CChiHuRight operator & ( DWORD dwRight ) const;
  117. //或
  118. CChiHuRight operator | ( DWORD dwRight );
  119. CChiHuRight operator | ( DWORD dwRight ) const;
  120. //功能函数
  121. public:
  122. //是否权位为空
  123. bool IsEmpty();
  124. //设置权位为空
  125. void SetEmpty();
  126. //获取权位数值
  127. BYTE GetRightData( DWORD dwRight[], BYTE cbMaxCount );
  128. //设置权位数值
  129. bool SetRightData( const DWORD dwRight[], BYTE cbRightCount );
  130. private:
  131. //检查权位是否正确
  132. bool IsValidRight( DWORD dwRight );
  133. };
  134. //////////////////////////////////////////////////////////////////////////
  135. //数组说明
  136. typedef CWHArray<tagAnalyseItem,tagAnalyseItem &> CAnalyseItemArray;
  137. //游戏逻辑类
  138. class CGameLogic
  139. {
  140. //变量定义
  141. protected:
  142. static const BYTE m_cbCardDataArray[MAX_REPERTORY]; //扑克数据
  143. BYTE m_cbMagicIndex; //钻牌索引
  144. //函数定义
  145. public:
  146. //构造函数
  147. CGameLogic();
  148. //析构函数
  149. virtual ~CGameLogic();
  150. //控制函数
  151. public:
  152. //混乱扑克
  153. void RandCardData(BYTE cbCardData[], BYTE cbMaxCount);
  154. //删除扑克
  155. bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard);
  156. //删除扑克
  157. bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], const BYTE cbRemoveCard[], BYTE cbRemoveCount);
  158. //删除扑克
  159. bool RemoveCard(BYTE cbCardData[], BYTE cbCardCount, const BYTE cbRemoveCard[], BYTE cbRemoveCount);
  160. //设置钻牌
  161. void SetMagicIndex( BYTE cbMagicIndex ) { m_cbMagicIndex = cbMagicIndex; }
  162. //钻牌
  163. bool IsMagicCard( BYTE cbCardData );
  164. //辅助函数
  165. public:
  166. //有效判断
  167. bool IsValidCard(BYTE cbCardData);
  168. //扑克数目
  169. BYTE GetCardCount(const BYTE cbCardIndex[MAX_INDEX]);
  170. //组合扑克
  171. BYTE GetWeaveCard(BYTE cbWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4]);
  172. //等级函数
  173. public:
  174. //动作等级
  175. BYTE GetUserActionRank(BYTE cbUserAction);
  176. //胡牌等级
  177. WORD GetChiHuActionRank(const CChiHuRight & ChiHuRight);
  178. //动作判断
  179. public:
  180. //吃牌判断 一脚耐油不需要吃牌判断
  181. //BYTE EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
  182. //碰牌判断
  183. BYTE EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
  184. //杠牌判断
  185. BYTE EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
  186. //动作判断
  187. public:
  188. //杠牌分析
  189. BYTE AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult);
  190. //吃胡分析
  191. BYTE AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, CChiHuRight &ChiHuRight);
  192. //听牌分析
  193. BYTE AnalyseTingCard( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount );
  194. //是否听牌
  195. bool IsTingCard( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount );
  196. //是否花猪
  197. bool IsHuaZhu( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE bDingQueHuase=INVALID_BYTE);
  198. //是否缺指定一个花色
  199. bool IsQueyimen(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
  200. //转换函数
  201. public:
  202. //扑克转换
  203. BYTE SwitchToCardData(BYTE cbCardIndex);
  204. //扑克转换
  205. BYTE SwitchToCardIndex(BYTE cbCardData);
  206. //扑克转换
  207. BYTE SwitchToCardData(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT]);
  208. //扑克转换
  209. BYTE SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX]);
  210. //胡法分析
  211. protected:
  212. //大对子
  213. bool IsPengPeng( const tagAnalyseItem *pAnalyseItem );
  214. //清一色牌
  215. bool IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount,const BYTE cbCurrentCard);
  216. //七小对牌
  217. bool IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[],const BYTE cbWeaveCount,const BYTE cbCurrentCard);
  218. //带幺
  219. bool IsDaiYao( const tagAnalyseItem *pAnalyseItem );
  220. //将对
  221. bool IsJiangDui( const tagAnalyseItem *pAnalyseItem );
  222. //内部函数
  223. private:
  224. //分析扑克
  225. bool AnalyseCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbItemCount, CAnalyseItemArray & AnalyseItemArray);
  226. //排序,根据牌值排序
  227. bool SortCardList( BYTE cbCardData[MAX_COUNT], BYTE cbCardCount );
  228. };
  229. //////////////////////////////////////////////////////////////////////////
  230. #endif