诸暨麻将添加redis
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

248 rader
9.4 KiB

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