诸暨麻将添加redis
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

270 řádky
12 KiB

  1. #ifndef GAME_LOGICPoker_HEAD_FILE
  2. #define GAME_LOGICPoker_HEAD_FILE
  3. #pragma pack(1)
  4. #include "stdafx.h"
  5. #include "Poker\消息定义\CMD_Poker_Sparrow.h"
  6. //////////////////////////////////////////////////////////////////////////
  7. #include <vector>
  8. //排序类型
  9. #define ST_ORDER 0 //大小排序
  10. #define ST_COUNT 1 //数目排序
  11. #define ST_VALUE 2 //数值排序
  12. #define ORDERBY_ASE 0 //升序
  13. #define ORDERBY_DES 1 //降序
  14. #define BomoTypeXian 1 //N付M线
  15. #define BomoTypeLian 2 //N同M连
  16. //////////////////////////////////////////////////////////////////////////
  17. #include <vector>
  18. using namespace std;
  19. //分析结构
  20. struct tagAnalyseResult_Poker
  21. {
  22. // 10个位置 分别记录拥有同样牌的个数 [12/12/2018 Zoro]
  23. /*
  24. 例如:
  25. 33 44 66 cbBlockCount[sameCont-1]=3 标示 手牌中 对子的个数
  26. 333 34567 cbBlockCount[0]=5 cbBlockCount[sameCont-1]=1 表示 单牌有5张 3张1个
  27. */
  28. BYTE cbBlockCount[12]; //扑克数目
  29. BYTE cbCardData[12][MAX_COUNT_Poker]; //扑克数据 记录具体数据
  30. };
  31. //出牌结果
  32. struct tagOutCardResult
  33. {
  34. BYTE cbCardCount; //扑克数目
  35. BYTE cbResultCard[MAX_COUNT_Poker]; //结果扑克
  36. };
  37. //分布信息
  38. struct tagDistributing
  39. {
  40. BYTE cbCardCount; //扑克数目
  41. // [12/12/2018 Zoro]
  42. /*
  43. 第一维度 保存了 3-K A 2 大王 小王的位置 对应的数据 0表示3 依此类推
  44. 第二维度 6个 前4个[0-4] 表示 方片 梅花 红桃 黑桃 王花色 第6[5]个 标示此牌的张数
  45. */
  46. BYTE cbDistributing[15][6]; //分布信息
  47. };
  48. //////////////////////////////////////////////////////////////////////////
  49. typedef struct _BomoType_{
  50. BYTE fu; //N付M线
  51. BYTE xian;
  52. BYTE tong;//N同M连
  53. BYTE lian;
  54. BYTE Level;//线级5-11
  55. BYTE BomoTypes;
  56. BYTE CbBomoCount;
  57. _BomoType_(){
  58. fu = 0;
  59. xian = 0;
  60. tong = 0;
  61. lian = 0;
  62. BomoTypes = 0;
  63. CbBomoCount = 0;
  64. Level = 0;
  65. }
  66. _BomoType_ operator=(_BomoType_ & bomo){
  67. this->fu = bomo.fu;
  68. this->xian = bomo.xian ;
  69. this->tong = bomo.tong ;
  70. this->lian = bomo.lian ;
  71. this->Level = bomo.Level;
  72. this->BomoTypes = bomo.BomoTypes;
  73. this->CbBomoCount = bomo.CbBomoCount;
  74. return *this;
  75. }
  76. }BomoType;
  77. typedef struct _LastOutCardInfo_{
  78. BYTE cbCards[MAX_COUNT_Poker] ;
  79. BYTE cbCardCount;
  80. BYTE CardType;
  81. BomoType BomoInfo;
  82. _LastOutCardInfo_(){
  83. ZeroMemory(cbCards, sizeof(cbCards));
  84. }
  85. }LastCardsInfo;
  86. //游戏逻辑类
  87. class CGameLogic_Poker
  88. {
  89. //变量定义
  90. protected:
  91. static const BYTE m_cbCardData[FULL_COUNT_Poker]; //扑克数据
  92. BYTE m_GameMagicMode;//2 双癞子 1单癞子(仅大王) 0 无癞子
  93. //函数定义
  94. public:
  95. //构造函数
  96. CGameLogic_Poker();
  97. //析构函数
  98. virtual ~CGameLogic_Poker();
  99. //属性函数
  100. public:
  101. //获取数值
  102. BYTE GetCardValue(BYTE cbCardData) { return cbCardData&MASK_VALUE; }
  103. //获取花色
  104. BYTE GetCardColor(BYTE cbCardData) { return cbCardData&MASK_COLOR; }
  105. //类型函数
  106. public:
  107. //获取类型
  108. BYTE GetCardType(const BYTE cbCardData[], BYTE cbCardCount, BYTE &cbStarLevel, BomoType&BomoInfo);
  109. //控制函数
  110. public:
  111. //混乱扑克
  112. VOID RandCardList(BYTE cbCardBuffer[], BYTE cbBufferCount,byte OutCardType,WORD wRoomId);
  113. //排列扑克
  114. //ase 升序 0
  115. //des降序 1
  116. VOID SortCardList(BYTE cbCardData[], BYTE cbCardCount, BYTE cbSortType = ST_ORDER, BYTE OrderByType = ORDERBY_ASE);
  117. //删除扑克
  118. bool RemoveCard(const BYTE cbRemoveCard[], BYTE cbRemoveCount, BYTE cbCardData[], BYTE cbCardCount);
  119. //逻辑函数
  120. public:
  121. //有效判断
  122. bool IsValidCard(BYTE cbCardData);
  123. //逻辑数值
  124. BYTE GetCardLogicValue(BYTE cbCardData);
  125. //只支持 2-A 的转换
  126. BYTE TagIndexToNoColorCardValue(BYTE cbCardData);
  127. BYTE GetMaxLogicValue(const BYTE cbCarddata[], BYTE cbCardCount);
  128. CString LogicValueToString(BYTE cbCardData);
  129. //对比扑克
  130. bool CompareCard( BYTE cbFirstCard[], BYTE cbNextCard[], BYTE cbFirstCount, BYTE cbNextCount);
  131. //对比扑克
  132. bool CompareCard( const BYTE cbFirstCard,const BYTE cbNextCard );
  133. //查找指定牌拥有的个数 包括花色
  134. BYTE FindHaveCardCount(const BYTE cbCardBuffer[], BYTE cbCardCount,BYTE cbCardData ,BYTE cbCardPosition[2]);
  135. //功能函数
  136. public:
  137. //变幻扑克
  138. bool MagicCardData(BYTE cbCardData[], BYTE cbCardCount, BYTE cbResultCard[MAX_COUNT_Poker]);
  139. //将王替换成 前端要的牌
  140. BOOL ReplaceWangCards(BYTE OldCards[], BYTE cbCount, BYTE ReplacCards[4], OUT BYTE cbNoMagicCards[MAX_COUNT_Poker]);
  141. //分析扑克
  142. VOID AnalysebCardData(const BYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult_Poker & AnalyseResult);
  143. //分析分布 返回的索引是 3-KA2方式
  144. VOID AnalysebDistributing(const BYTE cbCardData[], BYTE cbCardCount, tagDistributing & Distributing);
  145. //分析分布 返回的是 A23-K 方式
  146. VOID AnalyseRealDistributing(const BYTE cbCardData[], BYTE cbCardCount, tagDistributing & Distributing);
  147. //出牌搜索
  148. bool SearchOutCard(const BYTE cbHandCardData[], BYTE cbHandCardCount, const BYTE cbTurnCardData[], BYTE cbTurnCardCount, tagOutCardResult & OutCardResult);
  149. //搜索顺子
  150. bool SearchLinkCard( const BYTE cbHandCardData[],BYTE cbHandCardCount,const BYTE cbFirstCardData,const BYTE cbLastCardData,tagOutCardResult &OutCardResult );
  151. //设置癞子模式 2 双癞子 1 单癞子 0 无癞子
  152. void SetMagicType(BYTE nMode);
  153. BYTE GetMagicType();
  154. BYTE GetCardCount(const BYTE cbCardData[], BYTE MAX_CardNum = MAX_COUNT_Poker);
  155. BYTE GetCardMagicCount(const BYTE cbCardData[], BYTE CardCount);
  156. //判断是否要得起上家的牌
  157. /*
  158. cbCardData 上次出的牌
  159. UserCards 当前玩家手牌
  160. */
  161. BOOL bCanOutCard(const BYTE cbCardData[], BYTE cbCount, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  162. //递归寻找 是否有比当前牌大是同排 22 333 4444 55555 666666
  163. BOOL HaveCanOutCard(BYTE cbCardLogicValue, BYTE SameCardCount, const BYTE UserCards[], BYTE cbUserCount,std::vector<HitStruct> &ListHit);
  164. // 根据bomoinfo 计算线级
  165. void SetBomoLevel(BomoType & BomoInfo);
  166. //内部函数
  167. private:
  168. //构造扑克
  169. BYTE MakeCardData(BYTE cbValueIndex, BYTE cbColorIndex);
  170. //构造扑克
  171. BYTE MakeRealCardData(BYTE cbValueIndex,BYTE cbColorIndex);
  172. //是否连牌
  173. bool IsStructureLink(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCellCount,bool bSpecial=false);
  174. bool IsStructureLink_zhengxu(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCellCount, bool bSpecial = false);
  175. //提示
  176. //备注 提示牌 不用拆排炸
  177. void HintSignle(const BYTE cbCardData[], BYTE cbCount, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  178. // 只负责 2 张 3张的同牌
  179. void HintSameCardCount(const BYTE cbCardData[], BYTE cbCount,BYTE FindCount, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit, BOOL IsAll);
  180. //从3 -8张中 找指定张数
  181. void HintSameCardCount_WithFindCount(const BYTE cbCardData[], BYTE cbCount, BYTE nFindCount, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  182. //只负责连对 556677
  183. void HintDOUBLE_LINK(const BYTE cbCardData[], BYTE cbCount, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  184. //只负责连三张 555666777
  185. void HintTHREE_LINK(const BYTE cbCardData[], BYTE cbCount, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  186. //只负责顺子
  187. void HintSHUNZI(const BYTE cbCardData[], BYTE cbCount, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  188. //只负责 4张 基础炸弹 WithJoker 是否计算王提示
  189. void HintBoom(const BYTE cbCardData[], BYTE cbCount,BYTE cbCardType, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit,BOOL WithJoker);
  190. void AllSameBomos(const BYTE cbCardData[], BYTE cbCount,BYTE SameFromCount, BYTE cbCardType, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit, BOOL WithJoker);
  191. //负责特殊牌 按照线 计算
  192. void HintBomoWithXian(const BYTE cbCardData[], BYTE cbCount, BYTE type, BomoType BomoInfo, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  193. void HintBomoWithLian(const BYTE cbCardData[], BYTE cbCount, BYTE type, BomoType BomoInfo, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  194. //获取王的个数
  195. BYTE GetMagicJokerCount(const BYTE cbCardData[], BYTE cbCount,BYTE MagicCards[4]);
  196. BYTE GetMagicJokerCount(tagDistributing tag, BYTE MagicCards[4]);
  197. BOOL CardIsMagicJoker(BYTE cbCard);
  198. //获取 同牌的X想炸弹
  199. BOOL FindSameXianBomo(const BYTE cbCardData[], BYTE cbCount, BomoType bomoinfo, tagDistributing tagDsit, std::vector<HitStruct> &ListHit);
  200. BOOL FindSameXianBomoWithJoker(const BYTE cbCardData[], BYTE cbCount,BYTE xian, BYTE type, BomoType bomoinfo, tagDistributing tagDsit, tagAnalyseResult_Poker tagReslt, std::vector<HitStruct> &ListHit);
  201. BOOL Find4Fu4xian(const BYTE cbCardData[], BYTE cbCount, BYTE xian, BYTE type, BomoType bomoinfo, tagDistributing tagDsit, tagAnalyseResult_Poker tagReslt, std::vector<HitStruct> &ListHit);
  202. BOOL Find4Fu4xianWithJoker(const BYTE cbCardData[], BYTE cbCount, BYTE xian, BYTE type, BomoType bomoinfo, tagDistributing tagDsit, tagAnalyseResult_Poker tagReslt, std::vector<HitStruct> &ListHit);
  203. BOOL FindNFuMxian(const BYTE cbCardData[], BYTE cbCount,BYTE fU, BYTE xian, BYTE type, BomoType bomoinfo, tagDistributing tagDsit, tagAnalyseResult_Poker tagReslt, std::vector<HitStruct> &ListHit);
  204. //获取所有5线炸弹
  205. BOOL FindAll5XianBomo(const BYTE cbCardData[], BYTE cbCount, BYTE type, BomoType bomoinfo, tagDistributing tagDsit, tagAnalyseResult_Poker tagReslt, std::vector<HitStruct> &ListHit, const BYTE cbUserCardData[], BYTE cbUserCount);
  206. void FindShunZI(const BYTE cbCardData[], BYTE bCount, BYTE nFindCount,vector<vector<BYTE>>& result);
  207. BOOL HintShunWithJoker(const BYTE cbCardData[], BYTE cbCount, BYTE type, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  208. //计算顺子 连对 连三张 需要几个magic 能够组成
  209. /*
  210. tagindex 从第几张牌开始取
  211. liancount 取几张
  212. typecount 每个牌需要几张
  213. */
  214. BYTE CalcuTagDistStructureLinkNeedMagicCount(tagDistributing tag, BYTE tagIndex, BYTE LianCount, BYTE TypeCount, BYTE cbOutCards[MAX_COUNT_Poker],BYTE cbOutCardsNoJoker[MAX_COUNT_Poker]);
  215. //查找到所有特殊牌
  216. BYTE FindAllPaiBomoCards(tagDistributing tagDsit, tagAnalyseResult_Poker tagReslt, LastCardsInfo stLastCardsInfo, std::vector<HitStruct> &ListHit);
  217. public:
  218. //从 cards中 选择 几个字符串 进行组合
  219. vector<vector<BYTE>> CardSecret(const BYTE Cards[], BYTE cbCount, int nLen, BYTE LastMaxCard);
  220. void CardPerm(const BYTE str[], BYTE strCount, int nLen, vector<BYTE>& ve, vector<vector<BYTE>>& result, BYTE LastMaxCard);
  221. //根据cbCardIndexFormTag 计算当前手牌是否能够组成特殊牌
  222. BOOL FromIndexToHitList(vector<BYTE> cbCardIndexFormTag, BYTE nTongCardCount, tagDistributing tagDsit, LastCardsInfo stLastCardsInfo, std::vector<HitStruct> &ListHit);
  223. BOOL CompareCardBigLastCards(BomoType lastUserBomoInfo, BYTE cbLastCards[],BYTE cbLastCardCount, BomoType MyBomoTypeFInfo,BYTE cbCards[],BYTE cbCardCount);
  224. //获取大于某个 线级的 所有X 相炸弹
  225. BOOL GetAllSameCards(BYTE StartLevel, std::vector<HitStruct> &ListHit, tagDistributing tagDsit);
  226. //给一个数组 赋值相同的牌
  227. void CopyOneCardToArry(BYTE cbDstCards[], BYTE CopyCount, BYTE cbCard);
  228. void CopyJokerCardToArry(BYTE cbDstCards[],BYTE cbCopyCount, BYTE cbJokerCards[4]);
  229. BOOL NoJokerBigUserCards(BYTE TagIndex, BYTE cbCardCount,const BYTE cbUserCards[], BYTE cbcCount);
  230. //写一个函数 查看其4种牌的组合+王 是否能够组成4付4线
  231. BOOL CanZuCheng44(vector<BYTE> vIndex,tagDistributing tagDsit,std::vector<HitStruct> &ListHit);
  232. //获取3W炸弹
  233. BOOL Find3WBomo(const BYTE cbCardData[], BYTE cbCount, BYTE type, BomoType BomoInfo, tagDistributing tag, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  234. //获取4W炸弹
  235. BOOL Find4WBomo(const BYTE cbCardData[], BYTE cbCount, BYTE type, BomoType BomoInfo, tagDistributing tag, const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  236. //自由 提示所有一样的牌 单张 2张 3张 当没有123时 提示4张 -8张 双王 然后N付N线 N线N连
  237. //
  238. BOOL FindAllHit(const BYTE UserCards[], BYTE cbUserCount, std::vector<HitStruct> &ListHit);
  239. //
  240. int rand9xianInfo(BomoType &info);
  241. BOOL bFind9xianCards(vector<vector<BYTE>> &AllCards, BYTE cbCardBuffer[], BYTE& cbBufferCount, BomoType& Bomo,BOOL isXian);
  242. //随机取一个值 并把index删掉
  243. BYTE RandIndexAndDelIt(vector<BYTE>& CardIndex);
  244. };
  245. //////////////////////////////////////////////////////////////////////////
  246. #pragma pack()
  247. #endif