诸暨麻将添加redis
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

210 líneas
7.6 KiB

  1. #ifndef GAME_LOGIC_HEAD_FILE
  2. #define GAME_LOGIC_HEAD_FILE
  3. #pragma once
  4. #include "Stdafx.h"
  5. #include "data.h"
  6. enum CardColor
  7. {
  8. Color_Wan = 0,
  9. Color_Tiao,
  10. Color_Bing,
  11. Color_Feng,
  12. };
  13. enum MagicType{
  14. MagicType_TwoMagic = 0,
  15. MagicType_OneMagic,
  16. MagicType_NoMagic
  17. };
  18. class CTableFrameSink;
  19. //游戏逻辑类
  20. class CGameLogic
  21. {
  22. //变量定义
  23. protected:
  24. static const BYTE m_cbCardDataArray_ZJ[MAX_REPERTORY_ZJ]; //
  25. static const BYTE m_cbCardDataArray_ZJ_Two[MAX_REPERTORY_ZJ_Two]; //
  26. BYTE m_cbMagicIndexFirst; // 都叫财神
  27. BYTE m_cbMagicIndexSecond; // 都叫财神
  28. MagicType m_BaoMj_MagicType;// 0 1 2 无财神 1财神 2财神
  29. CTableFrameSink* m_pTableFramSink;
  30. //函数定义
  31. public:
  32. //构造函数
  33. CGameLogic(CTableFrameSink* pTableFramSink);
  34. //析构函数
  35. virtual ~CGameLogic();
  36. //控制函数
  37. public:
  38. //混乱扑克
  39. BYTE RandCardData(BYTE cbCardData[]);
  40. BYTE RandCardData_Two(BYTE cbCardData[]);
  41. //删除扑克
  42. bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard);
  43. //删除扑克
  44. bool RemoveCard(BYTE cbCardIndex[MAX_INDEX], const BYTE cbRemoveCard[], BYTE cbRemoveCount);
  45. //删除扑克
  46. bool RemoveCard(BYTE cbCardData[], BYTE cbCardCount, const BYTE cbRemoveCard[], BYTE cbRemoveCount);
  47. //设置钻牌
  48. void SetMagicIndex(BYTE CaiFirstIndex, BYTE CaiSecondIndex);
  49. //钻牌
  50. bool IsMagicCard( BYTE cbCardData );
  51. //辅助函数
  52. public:
  53. //获取麻将花色
  54. BYTE GetCardColor(BYTE cbCardData) { return (cbCardData&MASK_COLOR) >> 4 ;}
  55. //有效判断
  56. bool IsValidCard(BYTE cbCardData);
  57. //扑克数目
  58. BYTE GetCardCount(const BYTE cbCardIndex[MAX_INDEX]);
  59. //组合扑克
  60. BYTE GetWeaveCard(int cbWeaveKind, BYTE cbCenterCard,const BYTE cbMargicOffset[4], BYTE cbCardBuffer[4]);
  61. //获取财神牌个数
  62. BYTE GetMaigcCardCount(const BYTE cbCardIndex[MAX_INDEX]);
  63. //等级函数
  64. BYTE GetCardValue(BYTE cbCardDat){
  65. ASSERT(IsValidCard(cbCardDat));
  66. return (cbCardDat&MASK_VALUE);
  67. }
  68. public:
  69. //动作等级
  70. BYTE GetUserActionRank(int cbUserAction);
  71. //胡牌等级
  72. //WORD GetChiHuActionRank(const CChiHuRight & ChiHuRight);
  73. //动作判断
  74. public:
  75. //吃牌判断,一脚耐油不需要
  76. int EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
  77. //碰牌判断
  78. int EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
  79. //杠牌判断
  80. int EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard);
  81. //动作判断
  82. public:
  83. //杠牌分析
  84. int AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult);
  85. //胡牌分析,bFlag默认false表示正常胡牌,true标示杠上花
  86. int AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, CChiHuRight &ChiHuRight, BYTE& nHuTai, bool bFlag = false,bool bQiangGangFlag=false);
  87. //
  88. bool AnalyseCardNew(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
  89. //
  90. //bool isHaveMaigc(const BYTE cardMagicIndex[4]);
  91. //
  92. bool HaveMagic(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
  93. //
  94. bool IsPengPengHu(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
  95. //
  96. bool IsQuanShun(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
  97. //
  98. bool IsCardsIsHunYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BOOL HaveFengKe);
  99. //
  100. bool TestHu(const BYTE cbCardIndex[MAX_INDEX], int nCurrentMagicCount ,const tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
  101. //
  102. bool GetOneColorCards(const BYTE cbCardIndex[MAX_INDEX], BYTE nColor, BYTE cbCardData[MAX_COUNT], int&CardCount);
  103. //
  104. bool OneCardsCanHu(const BYTE cbCardData[MAX_COUNT], int nCardCount, int nMagicCount,bool isQuanShun=false);
  105. //
  106. int PrintCards(const BYTE cbCardData[MAX_COUNT], int nCout);
  107. //
  108. int DeleteCardDataFromCardDatas(const BYTE vDeletIndex[MAX_COUNT], int DeleteCount, const BYTE cbCardData[MAX_COUNT], BYTE nCount, BYTE cbOutCardDatas[MAX_COUNT]);
  109. //
  110. int AnalyseCardTaiNum(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
  111. //听牌分析
  112. bool AnalyseTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE *m_cbTingPaiData, const BYTE FanHui[MAX_INDEX], BYTE wChairID, BYTE wBaoUserID,BYTE BaoTai);
  113. //是否听牌
  114. //bool IsTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, const BYTE FanHui[MAX_INDEX]);
  115. //转换函数
  116. public:
  117. //扑克转换
  118. BYTE SwitchToCardData(BYTE cbCardIndex);
  119. //扑克转换
  120. BYTE SwitchToCardIndex(BYTE cbCardData);
  121. //扑克转换
  122. BYTE SwitchToCardData(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT]);
  123. //扑克转换
  124. BYTE SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX]);
  125. //获取手牌癞子个数,同时去掉癞子牌
  126. BYTE DeleteMagicCards(BYTE cbCardIndex[MAX_INDEX]);
  127. BYTE DeleteMagicCards(BYTE cbCardIndex[MAX_INDEX],int nDeleteCount);
  128. //获取条万筒风
  129. BYTE GetOneColorCards(const BYTE cbCardIndex[MAX_INDEX], const BYTE nColor, BYTE cbCardData[MAX_COUNT]);
  130. //获取牌值需要财神牌几个 bFlag默认true为扑
  131. int GetOneColorNeedMagicCards(const BYTE cbCardData[MAX_COUNT], int DataCount, int nNeedNum,bool isShun=FALSE);
  132. //财神牌可变牌扫描
  133. void IsCanChangCardAndCount(const BYTE cbCardIndex[MAX_INDEX], BYTE Fanhui[MAX_INDEX]);
  134. //获取牌个数
  135. WORD GetValue(BYTE uNum, BYTE fanshu, WORD PaiZhi);
  136. //解码加密的牌
  137. BYTE DeCodeCard(const WORD cbCardData);
  138. //解码翻数
  139. BYTE DeCodeFanshu(const WORD cbCardData);
  140. //获取手牌最后牌值
  141. BYTE GetEndCard(BYTE cbCardIndex[MAX_INDEX]);
  142. bool PeiPai(BYTE cbCardData[MAX_REPERTORY_ZJ]);
  143. //胡法分析
  144. protected:
  145. //碰碰胡
  146. bool IsPengPeng(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount);
  147. //清一色牌
  148. bool IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount);
  149. //门前清
  150. bool IsMenQianQing(const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount);
  151. //计算手牌是否包含东风刻字
  152. bool HaveFengKe(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE &cbItemCount,int nCardIndex);
  153. //内部函数
  154. private:
  155. //分析扑克
  156. bool AnalyseCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CAnalyseItemArray & AnalyseItemArray);
  157. public:
  158. //排序,根据牌值排序
  159. bool SortCardList( BYTE cbCardData[MAX_COUNT], BYTE cbCardCount );
  160. bool test2Combine(const BYTE cbCard1, const BYTE cbCard2);
  161. bool test3Combine(const BYTE cbCard1, const BYTE cbCard2, const BYTE cbCard3);
  162. bool test3combineToShun(const BYTE cbCard1, const BYTE cbCard2, const BYTE cbCard3);
  163. //一局中只有8个财神牌(其中一个无效),将这7个财神牌给玩家手牌去匹配能否成整扑,然后剩下多少,将剩下的数和可用财神数比较
  164. public:
  165. int mNeedMinMagicNum;
  166. BYTE m_cbHuCard;
  167. public:
  168. CChiHuRight mChiHuRight;
  169. DWORD mTaiRight;//计算台数的权值
  170. int mJiangInColor;
  171. int mSunTaiJiangInColor;
  172. //接下来尝试修改 在判断胡牌时 记录一下财神变成了什么。
  173. BYTE mMagicData[1024];
  174. BYTE mMagicDataCount;
  175. void ShowMagicData();
  176. void ShowMagicReplaceData();
  177. BYTE mMagicReplaceCard[MAX_INDEX];
  178. //删除数组中的牌
  179. void DeleteCards(const BYTE* pSrc, int nCount, const BYTE* pDeleteCards, int nDelCount, BYTE Cards[14]);
  180. BYTE mMagicNeedCardArray[4];
  181. bool mIsBaoMjType; //0翻财神 1 包麻将
  182. void SetGameLogicMjType(bool mjType){
  183. mIsBaoMjType = mjType;
  184. }
  185. BOOL IsCanHuAllCards(BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount);
  186. };
  187. //////////////////////////////////////////////////////////////////////////
  188. #endif