诸暨麻将添加redis
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

4097 linhas
105 KiB

  1. #include "StdAfx.h"
  2. #include "GameLogic_dcs.h"
  3. #include "math.h"
  4. #include "TableFrameSink_dcs.h"
  5. #include "fstream"
  6. //////////////////////////////////////////////////////////////////////////
  7. //////////////////////////////////////////////////////////////////////////
  8. //静态变量
  9. //麻将数据
  10. BYTE const CGameLogic_dcs::m_cbCardDataArray_ZJ[MAX_REPERTORY_ZJ] =
  11. {
  12. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, //万子
  13. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, //万子
  14. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, //万子
  15. 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, //万子
  16. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, //索子
  17. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, //索子
  18. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, //索子
  19. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, //索子
  20. 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, //同子
  21. 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, //同子
  22. 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, //同子
  23. 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, //同子
  24. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, //风东南西北
  25. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, //风东南西北
  26. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, //风东南西北
  27. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, //风东南西北 中发白
  28. };
  29. //////////////////////////////////////////////////////////////////////////
  30. BYTE const CGameLogic_dcs::m_cbCardDataArray_ZJ_Two[MAX_REPERTORY_ZJ_Two] =
  31. {
  32. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, //索子
  33. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, //索子
  34. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, //索子
  35. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, //索子
  36. 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, //同子
  37. 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, //同子
  38. 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, //同子
  39. 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, //同子
  40. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, //风东南西北
  41. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, //风东南西北
  42. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, //风东南西北
  43. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, //风东南西北 中发白
  44. };
  45. //构造函数
  46. CGameLogic_dcs::CGameLogic_dcs(CTableFrameSink_dcs* pTableFramSink)
  47. {
  48. m_cbMagicIndexFirst = MAX_INDEX;
  49. m_cbMagicIndexSecond = MAX_INDEX;
  50. m_pTableFramSink = pTableFramSink;
  51. }
  52. //析构函数
  53. CGameLogic_dcs::~CGameLogic_dcs()
  54. {
  55. }
  56. //混乱扑克
  57. BYTE CGameLogic_dcs::RandCardData(BYTE cbCardData[])
  58. {
  59. BYTE cbCardDataTemp[MAX_REPERTORY_ZJ];
  60. BYTE cbMaxCount = 0;
  61. CopyMemory(cbCardDataTemp, m_cbCardDataArray_ZJ, sizeof(m_cbCardDataArray_ZJ));
  62. cbMaxCount = MAX_REPERTORY_ZJ;
  63. //}
  64. //混乱扑克
  65. BYTE cbRandCount = 0, cbPosition = 0;
  66. srand((unsigned)time(NULL));
  67. do
  68. {
  69. cbPosition = rand() % (cbMaxCount - cbRandCount);
  70. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  71. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  72. } while (cbRandCount < cbMaxCount);
  73. cbRandCount = 0, cbPosition = 0;
  74. ZeroMemory(cbCardDataTemp, sizeof(cbCardDataTemp));
  75. CopyMemory(cbCardDataTemp, cbCardData, sizeof(cbCardDataTemp));
  76. ZeroMemory(cbCardData, sizeof(cbCardData));
  77. srand((unsigned)time(NULL));
  78. do
  79. {
  80. cbPosition = rand() % (cbMaxCount - cbRandCount);
  81. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  82. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  83. } while (cbRandCount < cbMaxCount);
  84. return cbMaxCount;
  85. }
  86. BYTE CGameLogic_dcs::RandCardData_Two(BYTE cbCardData[])
  87. {
  88. BYTE cbCardDataTemp[MAX_REPERTORY_ZJ_Two];
  89. BYTE cbMaxCount = 0;
  90. CopyMemory(cbCardDataTemp, m_cbCardDataArray_ZJ_Two, sizeof(m_cbCardDataArray_ZJ_Two));
  91. cbMaxCount = MAX_REPERTORY_ZJ_Two;
  92. //}
  93. //混乱扑克
  94. BYTE cbRandCount = 0, cbPosition = 0;
  95. srand((unsigned)time(NULL));
  96. do
  97. {
  98. cbPosition = rand() % (cbMaxCount - cbRandCount);
  99. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  100. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  101. } while (cbRandCount < cbMaxCount);
  102. cbRandCount = 0, cbPosition = 0;
  103. ZeroMemory(cbCardDataTemp, sizeof(cbCardDataTemp));
  104. CopyMemory(cbCardDataTemp, cbCardData, sizeof(cbCardDataTemp));
  105. ZeroMemory(cbCardData, sizeof(cbCardData));
  106. srand((unsigned)time(NULL));
  107. do
  108. {
  109. cbPosition = rand() % (cbMaxCount - cbRandCount);
  110. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  111. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  112. } while (cbRandCount < cbMaxCount);
  113. return cbMaxCount;
  114. }
  115. //删除扑克
  116. bool CGameLogic_dcs::RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard)
  117. {
  118. //效验扑克
  119. ASSERT(IsValidCard(cbRemoveCard));
  120. ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard)]>0);
  121. //删除扑克
  122. BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard);
  123. if (cbCardIndex[cbRemoveIndex]>0)
  124. {
  125. cbCardIndex[cbRemoveIndex]--;
  126. return true;
  127. }
  128. //失败效验
  129. ASSERT(FALSE);
  130. return false;
  131. }
  132. //删除扑克
  133. bool CGameLogic_dcs::RemoveCard(BYTE cbCardIndex[MAX_INDEX], const BYTE cbRemoveCard[], BYTE cbRemoveCount)
  134. {
  135. //删除扑克
  136. for (BYTE i=0;i<cbRemoveCount;i++)
  137. {
  138. //效验扑克
  139. ASSERT(IsValidCard(cbRemoveCard[i]));
  140. ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard[i])]>0);
  141. //删除扑克
  142. BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard[i]);
  143. if (cbCardIndex[cbRemoveIndex]==0)
  144. {
  145. //错误断言
  146. ASSERT(FALSE);
  147. //还原删除
  148. for (BYTE j=0;j<i;j++)
  149. {
  150. ASSERT(IsValidCard(cbRemoveCard[j]));
  151. cbCardIndex[SwitchToCardIndex(cbRemoveCard[j])]++;
  152. }
  153. return false;
  154. }
  155. else
  156. {
  157. //删除扑克
  158. --cbCardIndex[cbRemoveIndex];
  159. }
  160. }
  161. return true;
  162. }
  163. //删除扑克
  164. bool CGameLogic_dcs::RemoveCard(BYTE cbCardData[], BYTE cbCardCount, const BYTE cbRemoveCard[], BYTE cbRemoveCount)
  165. {
  166. //检验数据
  167. ASSERT(cbCardCount<=14);
  168. ASSERT(cbRemoveCount<=cbCardCount);
  169. //定义变量
  170. BYTE cbDeleteCount=0,cbTempCardData[14];
  171. if (cbCardCount>CountArray(cbTempCardData))
  172. return false;
  173. CopyMemory(cbTempCardData,cbCardData,cbCardCount*sizeof(cbCardData[0]));
  174. //置零扑克
  175. for (BYTE i=0;i<cbRemoveCount;i++)
  176. {
  177. for (BYTE j=0;j<cbCardCount;j++)
  178. {
  179. if (cbRemoveCard[i]==cbTempCardData[j])
  180. {
  181. cbDeleteCount++;
  182. cbTempCardData[j]=0;
  183. break;
  184. }
  185. }
  186. }
  187. //成功判断
  188. if (cbDeleteCount!=cbRemoveCount)
  189. {
  190. ASSERT(FALSE);
  191. return false;
  192. }
  193. //清理扑克
  194. BYTE cbCardPos=0;
  195. for (BYTE i=0;i<cbCardCount;i++)
  196. {
  197. if (cbTempCardData[i]!=0)
  198. cbCardData[cbCardPos++]=cbTempCardData[i];
  199. }
  200. return true;
  201. }
  202. void CGameLogic_dcs::SetMagicIndex(BYTE CaiFirstIndex, BYTE CaiSecondIndex){
  203. if (CaiFirstIndex==MAX_INDEX&&CaiSecondIndex==MAX_INDEX)
  204. {
  205. m_MagicType = MagicType_NoMagic;
  206. return;
  207. }
  208. if (CaiSecondIndex == MAX_INDEX || CaiFirstIndex == MAX_INDEX)
  209. {
  210. m_MagicType = MagicType_OneMagic;
  211. m_cbMagicIndexFirst = CaiFirstIndex;
  212. m_cbMagicIndexSecond = CaiSecondIndex;
  213. }
  214. else
  215. {
  216. m_MagicType = MagicType_TwoMagic;
  217. m_cbMagicIndexFirst = CaiFirstIndex;
  218. m_cbMagicIndexSecond = CaiSecondIndex;
  219. }
  220. }
  221. //有效判断
  222. bool CGameLogic_dcs::IsValidCard(BYTE cbCardData)
  223. {
  224. BYTE cbValue=(cbCardData&MASK_VALUE);
  225. BYTE cbColor=(cbCardData&MASK_COLOR)>>4;
  226. return (((cbValue>=1)&&(cbValue<=9)&&(cbColor<=2))||((cbValue>=1)&&(cbValue<=7)&&(cbColor==3)));
  227. }
  228. //扑克数目
  229. BYTE CGameLogic_dcs::GetCardCount(const BYTE cbCardIndex[MAX_INDEX])
  230. {
  231. //数目统计
  232. BYTE cbCardCount=0;
  233. for (BYTE i=0;i<MAX_INDEX;i++)
  234. cbCardCount+=cbCardIndex[i];
  235. return cbCardCount;
  236. }
  237. //获取组合
  238. BYTE CGameLogic_dcs::GetWeaveCard(int cbWeaveKind, BYTE cbCenterCard, const BYTE cbMargicOffset[4], BYTE cbCardBuffer[4])
  239. {
  240. //组合扑克
  241. switch (cbWeaveKind)
  242. {
  243. case WIK_LEFT: //上牌操作
  244. {
  245. //设置变量
  246. cbCardBuffer[0]=cbCenterCard;
  247. cbCardBuffer[1]=cbCenterCard+1;
  248. cbCardBuffer[2]=cbCenterCard+2;
  249. return 3;
  250. }
  251. case WIK_RIGHT: //上牌操作
  252. {
  253. //设置变量
  254. cbCardBuffer[0]=cbCenterCard;
  255. cbCardBuffer[1]=cbCenterCard-1;
  256. cbCardBuffer[2]=cbCenterCard-2;
  257. return 3;
  258. }
  259. case WIK_CENTER: //上牌操作
  260. {
  261. //设置变量
  262. cbCardBuffer[0]=cbCenterCard;
  263. cbCardBuffer[1]=cbCenterCard-1;
  264. cbCardBuffer[2]=cbCenterCard+1;
  265. return 3;
  266. }
  267. case WIK_PENG: //碰牌操作
  268. {
  269. //设置变量
  270. cbCardBuffer[0]=cbCenterCard;
  271. cbCardBuffer[1]=cbCenterCard;
  272. cbCardBuffer[2]=cbCenterCard;
  273. return 3;
  274. }
  275. case WIK_AN_GANG: //杠牌操作
  276. {
  277. //设置变量
  278. cbCardBuffer[0]=cbCenterCard;
  279. cbCardBuffer[1]=cbCenterCard;
  280. cbCardBuffer[2]=cbCenterCard;
  281. cbCardBuffer[3]=cbCenterCard;
  282. return 4;
  283. }
  284. case WIK_MING_GANG: //明杠牌操作
  285. {
  286. //设置变量
  287. cbCardBuffer[0] = cbCenterCard;
  288. cbCardBuffer[1] = cbCenterCard;
  289. cbCardBuffer[2] = cbCenterCard;
  290. cbCardBuffer[3] = cbCenterCard;
  291. return 4;
  292. }
  293. case WIK_BU_GANG:
  294. {
  295. cbCardBuffer[0] = cbCenterCard;
  296. cbCardBuffer[1] = cbCenterCard;
  297. cbCardBuffer[2] = cbCenterCard;
  298. cbCardBuffer[3] = cbCenterCard;
  299. return 4;
  300. }
  301. case WIK_DAN_AN_GANG: //暗杠牌操作
  302. {
  303. //设置变量
  304. cbCardBuffer[0] = cbCenterCard;
  305. cbCardBuffer[1] = cbMargicOffset[0];
  306. cbCardBuffer[2] = cbCenterCard;
  307. cbCardBuffer[3] = cbCenterCard;
  308. return 4;
  309. }
  310. case WIK_DAN_MING_GANG:
  311. {
  312. //设置变量
  313. cbCardBuffer[0] = cbCenterCard;
  314. cbCardBuffer[1] = cbMargicOffset[0];
  315. cbCardBuffer[2] = cbCenterCard;
  316. cbCardBuffer[3] = cbCenterCard;
  317. return 4;
  318. }
  319. case WIK_DAN_BU_GANG:
  320. {
  321. //设置变量
  322. cbCardBuffer[0] = cbCenterCard;
  323. cbCardBuffer[1] = cbMargicOffset[0];
  324. cbCardBuffer[2] = cbCenterCard;
  325. cbCardBuffer[3] = cbCenterCard;
  326. return 4;
  327. }
  328. case WIK_DAN_PENG:
  329. {
  330. cbCardBuffer[0] = cbCenterCard;
  331. cbCardBuffer[1] = cbMargicOffset[0];
  332. cbCardBuffer[2] = cbCenterCard;
  333. return 3;
  334. }
  335. case WIK_DAN_CHI:
  336. {
  337. cbCardBuffer[0] = cbCenterCard;
  338. cbCardBuffer[1] = cbMargicOffset[0];
  339. cbCardBuffer[2] = cbMargicOffset[1];
  340. return 3;
  341. }
  342. case WIK_SHUANG_MING_GANG:
  343. {
  344. //设置变量
  345. cbCardBuffer[0] = cbCenterCard;
  346. cbCardBuffer[1] = cbMargicOffset[0];
  347. cbCardBuffer[2] = cbMargicOffset[1];
  348. cbCardBuffer[3] = cbCenterCard;
  349. return 4;
  350. }
  351. case WIK_SHUANG_AN_GANG:
  352. {
  353. //设置变量
  354. cbCardBuffer[0] = cbCenterCard;
  355. cbCardBuffer[1] = cbMargicOffset[0];
  356. cbCardBuffer[2] = cbMargicOffset[1];
  357. cbCardBuffer[3] = cbCenterCard;
  358. return 4;
  359. }
  360. case WIK_SHUANG_PENG:
  361. {
  362. cbCardBuffer[0] = cbCenterCard;
  363. cbCardBuffer[1] = cbMargicOffset[0];
  364. cbCardBuffer[2] = cbMargicOffset[1];
  365. return 3;
  366. }
  367. case WIK_SHUANG_CAICHI:
  368. {
  369. cbCardBuffer[0] = cbCenterCard;
  370. cbCardBuffer[1] = cbMargicOffset[0];
  371. cbCardBuffer[2] = cbMargicOffset[1];
  372. return 3;
  373. }
  374. case WIK_SAN_MING_GANG:
  375. {
  376. //设置变量
  377. cbCardBuffer[0] = cbCenterCard;
  378. cbCardBuffer[1] = cbMargicOffset[0];
  379. cbCardBuffer[2] = cbMargicOffset[1];
  380. cbCardBuffer[3] = cbMargicOffset[2];
  381. return 4;
  382. }
  383. case WIK_SAN_AN_GANG:
  384. {
  385. //设置变量
  386. cbCardBuffer[0] = cbCenterCard;
  387. cbCardBuffer[1] = cbMargicOffset[0];
  388. cbCardBuffer[2] = cbMargicOffset[1];
  389. cbCardBuffer[3] = cbMargicOffset[2];
  390. return 4;
  391. }
  392. case WIK_QUANG_AN_GANG:
  393. {
  394. //设置变量
  395. cbCardBuffer[0] = cbMargicOffset[0];
  396. cbCardBuffer[1] = cbMargicOffset[1];
  397. cbCardBuffer[2] = cbMargicOffset[2];
  398. cbCardBuffer[3] = cbMargicOffset[3];
  399. return 4;
  400. }
  401. default:
  402. {
  403. ASSERT(FALSE);
  404. }
  405. }
  406. return 0;
  407. }
  408. //动作等级,操作特别多
  409. BYTE CGameLogic_dcs::GetUserActionRank(int cbUserAction)
  410. {
  411. //抢杠胡
  412. if (cbUserAction&WIK_ZI_MO||cbUserAction&WIK_Qiang_GANG) { return 13; }
  413. //胡牌等级
  414. if (cbUserAction&(WIK_CHI_HU | WIK_DI_CHIHU) ) { return 12; }
  415. //杠牌等级
  416. if (cbUserAction&WIK_MING_GANG) { return 11; }
  417. //碰牌等级
  418. if (cbUserAction&WIK_PENG) { return 10; }
  419. //上牌等级
  420. if (cbUserAction&(WIK_RIGHT | WIK_CENTER | WIK_LEFT)) { return 9; }
  421. //单财明杠
  422. if (cbUserAction&WIK_DAN_MING_GANG)
  423. {
  424. return 8;
  425. }
  426. //单财神碰
  427. if (cbUserAction&WIK_DAN_PENG) { return 7; }
  428. //单财神上牌等级
  429. if (cbUserAction&WIK_DAN_CHI) { return 6; }
  430. //双财明杠
  431. if (cbUserAction&WIK_SHUANG_MING_GANG){ return 5; }
  432. //双财神碰
  433. if (cbUserAction&WIK_SHUANG_PENG)return 4;
  434. //双财吃
  435. if (cbUserAction&WIK_SHUANG_CAICHI)return 3;
  436. //三财明杠
  437. if (cbUserAction&WIK_SAN_MING_GANG)return 2;
  438. if (cbUserAction&WIK_ZAHU)return 1;
  439. if (cbUserAction == WIK_NULL )
  440. {
  441. return 0;
  442. }
  443. ASSERT(FALSE);
  444. return 0;
  445. }
  446. //吃牌判断
  447. int CGameLogic_dcs::EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  448. {
  449. //参数效验
  450. ASSERT(IsValidCard(cbCurrentCard));
  451. //过滤判断
  452. if ( cbCurrentCard>=0x31 || IsMagicCard(cbCurrentCard) )
  453. return WIK_NULL;
  454. //吃牌判断
  455. int cbEatKind = 0;
  456. BYTE cbCurrentIndex=SwitchToCardIndex(cbCurrentCard);
  457. //获取手牌财神牌数目
  458. BYTE CaiShenCount = GetMaigcCardCount(cbCardIndex);
  459. if (CaiShenCount > 1)
  460. {
  461. cbEatKind = WIK_SHUANG_CAICHI;
  462. }
  463. if (CaiShenCount > 0)
  464. {
  465. BYTE TempCardIndex[MAX_INDEX] = { 0 };
  466. CopyMemory(TempCardIndex, cbCardIndex, sizeof(TempCardIndex));
  467. // TempCardIndex[m_cbMagicIndexFirst] = 0;
  468. // TempCardIndex[m_cbMagicIndexSecond] = 0;
  469. DeleteMagicCards(TempCardIndex);
  470. BYTE cbFirstIndex = 0;
  471. BYTE cbExcursion[3] = { 0, 1, 2 };
  472. BYTE cbItemKind[3] = { WIK_DAN_CHI, WIK_DAN_CHI, WIK_DAN_CHI };
  473. for (BYTE i = 0; i < CountArray(cbItemKind); i++)
  474. {
  475. BYTE cbValueIndex = cbCurrentIndex % 9;
  476. if ((cbValueIndex >= cbExcursion[i]) && ((cbValueIndex - cbExcursion[i]) <= 6))
  477. {
  478. //吃牌判断
  479. cbFirstIndex = cbCurrentIndex - cbExcursion[i];
  480. if ((TempCardIndex[cbFirstIndex ] >= 1 && (cbFirstIndex != cbCurrentIndex))
  481. ||(TempCardIndex[cbFirstIndex + 1] >= 1 && (cbFirstIndex + 1 != cbCurrentIndex))
  482. || ((cbFirstIndex + 2 != cbCurrentIndex) && TempCardIndex[cbFirstIndex + 2] >= 1))
  483. {
  484. cbEatKind |= cbItemKind[i];
  485. }
  486. }
  487. }
  488. }
  489. BYTE cbExcursion[3] = { 0, 1, 2 };
  490. BYTE cbItemKind[3] = { WIK_LEFT, WIK_CENTER, WIK_RIGHT };
  491. //吃牌判断
  492. BYTE cbFirstIndex = 0;
  493. BYTE szTmpIndex[MAX_INDEX] = { 0 };
  494. CopyMemory(szTmpIndex, cbCardIndex, MAX_INDEX);
  495. DeleteMagicCards(szTmpIndex);//删除财神牌,再来判断是否吃
  496. for (BYTE i = 0; i < CountArray(cbItemKind); i++)
  497. {
  498. BYTE cbValueIndex = cbCurrentIndex % 9;
  499. if ((cbValueIndex >= cbExcursion[i]) && ((cbValueIndex - cbExcursion[i]) <= 6))
  500. {
  501. //吃牌判断
  502. cbFirstIndex = cbCurrentIndex - cbExcursion[i];
  503. if ((cbCurrentIndex != cbFirstIndex) && (szTmpIndex[cbFirstIndex] == 0))
  504. continue;
  505. if ((cbCurrentIndex != (cbFirstIndex + 1)) && (szTmpIndex[cbFirstIndex + 1] == 0))
  506. continue;
  507. if ((cbCurrentIndex != (cbFirstIndex + 2)) && (szTmpIndex[cbFirstIndex + 2] == 0))
  508. continue;
  509. //设置类型
  510. cbEatKind |= cbItemKind[i];
  511. }
  512. }
  513. return cbEatKind;
  514. }
  515. //碰牌判断
  516. int CGameLogic_dcs::EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  517. {
  518. int Operator = 0;
  519. //参数效验
  520. ASSERT(IsValidCard(cbCurrentCard));
  521. //过滤判断
  522. if (IsMagicCard(cbCurrentCard))
  523. return WIK_NULL;
  524. BYTE CaiShenCount = GetMaigcCardCount(cbCardIndex);
  525. if (CaiShenCount>1)
  526. {
  527. Operator = WIK_SHUANG_PENG;
  528. }
  529. if (CaiShenCount>0)
  530. {
  531. if (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]>0)
  532. {
  533. Operator |= WIK_DAN_PENG;
  534. }
  535. }
  536. Operator |= ((cbCardIndex[SwitchToCardIndex(cbCurrentCard)] >= 2) ? WIK_PENG : WIK_NULL);
  537. //碰牌判断
  538. return Operator;
  539. }
  540. //杠牌判断
  541. int CGameLogic_dcs::EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  542. {
  543. int Operator = WIK_NULL;
  544. //参数效验
  545. ASSERT(IsValidCard(cbCurrentCard));
  546. //过滤判断
  547. if ( IsMagicCard(cbCurrentCard) )
  548. return WIK_NULL;
  549. BYTE index = SwitchToCardIndex(cbCurrentCard);
  550. BYTE CaiShenCount = GetMaigcCardCount(cbCardIndex);
  551. if (CaiShenCount > 2)
  552. {
  553. Operator = WIK_SAN_MING_GANG;
  554. }
  555. if (CaiShenCount > 1)
  556. {
  557. if (cbCardIndex[index] > 0)
  558. Operator |= WIK_SHUANG_MING_GANG;
  559. }
  560. if (CaiShenCount > 0)
  561. {
  562. if (cbCardIndex[index] > 1)
  563. {
  564. Operator |= WIK_DAN_MING_GANG;
  565. }
  566. }
  567. Operator |= (cbCardIndex[index] == 3) ? WIK_MING_GANG : WIK_NULL;
  568. //杠牌判断
  569. return Operator;
  570. }
  571. //杠牌分析
  572. // 修改杠牌提供的顺序 [9/4/2017 Zoro]
  573. int CGameLogic_dcs::AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult)
  574. {
  575. //设置变量
  576. int cbActionMask = WIK_NULL;
  577. BYTE TempCardIndex[MAX_INDEX];
  578. ZeroMemory(TempCardIndex, sizeof(TempCardIndex));
  579. ZeroMemory(&GangCardResult, sizeof(GangCardResult));
  580. CopyMemory(TempCardIndex, cbCardIndex, sizeof(TempCardIndex));
  581. BYTE nMagicCount = GetMaigcCardCount(cbCardIndex);
  582. //手上杠牌
  583. for (BYTE i = 0; i < MAX_INDEX; i++)
  584. {
  585. if (IsMagicCard(SwitchToCardData(i)))
  586. {
  587. continue;
  588. }
  589. if (cbCardIndex[i] == 4)
  590. {
  591. BYTE cbCardData = SwitchToCardData(i);
  592. cbActionMask |= WIK_AN_GANG;
  593. if (GangCardResult.cbCardCount < 6){
  594. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = cbCardData;
  595. }
  596. }
  597. }
  598. if (nMagicCount > 0)//单财杠
  599. {
  600. for (BYTE i = 0; i < MAX_INDEX; i++)
  601. {
  602. if (IsMagicCard(SwitchToCardData(i)))
  603. {
  604. continue;
  605. }
  606. if (TempCardIndex[i] >= 3)
  607. {
  608. cbActionMask |= WIK_DAN_AN_GANG;
  609. if (GangCardResult.cbCardCount < 6){
  610. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = SwitchToCardData(i) | 0x0200;
  611. }
  612. }
  613. }
  614. }
  615. // [9/4/2017 Zoro]
  616. //先计算组合正杠
  617. //组合杠牌
  618. for (BYTE i = 0; i < cbWeaveCount; i++)
  619. {
  620. if (WeaveItem[i].cbWeaveKind & (WIK_PENG | WIK_DAN_PENG | WIK_SHUANG_PENG))
  621. {
  622. if (cbCardIndex[SwitchToCardIndex(WeaveItem[i].cbCenterCard)] >= 1)
  623. {
  624. cbActionMask |= WIK_BU_GANG;
  625. if (GangCardResult.cbCardCount < 6){
  626. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = WeaveItem[i].cbCenterCard | 0x0100;
  627. }
  628. }
  629. }
  630. }
  631. //在计算组合单财杠
  632. for (BYTE i = 0; i < cbWeaveCount; i++)
  633. {
  634. if (WeaveItem[i].cbWeaveKind & (WIK_PENG | WIK_DAN_PENG | WIK_SHUANG_PENG))
  635. {
  636. if (nMagicCount> 0)
  637. {
  638. cbActionMask |= WIK_DAN_BU_GANG;
  639. if (GangCardResult.cbCardCount<6)
  640. {
  641. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = WeaveItem[i].cbCenterCard | 0x0800;
  642. }
  643. }
  644. }
  645. }
  646. if (nMagicCount > 1)//双财杠
  647. {
  648. for (BYTE i = 0; i < MAX_INDEX; i++)
  649. {
  650. if (IsMagicCard(SwitchToCardData(i)))
  651. {
  652. continue;
  653. }
  654. if (TempCardIndex[i] >= 2)
  655. {
  656. cbActionMask |= WIK_SHUANG_AN_GANG;
  657. if (GangCardResult.cbCardCount<6)
  658. {
  659. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = SwitchToCardData(i) | 0x0400;
  660. }
  661. }
  662. }
  663. }
  664. if (nMagicCount>3)
  665. {
  666. cbActionMask |= WIK_QUANG_AN_GANG;
  667. //GangCardResult.cbCardData[GangCardResult.cbCardCount++] = m_cbLaiZiData;
  668. }
  669. if (nMagicCount > 2)
  670. {
  671. cbActionMask |= WIK_SAN_AN_GANG;
  672. }
  673. if (GangCardResult.cbCardCount>6)
  674. {
  675. GangCardResult.cbCardCount = 6;
  676. }
  677. return cbActionMask;
  678. }
  679. //胡牌分析,bFlag默认false表示正常胡牌,true标示杠上花
  680. int CGameLogic_dcs::AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard,
  681. CChiHuRight &ChiHuRight, BYTE& nHuTai, bool bFlag, bool bQiangGangFlag)
  682. {
  683. nHuTai = 0;
  684. BYTE cbTmpCardIndex[MAX_INDEX] = { 0 };
  685. CopyMemory(cbTmpCardIndex, cbCardIndex, MAX_INDEX);
  686. cbTmpCardIndex[SwitchToCardIndex(cbCurrentCard)]++;
  687. BYTE CaiShenCount = GetMaigcCardCount(cbTmpCardIndex);
  688. /*抢杠胡 特殊处理*/
  689. if (bQiangGangFlag&&CaiShenCount!=0)
  690. {
  691. return AnalyseChiHuCard_DeleteMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, ChiHuRight, nHuTai, bFlag, bQiangGangFlag);
  692. }
  693. /*抢杠胡 特殊处理*/
  694. if (AnalyseCardNew(cbTmpCardIndex, WeaveItem, cbWeaveCount))
  695. {
  696. m_cbHuCard = cbCurrentCard;
  697. int TmpJiangInColor = mJiangInColor;
  698. mSunTaiJiangInColor = mJiangInColor;
  699. int nTai = AnalyseCardTaiNum(cbTmpCardIndex, WeaveItem, cbWeaveCount);
  700. //如果胡了 而且将是在风牌中,且东中发白有一个为1且没有风牌刻字 且全顺 则不能胡
  701. //DebugLog(_T("胡了 %02x 台数=%d\r\n"), cbCurrentCard, nTai);
  702. if (nTai > 0 || bFlag || bQiangGangFlag)
  703. {
  704. if (bFlag)
  705. {
  706. nTai++;
  707. }
  708. if (bQiangGangFlag)
  709. {
  710. nTai++;
  711. }
  712. if (nTai >= 3)
  713. {
  714. if (AnalyseCardTaiNum_IsDuMagic(cbTmpCardIndex, WeaveItem, cbWeaveCount))
  715. {
  716. nTai++;
  717. mChiHuRight |= ZJ_TAI_Gang;//定财神 此值 用作 独财胡
  718. }
  719. if (AnalyseCardTaiNum_IsQuanZi(cbTmpCardIndex, WeaveItem, cbWeaveCount))
  720. {
  721. nTai = 7;
  722. mChiHuRight |= ZJ_TAI_QuanZi;
  723. }
  724. if (AnalyseCardTaiNum_IsWuMagic(cbTmpCardIndex, WeaveItem, cbWeaveCount))
  725. {
  726. nTai = 7;
  727. mChiHuRight |= ZJ_TAI_WuMagic;
  728. }
  729. }
  730. nHuTai = nTai;
  731. ChiHuRight = mChiHuRight;
  732. if (nHuTai>=3)
  733. {
  734. return WIK_ZI_MO;
  735. }
  736. return WIK_NULL;
  737. }
  738. return WIK_NULL;
  739. }
  740. return WIK_NULL;
  741. }
  742. //
  743. bool CGameLogic_dcs::AnalyseCardNew(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  744. {
  745. BYTE TmpcbCardIndex[MAX_INDEX] = { 0 };
  746. CopyMemory(TmpcbCardIndex, cbCardIndex, MAX_INDEX);
  747. int nCurrentMagicCount = DeleteMagicCards(TmpcbCardIndex);
  748. int nHaveGangCount = 0;
  749. for (int i = 0; i < MAX_INDEX; i++)
  750. {
  751. if (TmpcbCardIndex[i] == 4)
  752. {
  753. // TmpcbCardIndex[i] = 0;
  754. nHaveGangCount++;
  755. }
  756. }
  757. if (nCurrentMagicCount==2&& GetCardCount(TmpcbCardIndex)==0)
  758. {
  759. return true;
  760. }
  761. bool bHu = TestHu(TmpcbCardIndex, nCurrentMagicCount, WeaveItem, cbWeaveCount);
  762. if (bHu)
  763. {
  764. return true;
  765. }
  766. else
  767. {
  768. if (nHaveGangCount > 0)
  769. {
  770. CopyMemory(TmpcbCardIndex, cbCardIndex, MAX_INDEX);
  771. int nCurrentMagicCount = DeleteMagicCards(TmpcbCardIndex);
  772. if (TestHu(TmpcbCardIndex, nCurrentMagicCount, WeaveItem, cbWeaveCount))
  773. {
  774. return true;
  775. }
  776. for (int i = 0; i < MAX_INDEX; i++)
  777. {
  778. if (TmpcbCardIndex[i] == 4)
  779. {
  780. TmpcbCardIndex[i] = 1;
  781. }
  782. }
  783. return TestHu(TmpcbCardIndex, nCurrentMagicCount, WeaveItem, cbWeaveCount);
  784. }
  785. }
  786. return bHu;
  787. }
  788. //
  789. bool CGameLogic_dcs::TestHu(const BYTE cbCardIndex[MAX_INDEX], int nCurrentMagicCount, const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  790. {
  791. //////////////////////////////////////////////////////////////////////////
  792. mJiangInColor = -1;
  793. mNeedMinMagicNum = 8;
  794. BYTE cbCardDataWan[MAX_COUNT] = { 0 };
  795. int nCount;
  796. int WanNeedMagicCount, TiaoNeedMagicCount, BingNeedMagicCount, FengNeedMagicCount;//变量分别表示‘万’型需要财神牌数、。。。
  797. int nWanCount, nTiaoCount, nBingCount, nFengCount;
  798. //万
  799. mMagicDataCount = 0;
  800. ZeroMemory(mMagicData, 7);
  801. ZeroMemory(mMagicReplaceCard, MAX_INDEX);
  802. mNeedMinMagicNum = 8;
  803. GetOneColorCards(cbCardIndex, Color_Wan, cbCardDataWan, nCount);
  804. nWanCount = nCount;
  805. GetOneColorNeedMagicCards(cbCardDataWan, nCount, 0);
  806. WanNeedMagicCount = mNeedMinMagicNum;
  807. ShowMagicData();
  808. //////////////////////////////////////////////////////////////////////////
  809. //DebugLog(_T("*********************************************\r\n"));
  810. //条
  811. mMagicDataCount = 0;
  812. ZeroMemory(mMagicData, 7);
  813. mNeedMinMagicNum = 8;
  814. GetOneColorCards(cbCardIndex, Color_Tiao, cbCardDataWan, nCount);
  815. nTiaoCount = nCount;
  816. GetOneColorNeedMagicCards(cbCardDataWan, nCount, 0);
  817. TiaoNeedMagicCount = mNeedMinMagicNum;
  818. ShowMagicData();
  819. //DebugLog(_T("*********************************************\r\n"));
  820. //饼
  821. mMagicDataCount = 0;
  822. ZeroMemory(mMagicData, 7);
  823. mNeedMinMagicNum = 8;
  824. GetOneColorCards(cbCardIndex, Color_Bing, cbCardDataWan, nCount);
  825. nBingCount = nCount;
  826. GetOneColorNeedMagicCards(cbCardDataWan, nCount, 0);
  827. BingNeedMagicCount = mNeedMinMagicNum;
  828. ShowMagicData();
  829. //DebugLog(_T("*********************************************\r\n"));
  830. //风
  831. mMagicDataCount = 0;
  832. ZeroMemory(mMagicData, 7);
  833. mNeedMinMagicNum = 8;
  834. GetOneColorCards(cbCardIndex, Color_Feng, cbCardDataWan, nCount);
  835. nFengCount = nCount;
  836. GetOneColorNeedMagicCards(cbCardDataWan, nCount, 0);
  837. FengNeedMagicCount = mNeedMinMagicNum;
  838. ShowMagicData();
  839. //DebugLog(_T("*********************************************\r\n"));
  840. //将在万中
  841. ShowMagicReplaceData();
  842. //手牌全是财神 且满足3N+2
  843. if (GetCardCount(cbCardIndex) == 0 && nCurrentMagicCount % 3 == 2)
  844. {
  845. mJiangInColor = Color_Wan;
  846. return true;
  847. }
  848. //这个 考虑好了在加 主要用于解决2个杠的问题
  849. // if (WanNeedMagicCount+TiaoNeedMagicCount+BingNeedMagicCount+FengNeedMagicCount== nCurrentMagicCount)
  850. // {
  851. // return true;
  852. //
  853. // }
  854. //判断是否是2杠的牌
  855. int nNeedMagicNum = BingNeedMagicCount + TiaoNeedMagicCount + FengNeedMagicCount;
  856. if (nNeedMagicNum <= nCurrentMagicCount)
  857. {
  858. //DebugLog(_T("jiang in W Need %d Have %d"),nNeedMagicNum,nCurrentMagicCount);
  859. //剩余几个财神 供给单颜色牌手牌
  860. int nHasMagicNum = nCurrentMagicCount - nNeedMagicNum;
  861. BYTE cbTmpCardDataWan[MAX_COUNT] = { 0 };
  862. int nTmpCount;
  863. GetOneColorCards(cbCardIndex, Color_Wan, cbTmpCardDataWan, nTmpCount);
  864. if (nTmpCount>0)
  865. {
  866. if (OneCardsCanHu(cbTmpCardDataWan, nTmpCount, nHasMagicNum))
  867. {
  868. mJiangInColor = Color_Wan;
  869. return true;
  870. }
  871. }
  872. }
  873. //DebugLog(_T("*********************************************\r\n"));
  874. //tiao
  875. nNeedMagicNum = WanNeedMagicCount + BingNeedMagicCount + FengNeedMagicCount;
  876. if (nNeedMagicNum <= nCurrentMagicCount)
  877. {
  878. int nHasNum = nCurrentMagicCount - nNeedMagicNum;
  879. BYTE cbTmpCardDataWan[MAX_COUNT] = { 0 };
  880. int nTmpCount;
  881. GetOneColorCards(cbCardIndex, Color_Tiao, cbTmpCardDataWan, nTmpCount);
  882. if (nTmpCount > 0){
  883. if (OneCardsCanHu(cbTmpCardDataWan, nTmpCount, nHasNum))
  884. {
  885. mJiangInColor = Color_Tiao;
  886. return true;
  887. }
  888. }
  889. }
  890. //DebugLog(_T("*********************************************\r\n"));
  891. //bing
  892. nNeedMagicNum = WanNeedMagicCount + TiaoNeedMagicCount + FengNeedMagicCount;
  893. if (nNeedMagicNum <= nCurrentMagicCount)
  894. {
  895. int nHasNum = nCurrentMagicCount - nNeedMagicNum;
  896. BYTE cbTmpCardDataWan[MAX_COUNT] = { 0 };
  897. int nTmpCount;
  898. GetOneColorCards(cbCardIndex, Color_Bing, cbTmpCardDataWan, nTmpCount);
  899. if (nTmpCount > 0){
  900. if (OneCardsCanHu(cbTmpCardDataWan, nTmpCount, nHasNum))
  901. {
  902. mJiangInColor = Color_Bing;
  903. return true;
  904. }
  905. }
  906. }
  907. //DebugLog(_T("*********************************************\r\n"));
  908. //feng
  909. nNeedMagicNum = WanNeedMagicCount + BingNeedMagicCount + TiaoNeedMagicCount;
  910. if (nNeedMagicNum <= nCurrentMagicCount)
  911. {
  912. int nHasNum = nCurrentMagicCount - nNeedMagicNum;
  913. BYTE cbTmpCardDataWan[MAX_COUNT] = { 0 };
  914. int nTmpCount;
  915. GetOneColorCards(cbCardIndex, Color_Feng, cbTmpCardDataWan, nTmpCount);
  916. if (nTmpCount > 0){
  917. if (OneCardsCanHu(cbTmpCardDataWan, nTmpCount, nHasNum))
  918. {
  919. mJiangInColor = Color_Feng;
  920. //如果将在凤牌中 如果东风做将
  921. //if ((cbCardIndex[27] == 1)
  922. // || (cbCardIndex[31] == 1)
  923. // || (cbCardIndex[32] == 1)
  924. // || (cbCardIndex[33] == 1)
  925. // )
  926. //{
  927. // /* BYTE cbTmpCardIndex[MAX_INDEX] = { 0 };
  928. // CopyMemory(cbTmpCardIndex, cbCardIndex,MAX_INDEX);
  929. // BYTE cbCard[2] = { 0 };
  930. // cbTmpCardIndex[m_cbCaiShenIndex] = nCurrentMagicCount;
  931. // if (IsQuanShun(cbTmpCardIndex,WeaveItem,cbWeaveCount))
  932. // {
  933. // return false;
  934. // }*/
  935. // //if (IsCardsIsHunYiSe(cbTmpCardIndex, WeaveItem, cbWeaveCount) || IsPengPengHu(cbTmpCardIndex,WeaveItem,cbWeaveCount))
  936. // //{
  937. // // return true;
  938. // //}
  939. // //else{
  940. // // ////OutputDebugString(_T("东 中发白 做将,不是混一色 也不是碰碰胡"));
  941. // // return false;
  942. // //}
  943. //}
  944. return true;
  945. }
  946. }
  947. }
  948. //DebugLog(_T("*********************************************\r\n"));
  949. return false;
  950. }
  951. //从cbCardIndex 获取 同一花色nColor的手牌牌值cbCardData与数量CardCount
  952. bool CGameLogic_dcs::GetOneColorCards(const BYTE cbCardIndex[MAX_INDEX], BYTE nColor, BYTE cbCardData[MAX_COUNT], int&CardCount)
  953. {
  954. CardCount = 0;
  955. ZeroMemory(cbCardData, MAX_COUNT);
  956. int nBegin = 0;
  957. int nEnd = 0;
  958. if (nColor == 0)
  959. {
  960. nBegin = 0;
  961. nEnd = 9;
  962. }
  963. if (nColor == 1 || nColor == 2){
  964. nBegin = 9 * nColor;
  965. nEnd = nBegin + 9;
  966. }
  967. if (nColor == 3)
  968. {
  969. nBegin = 9 * nColor;
  970. nEnd = nBegin + 7;
  971. }
  972. for (int i = nBegin; i < nEnd; i++)
  973. {
  974. if (cbCardIndex[i]>0)
  975. {
  976. for (int j = 0; j < cbCardIndex[i]; j++){
  977. cbCardData[CardCount++] = SwitchToCardData(i);//记录该玩家手牌
  978. }
  979. }
  980. }
  981. return true;
  982. }
  983. //cbCardData:手牌中希望作将的同色牌,nCardCount:手牌数量,nMagicCount:剩余可用癞子数量
  984. bool CGameLogic_dcs::OneCardsCanHu(const BYTE cbCardData[MAX_COUNT], int nCardCount, int nMagicCount, bool isQuanShun)
  985. {
  986. if (nCardCount <= 0)
  987. {
  988. //如果没有其他牌做将,那就两个癞子做将(黄石麻将不能2癞子做将)
  989. if (nMagicCount >= 2)
  990. {
  991. return true;
  992. }
  993. return false;
  994. }
  995. BYTE cbCard = cbCardData[0];
  996. for (int i = 0; i < nCardCount; i++)
  997. {
  998. if (i == nCardCount - 1)//如果只有一张牌
  999. {
  1000. if (nMagicCount > 0)
  1001. {
  1002. nMagicCount = nMagicCount - 1;
  1003. mNeedMinMagicNum = 8;
  1004. GetOneColorNeedMagicCards(cbCardData, nCardCount - 1, 0, isQuanShun);//该单花色牌型不需要组成整扑,只需要和一个财神牌组成将
  1005. if (mNeedMinMagicNum <= nMagicCount)
  1006. {
  1007. PrintCards(cbCardData, nCardCount );
  1008. return true;
  1009. }
  1010. nMagicCount += 1;
  1011. }
  1012. }
  1013. else
  1014. {
  1015. if (i + 2 == nCardCount || cbCardData[i] != cbCardData[i + 2])//如果不止两张牌,那可能需要整扑一将(该花色牌)
  1016. {
  1017. //DebugLog(_T("Other Pai %d"),i);
  1018. if (test2Combine(cbCardData[i], cbCardData[i + 1]))
  1019. {
  1020. //DebugLog(_T("i=%d card=%02x card=%02x"), i, cbCardData[i], cbCardData[i + 1]);
  1021. mNeedMinMagicNum = 8;
  1022. BYTE tmpCbCardDatas[MAX_COUNT] = { 0 };
  1023. int TmpCardCount = nCardCount;
  1024. BYTE deleteIndex[2];
  1025. deleteIndex[0] = i;
  1026. deleteIndex[1] = i + 1;//有原始的一对将
  1027. DeleteCardDataFromCardDatas(deleteIndex, 2, cbCardData, TmpCardCount, tmpCbCardDatas);
  1028. TmpCardCount = TmpCardCount - 2;//删除一对将
  1029. //再获取(其他牌和财神牌)能否组成整扑
  1030. GetOneColorNeedMagicCards(tmpCbCardDatas, TmpCardCount, 0, isQuanShun);
  1031. if (mNeedMinMagicNum <= nMagicCount)
  1032. {
  1033. //能胡牌
  1034. PrintCards(tmpCbCardDatas, TmpCardCount);
  1035. return true;
  1036. }
  1037. }
  1038. }
  1039. if (nMagicCount > 0 && cbCardData[i] != cbCardData[i + 1])
  1040. {
  1041. nMagicCount -= 1;
  1042. BYTE tmpCbCardDatas[MAX_COUNT] = { 0 };
  1043. int TmpCardCount = nCardCount;
  1044. BYTE DeleteIndex[1];
  1045. DeleteIndex[0] = i;//做将中的一个,另一个为癞子
  1046. DeleteCardDataFromCardDatas(DeleteIndex, 1, cbCardData, TmpCardCount, tmpCbCardDatas);
  1047. TmpCardCount--;
  1048. mNeedMinMagicNum = 8;
  1049. GetOneColorNeedMagicCards(tmpCbCardDatas, TmpCardCount, 0, isQuanShun);
  1050. if (mNeedMinMagicNum <= nMagicCount)
  1051. {
  1052. PrintCards(tmpCbCardDatas, TmpCardCount);
  1053. return true;
  1054. }
  1055. nMagicCount += 1;
  1056. }
  1057. }
  1058. }
  1059. return false;
  1060. }
  1061. //在数组cbCardData中删除DeleteCount个和数组vDeletIndex元素相同的元素,结果重新组合新的数组cbOutCardDatas
  1062. int CGameLogic_dcs::DeleteCardDataFromCardDatas(const BYTE vDeletIndex[MAX_COUNT], int DeleteCount, const BYTE cbCardData[MAX_COUNT], BYTE nCount, BYTE cbOutCardDatas[MAX_COUNT])
  1063. {
  1064. ZeroMemory(cbOutCardDatas, MAX_COUNT);
  1065. int nPaiCount = 0;
  1066. BYTE tmpData[MAX_COUNT] = { 0 };
  1067. CopyMemory(tmpData, cbCardData, nCount);
  1068. for (int i = 0; i < DeleteCount; i++)
  1069. {
  1070. tmpData[vDeletIndex[i]] = 0;
  1071. }
  1072. for (int i = 0; i < nCount; i++)
  1073. {
  1074. if (tmpData[i] != 0)
  1075. {
  1076. cbOutCardDatas[nPaiCount++] = tmpData[i];
  1077. }
  1078. }
  1079. return true;
  1080. }
  1081. //
  1082. int CGameLogic_dcs::PrintCards(const BYTE cbCardData[MAX_COUNT], int nCout)
  1083. {
  1084. std::wstring StrItems;
  1085. StrItems = _T("PrintCards ");
  1086. for (int i = 0; i < nCout; i++)
  1087. {
  1088. std::wstring item;
  1089. TCHAR szBuffer[MAX_COUNT] = { 0 };
  1090. switch (GetCardColor(cbCardData[i]))
  1091. {
  1092. case Color_Wan:{
  1093. wsprintf(szBuffer, _T("%dW"), GetCardValue(cbCardData[i]));
  1094. break;
  1095. }
  1096. case Color_Tiao:{
  1097. wsprintf(szBuffer, _T("%dT"), GetCardValue(cbCardData[i]));
  1098. break;
  1099. }
  1100. case Color_Bing:{
  1101. wsprintf(szBuffer, _T("%dB"), GetCardValue(cbCardData[i]));
  1102. break;
  1103. }
  1104. case Color_Feng:{
  1105. switch (GetCardValue(cbCardData[i]))
  1106. {
  1107. case 1: _tcscpy_s(szBuffer, _tclen(_T("东")) + 1, _T("东")); break;
  1108. case 2:_tcscpy_s(szBuffer, _tclen(_T("南")) + 1, _T("南")); break;
  1109. case 3: _tcscpy_s(szBuffer, _tclen(_T("西")) + 1, _T("西")); break;
  1110. case 4:_tcscpy_s(szBuffer, _tclen(_T("北")) + 1, _T("北")); break;
  1111. case 5:_tcscpy_s(szBuffer, _tclen(_T("中")) + 1, _T("中")); break;
  1112. case 6: _tcscpy_s(szBuffer, _tclen(_T("发")) + 1, _T("发")); break;
  1113. case 7:_tcscpy_s(szBuffer, _tclen(_T("白")) + 1, _T("白")); break;
  1114. }
  1115. break;
  1116. }
  1117. }
  1118. item.append(_T("\t"));
  1119. item.append(szBuffer);
  1120. item.append(_T("\t"));
  1121. StrItems += item;
  1122. }
  1123. StrItems.append(_T("\r\n"));
  1124. //DebugLog(StrItems.c_str());
  1125. return true;
  1126. }
  1127. //bDingStart True 时,只要台数大于等于3 则直接返回 后续不在进行计算了。
  1128. int CGameLogic_dcs::AnalyseCardTaiNum(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BOOL bDingStart)
  1129. {
  1130. mChiHuRight.SetEmpty();
  1131. //首先算是不是 辣子胡 如果是 其他的就不用算了。封顶
  1132. bool WeavieIsLaZi = true;
  1133. mTaiRight = 0;
  1134. int nTai=0;
  1135. tagWeaveItem AnalyseWeaveItem[5];
  1136. BYTE AnalyseCbWeaveCount;
  1137. CopyMemory(AnalyseWeaveItem, WeaveItem, sizeof(tagWeaveItem)*cbWeaveCount);
  1138. AnalyseCbWeaveCount = cbWeaveCount;
  1139. BOOL bHaveQuanzi = FALSE;
  1140. if (AnalyseCardTaiNum_IsQuanZi(cbCardIndex, WeaveItem, cbWeaveCount)){
  1141. bHaveQuanzi = TRUE;
  1142. }
  1143. /*
  1144. 检测是否有全财暗杠,有则先去掉在计算。
  1145. */
  1146. int nQuanMagicAnGangCount = 0;
  1147. for (int i = 0; i < AnalyseCbWeaveCount;i++)
  1148. {
  1149. if (WeaveItem[i].cbWeaveKind == WIK_QUANG_AN_GANG)
  1150. {
  1151. nQuanMagicAnGangCount++;
  1152. }
  1153. }
  1154. if (nQuanMagicAnGangCount>0)
  1155. {
  1156. int nTmpCount = 0;
  1157. for (int i = 0; i < AnalyseCbWeaveCount;i++)
  1158. {
  1159. if (WeaveItem[i].cbWeaveKind == WIK_QUANG_AN_GANG)
  1160. {
  1161. continue;
  1162. }
  1163. CopyMemory(&AnalyseWeaveItem[nTmpCount++], &WeaveItem[i], sizeof(tagWeaveItem));
  1164. }
  1165. AnalyseCbWeaveCount = nTmpCount;
  1166. }
  1167. //落地牌是否全是碰/顺
  1168. int luodiKind = 0; //1 顺 2 碰 3非全顺/全碰
  1169. for (int i = 0; i < AnalyseCbWeaveCount; i++)
  1170. {
  1171. /* if (((AnalyseWeaveItem[i].cbWeaveKind == WIK_DAN_PENG) || (AnalyseWeaveItem[i].cbWeaveKind == WIK_SHUANG_PENG) || (AnalyseWeaveItem[i].cbWeaveKind == WIK_PENG) ||
  1172. (AnalyseWeaveItem[i].cbWeaveKind == WIK_MING_GANG) || (AnalyseWeaveItem[i].cbWeaveKind == WIK_SAN_AN_GANG)||
  1173. (AnalyseWeaveItem[i].cbWeaveKind == WIK_SHUANG_AN_GANG) || (AnalyseWeaveItem[i].cbWeaveKind == WIK_DAN_AN_GANG) || (AnalyseWeaveItem[i].cbWeaveKind == WIK_AN_GANG)||
  1174. (AnalyseWeaveItem[i].cbWeaveKind == WIK_SAN_MING_GANG) || (AnalyseWeaveItem[i].cbWeaveKind == WIK_SHUANG_MING_GANG) || (AnalyseWeaveItem[i].cbWeaveKind == WIK_DAN_MING_GANG)||
  1175. (AnalyseWeaveItem[i].cbWeaveKind == WIK_BU_GANG) || (AnalyseWeaveItem[i].cbWeaveKind == WIK_DAN_BU_GANG)
  1176. ))*/
  1177. if ((AnalyseWeaveItem[i].cbWeaveKind == WIK_PENG) || (AnalyseWeaveItem[i].cbWeaveKind == WIK_SHUANG_PENG))
  1178. {
  1179. if (AnalyseWeaveItem[i].cbCenterCard == 0x31)
  1180. {
  1181. //DebugLog(_T("落地派中 发现东风刻字 %02x +2台"), WeaveItem[i].cbCenterCard);
  1182. mChiHuRight |= ZJ_TAI_DongFeng;
  1183. mTaiRight |= ZJ_TAI_DongFeng;
  1184. nTai += 2;
  1185. }
  1186. if ((AnalyseWeaveItem[i].cbCenterCard == 0x35))
  1187. {
  1188. //DebugLog(_T("落地派中 发现中发白刻字 %02x +1台"), WeaveItem[i].cbCenterCard);
  1189. mChiHuRight |= ZJ_TAI_ZFB;
  1190. mTaiRight |= ZJ_TAI_ZFB;
  1191. nTai += 1;
  1192. }
  1193. if ( AnalyseWeaveItem[i].cbCenterCard == 0x36 )
  1194. {
  1195. //DebugLog(_T("落地派中 发现中发白刻字 %02x +1台"), WeaveItem[i].cbCenterCard);
  1196. mChiHuRight |= ZJ_TAI_ZFB;
  1197. mTaiRight |= ZJ_TAI_ZFB;
  1198. nTai += 1;
  1199. }
  1200. if ((AnalyseWeaveItem[i].cbCenterCard == 0x37))
  1201. {
  1202. //DebugLog(_T("落地派中 发现中发白刻字 %02x +1台"), WeaveItem[i].cbCenterCard);
  1203. mChiHuRight |= ZJ_TAI_ZFB;
  1204. mTaiRight |= ZJ_TAI_ZFB;
  1205. nTai += 1;
  1206. }
  1207. if (luodiKind == 1)
  1208. {
  1209. luodiKind = 3;
  1210. }
  1211. if (luodiKind == 0)
  1212. {
  1213. luodiKind = 2;
  1214. }
  1215. continue;
  1216. }
  1217. if ((AnalyseWeaveItem[i].cbWeaveKind == WIK_MING_GANG) ||
  1218. (AnalyseWeaveItem[i].cbWeaveKind == WIK_AN_GANG) ||
  1219. (AnalyseWeaveItem[i].cbWeaveKind == WIK_BU_GANG))
  1220. {
  1221. if (AnalyseWeaveItem[i].cbCenterCard == 0x31)
  1222. {
  1223. //DebugLog(_T("落地派中 发现东风刻字 %02x +2台"), WeaveItem[i].cbCenterCard);
  1224. mChiHuRight |= ZJ_TAI_DongFeng;
  1225. mTaiRight |= ZJ_TAI_DongFeng;
  1226. nTai += 2;
  1227. }
  1228. if ((AnalyseWeaveItem[i].cbCenterCard == 0x35))
  1229. {
  1230. //DebugLog(_T("落地派中 发现中发白刻字 %02x +1台"), WeaveItem[i].cbCenterCard);
  1231. mChiHuRight |= ZJ_TAI_ZFB;
  1232. mTaiRight |= ZJ_TAI_ZFB;
  1233. nTai += 1;
  1234. }
  1235. if (AnalyseWeaveItem[i].cbCenterCard == 0x36)
  1236. {
  1237. //DebugLog(_T("落地派中 发现中发白刻字 %02x +1台"), WeaveItem[i].cbCenterCard);
  1238. mChiHuRight |= ZJ_TAI_ZFB;
  1239. mTaiRight |= ZJ_TAI_ZFB;
  1240. nTai += 1;
  1241. }
  1242. if ((AnalyseWeaveItem[i].cbCenterCard == 0x37))
  1243. {
  1244. //DebugLog(_T("落地派中 发现中发白刻字 %02x +1台"), WeaveItem[i].cbCenterCard);
  1245. mChiHuRight |= ZJ_TAI_ZFB;
  1246. mTaiRight |= ZJ_TAI_ZFB;
  1247. nTai += 1;
  1248. }
  1249. if (luodiKind == 1)
  1250. {
  1251. luodiKind = 3;
  1252. }
  1253. if (luodiKind == 0)
  1254. {
  1255. luodiKind = 2;
  1256. }
  1257. continue;
  1258. }
  1259. if ((
  1260. (AnalyseWeaveItem[i].cbWeaveKind == WIK_DAN_CHI)
  1261. || (AnalyseWeaveItem[i].cbWeaveKind == WIK_SHUANG_CAICHI)
  1262. || (AnalyseWeaveItem[i].cbWeaveKind == WIK_LEFT)
  1263. || (AnalyseWeaveItem[i].cbWeaveKind == WIK_CENTER)
  1264. || (AnalyseWeaveItem[i].cbWeaveKind == WIK_RIGHT)
  1265. ))
  1266. {
  1267. WeavieIsLaZi = false;
  1268. if (luodiKind == 2)
  1269. {
  1270. luodiKind = 3;
  1271. }
  1272. if (luodiKind == 0)
  1273. {
  1274. luodiKind = 1;
  1275. }
  1276. continue;
  1277. }
  1278. }
  1279. if (bDingStart&&nTai>=3)
  1280. {
  1281. return nTai;
  1282. }
  1283. // //////////////////////////////////////////////////////////////////////////
  1284. // 修改无财胡判定位置 [9/14/2018 Zoro]
  1285. // if (!HaveMagic(cbCardIndex, AnalyseWeaveItem, AnalyseCbWeaveCount) && nQuanMagicAnGangCount == 0)
  1286. // {
  1287. // nTai += 1;
  1288. // mChiHuRight |= ZJ_TAI_WuMagic;
  1289. // mTaiRight |= ZJ_TAI_WuMagic;
  1290. // //DebugLog(_T("无财神 +1台"));
  1291. // return 7;
  1292. // }
  1293. //更新算法 计算手牌包含刻字情况
  1294. //财东东 123 123 11 123
  1295. BYTE cbCardIndexTmp[MAX_INDEX];
  1296. tagWeaveItem WeaveItemTmp[5];
  1297. BYTE cbWeaveCountTmp;
  1298. ZeroMemory(cbCardIndexTmp, MAX_INDEX);
  1299. ZeroMemory(WeaveItemTmp, sizeof(WeaveItemTmp));
  1300. cbWeaveCountTmp = 0;
  1301. CopyMemory(cbCardIndexTmp, cbCardIndex, MAX_INDEX);
  1302. CopyMemory(WeaveItemTmp, AnalyseWeaveItem, sizeof(tagWeaveItem)*AnalyseCbWeaveCount);
  1303. cbWeaveCountTmp = AnalyseCbWeaveCount;
  1304. int nFengTai=0;
  1305. BOOL haveFengKe=FALSE;
  1306. for (int i = 0; i < 4; i++)
  1307. {
  1308. if (HaveFengKe(cbCardIndexTmp, WeaveItemTmp, cbWeaveCountTmp, 27))//东风刻字
  1309. {
  1310. nTai += 2;
  1311. nFengTai += 2;
  1312. mChiHuRight |= ZJ_TAI_DongFeng;
  1313. mTaiRight |= ZJ_TAI_DongFeng;
  1314. haveFengKe = TRUE;
  1315. //DebugLog(_T("手牌中 发现[东风]刻字 +2台"));
  1316. //如果 删掉东风+财神 依然可以胡牌 那么就删掉3张牌
  1317. }
  1318. else
  1319. {
  1320. break;
  1321. }
  1322. if (bDingStart&&nTai >= 3)
  1323. {
  1324. return nTai;
  1325. }
  1326. }
  1327. for (int i = 0; i < 4; i++)
  1328. {
  1329. //计算中发白 刻字个数
  1330. if (HaveFengKe(cbCardIndexTmp, WeaveItemTmp, cbWeaveCountTmp, 31))
  1331. {
  1332. nTai++;
  1333. nFengTai++;
  1334. mChiHuRight |= ZJ_TAI_ZFB;
  1335. mTaiRight |= ZJ_TAI_ZFB;
  1336. haveFengKe = TRUE;
  1337. //DebugLog(_T("手牌中 发现[中发白]有2张 可能有刻字 +1台"));
  1338. }
  1339. else
  1340. {
  1341. break;
  1342. }
  1343. if (bDingStart&&nTai >= 3)
  1344. {
  1345. return nTai;
  1346. }
  1347. }
  1348. for (int i = 0; i < 4; i++)
  1349. {
  1350. //计算中发白 刻字个数
  1351. if (HaveFengKe(cbCardIndexTmp, WeaveItemTmp, cbWeaveCountTmp, 32))
  1352. {
  1353. nTai++;
  1354. nFengTai++;
  1355. mChiHuRight |= ZJ_TAI_ZFB;
  1356. mTaiRight |= ZJ_TAI_ZFB;
  1357. haveFengKe = TRUE;
  1358. //DebugLog(_T("手牌中 发现[中发白]有2张 可能有刻字 +1台"));
  1359. }
  1360. else
  1361. {
  1362. break;
  1363. }
  1364. if (bDingStart&&nTai >= 3)
  1365. {
  1366. return nTai;
  1367. }
  1368. }
  1369. for (int i = 0; i < 4; i++)
  1370. {
  1371. //计算中发白 刻字个数
  1372. if (HaveFengKe(cbCardIndexTmp, WeaveItemTmp, cbWeaveCountTmp, 33))
  1373. {
  1374. nTai++;
  1375. nFengTai++;
  1376. mChiHuRight |= ZJ_TAI_ZFB;
  1377. mTaiRight |= ZJ_TAI_ZFB;
  1378. haveFengKe = TRUE;
  1379. //DebugLog(_T("手牌中 发现[中发白]有2张 可能有刻字 +1台"));
  1380. }
  1381. else
  1382. {
  1383. break;
  1384. }
  1385. if (bDingStart&&nTai >= 3)
  1386. {
  1387. return nTai;
  1388. }
  1389. }
  1390. //////////////////////////////////////////////////////////////////////////
  1391. if (nFengTai<4)
  1392. {
  1393. if (bHaveQuanzi == FALSE)
  1394. {
  1395. if (IsQingYiSe(cbCardIndex, AnalyseWeaveItem, AnalyseCbWeaveCount))
  1396. {
  1397. nTai += 3;
  1398. mChiHuRight |= ZJ_TAI_QingYiSe;
  1399. mTaiRight |= ZJ_TAI_QingYiSe;
  1400. //DebugLog(_T("清一色 +3台"));
  1401. }
  1402. }
  1403. if (bDingStart&&nTai >= 3)
  1404. {
  1405. return nTai;
  1406. }
  1407. }
  1408. //是清一色 并且清一色的花色 不是风则 不走风刻的计算
  1409. if (!(mChiHuRight&ZJ_TAI_QingYiSe).IsEmpty() && nFengTai>0&&nFengTai<4)
  1410. {
  1411. BYTE color = 0;
  1412. //得到清一色的花色
  1413. for (int i = 0; i < MAX_INDEX;i++)
  1414. {
  1415. if (cbCardIndex[i]>0 && !IsMagicCard(SwitchToCardData(i)))
  1416. {
  1417. color = GetCardColor(SwitchToCardData(i));
  1418. break;
  1419. }
  1420. }
  1421. if (color!=Color_Feng)
  1422. {
  1423. nTai -= nFengTai;
  1424. mChiHuRight -= ZJ_TAI_ZFB;
  1425. mChiHuRight -= ZJ_TAI_DongFeng;
  1426. if (mTaiRight&ZJ_TAI_ZFB)
  1427. {
  1428. mTaiRight ^= ZJ_TAI_ZFB;
  1429. }
  1430. if (mTaiRight&ZJ_TAI_DongFeng)
  1431. {
  1432. mTaiRight ^= ZJ_TAI_DongFeng;
  1433. }
  1434. haveFengKe = FALSE;
  1435. cbWeaveCountTmp = 0;
  1436. CopyMemory(cbCardIndexTmp, cbCardIndex, MAX_INDEX);
  1437. CopyMemory(WeaveItemTmp, AnalyseWeaveItem, sizeof(tagWeaveItem)*AnalyseCbWeaveCount);
  1438. cbWeaveCountTmp = AnalyseCbWeaveCount;
  1439. }
  1440. }
  1441. if (!(mChiHuRight&ZJ_TAI_QingYiSe).IsEmpty() && nFengTai > 3)
  1442. {
  1443. BYTE color = 0;
  1444. //得到清一色的花色
  1445. for (int i = 0; i < MAX_INDEX; i++)
  1446. {
  1447. if (cbCardIndex[i]>0 && !IsMagicCard(SwitchToCardData(i)))
  1448. {
  1449. color = GetCardColor(SwitchToCardData(i));
  1450. break;
  1451. }
  1452. }
  1453. if (color != Color_Feng)
  1454. {
  1455. nTai -= 3;
  1456. mChiHuRight -= ZJ_TAI_QingYiSe;
  1457. if (mTaiRight&ZJ_TAI_QingYiSe)
  1458. {
  1459. mTaiRight ^= ZJ_TAI_QingYiSe;
  1460. }
  1461. cbWeaveCountTmp = 0;
  1462. CopyMemory(cbCardIndexTmp, cbCardIndex, MAX_INDEX);
  1463. CopyMemory(WeaveItemTmp, AnalyseWeaveItem, sizeof(tagWeaveItem)*AnalyseCbWeaveCount);
  1464. cbWeaveCountTmp = AnalyseCbWeaveCount;
  1465. }
  1466. }
  1467. if (bDingStart&&nTai >= 3)
  1468. {
  1469. return nTai;
  1470. }
  1471. if (luodiKind != 3)
  1472. {
  1473. //碰碰胡 和全顺 只能算出一个来 剩下的一个不要算了。
  1474. bool bOK = false;
  1475. //全碰
  1476. if (IsPengPengHu(cbCardIndexTmp, WeaveItemTmp, cbWeaveCountTmp))
  1477. {
  1478. nTai += 1;
  1479. mChiHuRight |= ZJ_TAI_PengPeng;
  1480. mTaiRight |= ZJ_TAI_PengPeng;
  1481. //DebugLog(_T("碰碰胡 +1台"));
  1482. bOK = true;
  1483. }
  1484. //
  1485. if (bDingStart&&nTai >= 3)
  1486. {
  1487. return nTai;
  1488. }
  1489. if (bOK == false && haveFengKe == FALSE&&nQuanMagicAnGangCount == 0 )
  1490. {
  1491. if (IsQuanShun(cbCardIndex, AnalyseWeaveItem, AnalyseCbWeaveCount))
  1492. {
  1493. nTai += 1;
  1494. mChiHuRight |= ZJ_TAI_QuanShun;
  1495. mTaiRight |= ZJ_TAI_QuanShun;
  1496. }
  1497. }
  1498. }
  1499. //if (cbCardIndexTmp[31] >= 3 || cbCardIndexTmp[32] >= 3 || cbCardIndexTmp[33] >= 3)
  1500. //{
  1501. // nTai++;
  1502. // mChiHuRight |= ZJ_TAI_ZFB;
  1503. // mTaiRight |= ZJ_TAI_ZFB;
  1504. // //DebugLog(_T("手牌中 发现[中发白]刻字 +1台"));
  1505. //}
  1506. if ((mChiHuRight&ZJ_TAI_QingYiSe).IsEmpty() && bHaveQuanzi == FALSE)
  1507. {
  1508. BOOL HaveFengKe=FALSE;
  1509. if (!(mChiHuRight&ZJ_TAI_DongFeng).IsEmpty() || !(mChiHuRight&ZJ_TAI_ZFB).IsEmpty())
  1510. {
  1511. HaveFengKe = TRUE;
  1512. }
  1513. if (IsCardsIsHunYiSe(cbCardIndexTmp, WeaveItemTmp, cbWeaveCountTmp, HaveFengKe))
  1514. {
  1515. nTai += 1;
  1516. mChiHuRight |= ZJ_TAI_HunYiSe;
  1517. mTaiRight |= ZJ_TAI_HunYiSe;
  1518. }
  1519. }
  1520. if (!(mChiHuRight&ZJ_TAI_QuanShun).IsEmpty() && mSunTaiJiangInColor == Color_Feng)
  1521. {
  1522. int nMagic = DeleteMagicCards(cbCardIndexTmp);
  1523. if (mSunTaiJiangInColor == Color_Feng)
  1524. {
  1525. if (nMagic > 0)
  1526. {
  1527. if (cbCardIndexTmp[27] == 1
  1528. || cbCardIndexTmp[31] == 1
  1529. || cbCardIndexTmp[32] == 1
  1530. || cbCardIndexTmp[33] == 1
  1531. )
  1532. {
  1533. //OutputDebugString(_T("财神+东 中发白做将 不让胡"));
  1534. if (nTai > 1)
  1535. {
  1536. mTaiRight ^= ZJ_TAI_QuanShun;
  1537. mChiHuRight -= ZJ_TAI_QuanShun;
  1538. nTai--;
  1539. return nTai;
  1540. }
  1541. mTaiRight = WIK_NULL;
  1542. mChiHuRight.SetEmpty();
  1543. return 0;
  1544. }
  1545. if (cbCardIndexTmp[27] == 2
  1546. || cbCardIndexTmp[31] == 2
  1547. || cbCardIndexTmp[32] == 2
  1548. || cbCardIndexTmp[33] == 2
  1549. )
  1550. {
  1551. ////OutputDebugString(_T(" 中发白做将 不让胡"));
  1552. if (nTai > 1)
  1553. {
  1554. mTaiRight ^= ZJ_TAI_QuanShun;
  1555. mChiHuRight -= ZJ_TAI_QuanShun;
  1556. nTai--;
  1557. return nTai;
  1558. }
  1559. mTaiRight = WIK_NULL;
  1560. mChiHuRight.SetEmpty();
  1561. return 0;
  1562. }
  1563. }
  1564. else
  1565. {
  1566. if (cbCardIndexTmp[27] == 2
  1567. || cbCardIndexTmp[31] == 2
  1568. || cbCardIndexTmp[32] == 2
  1569. || cbCardIndexTmp[33] == 2
  1570. )
  1571. {
  1572. ////OutputDebugString(_T(" 中发白做将 不让胡"));
  1573. if (nTai > 1)
  1574. {
  1575. mTaiRight ^= ZJ_TAI_QuanShun;
  1576. mChiHuRight -= ZJ_TAI_QuanShun;
  1577. nTai--;
  1578. return nTai;
  1579. }
  1580. mTaiRight = WIK_NULL;
  1581. mChiHuRight.SetEmpty();
  1582. return 0;
  1583. }
  1584. }
  1585. }
  1586. //仅有全顺时 如果东 中发白 做将 不让胡
  1587. }
  1588. if (bDingStart&&nTai >= 3)
  1589. {
  1590. return nTai;
  1591. }
  1592. //如果包含全财暗杠,并且胡牌不是辣子和全顺 则在原始牌台数基础上增加2*全财神个数
  1593. if (nQuanMagicAnGangCount>0 && (mChiHuRight&ZJ_TAI_QingYiSe).IsEmpty() && (mChiHuRight&ZJ_TAI_QuanZi).IsEmpty())
  1594. {
  1595. nTai += 2;
  1596. nFengTai += 2;
  1597. mChiHuRight |= ZJ_TAI_DongFeng;
  1598. mTaiRight |= ZJ_TAI_DongFeng;
  1599. }
  1600. // if (GetMaigcCardCount(cbCardIndex)==1)//单财胡--定财神
  1601. // {
  1602. // nTai +=1;
  1603. // mChiHuRight |= ZJ_TAI_Gang;
  1604. // mTaiRight |= ZJ_TAI_Gang;
  1605. // }
  1606. //if ((cbCardIndexTmp[27] == 1 || cbCardIndexTmp[27] ==2 && !IsMagicCard(SwitchToCardData(27)))
  1607. // || (cbCardIndexTmp[31] == 1 && !IsMagicCard(SwitchToCardData(31)))
  1608. // || (cbCardIndexTmp[32] == 1 && !IsMagicCard(SwitchToCardData(32)))
  1609. // || (cbCardIndexTmp[33] == 1 && !IsMagicCard(SwitchToCardData(33)))
  1610. // )
  1611. //{
  1612. // nTai = 0;
  1613. // QueryPerformanceCounter(&nEndTime);
  1614. // strAddString.Format(_T("财神+东 中发白作将 全顺不能胡 花费时间 %f 秒"), (double)(nEndTime.QuadPart - nBeginTime.QuadPart) / (double)nFreq.QuadPart);
  1615. // m_ResultList.AddString(strAddString);
  1616. // return;
  1617. //}
  1618. return nTai;
  1619. }
  1620. int CGameLogic_dcs::AnalyseCardTaiNum_IsQuanZi(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  1621. {
  1622. //首先算是不是 辣子胡 如果是 其他的就不用算了。封顶
  1623. bool WeavieIsLaZi = true;
  1624. tagWeaveItem AnalyseWeaveItem[5];
  1625. BYTE AnalyseCbWeaveCount;
  1626. CopyMemory(AnalyseWeaveItem, WeaveItem, sizeof(tagWeaveItem)*cbWeaveCount);
  1627. AnalyseCbWeaveCount = cbWeaveCount;
  1628. for (int i = 0; i < AnalyseCbWeaveCount; i++)
  1629. {
  1630. if ((AnalyseWeaveItem[i].cbWeaveKind == WIK_PENG))
  1631. {
  1632. //计算是否有各种加台刻字
  1633. if (AnalyseWeaveItem[i].cbCenterCard < 0x31)
  1634. {
  1635. WeavieIsLaZi = false;
  1636. return WeavieIsLaZi;
  1637. }
  1638. continue;
  1639. }
  1640. if ((AnalyseWeaveItem[i].cbWeaveKind == WIK_MING_GANG) ||
  1641. (AnalyseWeaveItem[i].cbWeaveKind == WIK_AN_GANG) ||
  1642. (AnalyseWeaveItem[i].cbWeaveKind == WIK_BU_GANG))
  1643. {
  1644. //计算是否有各种加台刻字
  1645. if (AnalyseWeaveItem[i].cbCenterCard < 0x31)
  1646. {
  1647. WeavieIsLaZi = false;
  1648. return WeavieIsLaZi;
  1649. }
  1650. continue;
  1651. }
  1652. if ((
  1653. (AnalyseWeaveItem[i].cbWeaveKind == WIK_DAN_CHI)
  1654. || (AnalyseWeaveItem[i].cbWeaveKind == WIK_SHUANG_CAICHI)
  1655. || (AnalyseWeaveItem[i].cbWeaveKind == WIK_LEFT)
  1656. || (AnalyseWeaveItem[i].cbWeaveKind == WIK_CENTER)
  1657. || (AnalyseWeaveItem[i].cbWeaveKind == WIK_RIGHT)
  1658. ))
  1659. {
  1660. WeavieIsLaZi = false;
  1661. return WeavieIsLaZi;
  1662. continue;
  1663. }
  1664. }
  1665. //落地牌分析完毕
  1666. //////////////////////////////////////////////////////////////////////////
  1667. //全字 分析
  1668. if (WeavieIsLaZi == true)
  1669. {
  1670. for (int i = 0; i < 27; i++)
  1671. {
  1672. if (cbCardIndex[i]>0 && !IsMagicCard(SwitchToCardData(i)))//手牌中存在不是字牌,并且该牌不是财神牌(癞子与癞子皮)
  1673. {
  1674. WeavieIsLaZi = false;
  1675. break;
  1676. }
  1677. }
  1678. }
  1679. return WeavieIsLaZi;
  1680. }
  1681. int CGameLogic_dcs::AnalyseCardTaiNum_IsWuMagic(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  1682. {
  1683. return m_MagicType == MagicType_NoMagic;
  1684. }
  1685. int CGameLogic_dcs::AnalyseCardTaiNum_IsDuMagic(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  1686. {
  1687. return m_MagicType == MagicType_OneMagic;
  1688. }
  1689. //
  1690. //bool CGameLogic::isHaveMaigc(const BYTE cardMagicIndex[4])
  1691. //{
  1692. // for (int i = 0; i < 4; i++){
  1693. // if (cardMagicIndex[i]>0)
  1694. // {
  1695. // return false;
  1696. // }
  1697. // }
  1698. // return false;
  1699. //}
  1700. //
  1701. bool CGameLogic_dcs::HaveMagic(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  1702. {
  1703. BYTE TmpcbCardIndex[MAX_INDEX] = { 0 };
  1704. CopyMemory(TmpcbCardIndex, cbCardIndex, MAX_INDEX);
  1705. int nMagicCount = DeleteMagicCards(TmpcbCardIndex);
  1706. if (nMagicCount > 0)
  1707. {
  1708. return true;
  1709. }
  1710. for (int i = 0; i < cbWeaveCount; i++)
  1711. {
  1712. if (WeaveItem[i].cbWeaveKind&(
  1713. WIK_DAN_CHI |
  1714. WIK_SHUANG_CAICHI |
  1715. WIK_DAN_PENG | WIK_SHUANG_PENG |
  1716. WIK_DAN_MING_GANG | WIK_SHUANG_MING_GANG | WIK_SAN_MING_GANG | WIK_DAN_BU_GANG |
  1717. WIK_DAN_AN_GANG | WIK_SHUANG_AN_GANG | WIK_SAN_AN_GANG | WIK_QUANG_AN_GANG
  1718. ))
  1719. {
  1720. return true;
  1721. }
  1722. if (WeaveItem[i].cbWeaveKind == WIK_BU_GANG && WeaveItem[i].cbMargicOffset[0] != 0)
  1723. {
  1724. return true;
  1725. }
  1726. }
  1727. return false;
  1728. }
  1729. //
  1730. bool CGameLogic_dcs::IsPengPengHu(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  1731. {
  1732. BYTE TmpcbCardIndex[MAX_INDEX] = { 0 };
  1733. CopyMemory(TmpcbCardIndex, cbCardIndex, MAX_INDEX);
  1734. for (int i = 0; i < cbWeaveCount; i++)
  1735. {
  1736. if (WeaveItem[i].cbWeaveKind
  1737. & (WIK_DAN_CHI |
  1738. WIK_SHUANG_CAICHI |
  1739. WIK_LEFT | WIK_CENTER | WIK_RIGHT
  1740. ))//单财吃、双财吃、左、中、右吃
  1741. {
  1742. return false;
  1743. }
  1744. }
  1745. int nMagic = DeleteMagicCards(TmpcbCardIndex);
  1746. //计算出剩余的牌 全部变成刻字需要多少张财神
  1747. //碰碰胡 分2种 3杠一对 4刻字一对
  1748. int nNeedMagic = 0;
  1749. int nGangCount=0;
  1750. for (int i = 0; i < MAX_INDEX; i++)
  1751. {
  1752. if (TmpcbCardIndex[i] == 1 || TmpcbCardIndex[i] == 2)
  1753. {
  1754. nNeedMagic += (3 - TmpcbCardIndex[i]);
  1755. }
  1756. if (TmpcbCardIndex[i]==4)
  1757. {
  1758. nNeedMagic += 2;
  1759. nGangCount++;
  1760. }
  1761. }
  1762. //if (nGangCount>1)
  1763. //{
  1764. // return false;
  1765. //}
  1766. if (nNeedMagic == nMagic + 1 || nNeedMagic ==nMagic%3 +1||(nNeedMagic==0&& nMagic%3==2))
  1767. {
  1768. return true;
  1769. }
  1770. //计算有几个杠 如果杠需要的财神=手牌财神+2 则 是碰碰胡
  1771. nNeedMagic = 0;
  1772. for (int i = 0; i < MAX_INDEX; i++)
  1773. {
  1774. if (TmpcbCardIndex[i] == 1 || TmpcbCardIndex[i] == 2 || TmpcbCardIndex[i] == 3)
  1775. {
  1776. nNeedMagic += (4 - TmpcbCardIndex[i]);
  1777. }
  1778. }
  1779. if (nNeedMagic == nMagic + 2 || nNeedMagic == nMagic % 3 + 2 )
  1780. {
  1781. return true;
  1782. }
  1783. return false;
  1784. }
  1785. //
  1786. bool CGameLogic_dcs::IsQuanShun(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  1787. {
  1788. BYTE TmpcbCardIndex[MAX_INDEX] = { 0 };
  1789. CopyMemory(TmpcbCardIndex, cbCardIndex, MAX_INDEX);
  1790. for (int i = 0; i < cbWeaveCount; i++)
  1791. {
  1792. if (!(WeaveItem[i].cbWeaveKind
  1793. &(WIK_CENTER | WIK_DAN_CHI | WIK_SHUANG_CAICHI|WIK_RIGHT|WIK_LEFT)
  1794. ))
  1795. {
  1796. return false;
  1797. }
  1798. }
  1799. //如果有风牌 不可能是全顺
  1800. //将手牌 遍历一次 把能够组成顺子 且 剩下的还能胡的牌 扔到组合里面。如果最后 剩下2张一样的牌 就判定是全顺
  1801. int nMagicCount = DeleteMagicCards(TmpcbCardIndex);
  1802. int nFengCardCount=0;
  1803. BYTE nFengCard[MAX_INDEX] = { 0 };
  1804. for (int i = 0; i < 7; i++)
  1805. {
  1806. if (TmpcbCardIndex[27 + i] >= 3)
  1807. {
  1808. return false;
  1809. }
  1810. if (TmpcbCardIndex[27 + i] >= 1)
  1811. {
  1812. nFengCard[nFengCardCount] = 27 + i;
  1813. nFengCardCount++;
  1814. }
  1815. }
  1816. if (nFengCardCount>=2)
  1817. {
  1818. return false;
  1819. }
  1820. BYTE cbUserIndexCardTmp[MAX_INDEX] = { 0 };
  1821. CopyMemory(cbUserIndexCardTmp, TmpcbCardIndex, MAX_INDEX);
  1822. //////////////////////////////////////////////////////////////////////////
  1823. {
  1824. BYTE cbJiangIndex[MAX_INDEX] = { 0 };
  1825. for (int i = 0; i < MAX_INDEX; i++)
  1826. {
  1827. if (cbUserIndexCardTmp[i] == 0)
  1828. {
  1829. continue;
  1830. }
  1831. if (cbUserIndexCardTmp[i] >= 2)
  1832. {
  1833. cbJiangIndex[i] = 1;
  1834. }
  1835. }
  1836. for (int i = 0; i < MAX_INDEX; i++)
  1837. {
  1838. BYTE cbTmpCardIndex[MAX_INDEX] = { 0 };
  1839. CopyMemory(cbTmpCardIndex, cbUserIndexCardTmp, MAX_INDEX);
  1840. if (cbJiangIndex[i] == 0)
  1841. {
  1842. continue;
  1843. }
  1844. if (cbJiangIndex[i] == 1)
  1845. {
  1846. cbTmpCardIndex[i] -= 2;
  1847. //计算剩余的牌 全顺需要财神个数
  1848. int nNeedMagicCount = 0;
  1849. BYTE cbColorCards[4][MAX_INDEX] = { 0 };
  1850. int cbColorCardCount[MAX_COUNT] = { 0 };
  1851. for (int iColor = 0; iColor < 4; iColor++)
  1852. {
  1853. mNeedMinMagicNum = 8;
  1854. GetOneColorCards(cbTmpCardIndex, iColor, cbColorCards[iColor], cbColorCardCount[iColor]);
  1855. int nNeedMagic = 0;
  1856. GetOneColorNeedMagicCards(cbColorCards[iColor], cbColorCardCount[iColor], 0, true);
  1857. nNeedMagic = mNeedMinMagicNum;
  1858. nNeedMagicCount += nNeedMagic;
  1859. //CString str;
  1860. //str.Format(_T("花色 %d 需要财神个数 %d 才能组成全顺"), iColor, nNeedMagic);
  1861. }
  1862. if (nNeedMagicCount == nMagicCount)
  1863. {
  1864. if (nFengCardCount==1)
  1865. {
  1866. if (nFengCard[0]!=i)
  1867. {
  1868. continue;
  1869. }
  1870. }
  1871. /* CString str;
  1872. str.Format(_T("全顺 %02x 做将"), SwitchToCardData(i));*/
  1873. ////OutputDebugString(str);
  1874. return true;
  1875. }
  1876. }
  1877. }
  1878. }
  1879. //////////////////////////////////////////////////////////////////////////
  1880. //正将没有找到 尝试找找财将
  1881. {
  1882. if (nMagicCount >= 1)
  1883. {
  1884. BYTE cbJiangIndex[MAX_INDEX] = { 0 };
  1885. for (int i = 0; i < MAX_INDEX; i++)
  1886. {
  1887. if (cbUserIndexCardTmp[i] == 0)
  1888. {
  1889. continue;
  1890. }
  1891. if (cbUserIndexCardTmp[i] >= 1)
  1892. {
  1893. cbJiangIndex[i] = 1;
  1894. }
  1895. }
  1896. for (int i = 0; i < MAX_INDEX; i++)
  1897. {
  1898. BYTE cbTmpCardIndex[MAX_INDEX] = { 0 };
  1899. CopyMemory(cbTmpCardIndex, cbUserIndexCardTmp, MAX_INDEX);
  1900. if (cbJiangIndex[i] == 0)
  1901. {
  1902. continue;
  1903. }
  1904. if (cbJiangIndex[i] == 1)
  1905. {
  1906. cbTmpCardIndex[i] -= 1;
  1907. int nTmpMagicCount=nMagicCount-1;
  1908. //计算剩余的牌 全顺需要财神个数
  1909. int nNeedMagicCount = 0;
  1910. BYTE cbColorCards[4][MAX_INDEX] = { 0 };
  1911. int cbColorCardCount[MAX_COUNT] = { 0 };
  1912. for (int iColor = 0; iColor < 4; iColor++)
  1913. {
  1914. mNeedMinMagicNum = 8;
  1915. GetOneColorCards(cbTmpCardIndex, iColor, cbColorCards[iColor], cbColorCardCount[iColor]);
  1916. int nNeedMagic = 0;
  1917. GetOneColorNeedMagicCards(cbColorCards[iColor], cbColorCardCount[iColor], 0, true);
  1918. nNeedMagic = mNeedMinMagicNum;
  1919. nNeedMagicCount += nNeedMagic;
  1920. CString str;
  1921. str.Format(_T("花色 %d 需要财神个数 %d 才能组成全顺"), iColor, nNeedMagic);
  1922. }
  1923. if (nNeedMagicCount == nTmpMagicCount||nNeedMagicCount==nTmpMagicCount%3)
  1924. {
  1925. if (nFengCardCount == 1)
  1926. {
  1927. if (nFengCard[0] != i)
  1928. {
  1929. continue;
  1930. }
  1931. }
  1932. CString str;
  1933. str.Format(_T("全顺 %02x 财神 做将"), SwitchToCardData(i));
  1934. return true;
  1935. }
  1936. }
  1937. }
  1938. }
  1939. }
  1940. //////////////////////////////////////////////////////////////////////////
  1941. //双财将
  1942. {
  1943. //财将 也没有 那就试试 财财将
  1944. if (nMagicCount >= 2)
  1945. {
  1946. BYTE cbTmpCardIndex[MAX_INDEX] = { 0 };
  1947. CopyMemory(cbTmpCardIndex, cbUserIndexCardTmp, MAX_INDEX);
  1948. nMagicCount -= 2;
  1949. //计算剩余的牌 全顺需要财神个数
  1950. int nNeedMagicCount = 0;
  1951. BYTE cbColorCards[4][MAX_INDEX] = { 0 };
  1952. int cbColorCardCount[MAX_COUNT] = { 0 };
  1953. for (int iColor = 0; iColor < 4; iColor++)
  1954. {
  1955. mNeedMinMagicNum = 8;
  1956. GetOneColorCards(cbTmpCardIndex, iColor, cbColorCards[iColor], cbColorCardCount[iColor]);
  1957. int nNeedMagic = 0;
  1958. //nNeedMagicCount = nNeedMagicCount + cbColorCardCount[iColor] * 3 - cbColorCardCount[iColor];
  1959. //nNeedMagic = cbColorCardCount[iColor] * 3 - cbColorCardCount[iColor];
  1960. GetOneColorNeedMagicCards(cbColorCards[iColor], cbColorCardCount[iColor], 0, true);
  1961. nNeedMagic = mNeedMinMagicNum;
  1962. nNeedMagicCount += nNeedMagic;
  1963. /* CString str;
  1964. str.Format(_T("花色 %d 需要财神个数 %d 才能组成全顺"), iColor, nNeedMagic);*/
  1965. }
  1966. if (nNeedMagicCount == nMagicCount||nNeedMagicCount==nMagicCount%3)
  1967. {
  1968. /* CString str;
  1969. str.Format(_T("全顺 财神 财神 做将"));*/
  1970. return true;
  1971. }
  1972. }
  1973. }
  1974. //////////////////////////////////////////////////////////////////////////
  1975. return false;
  1976. }
  1977. //
  1978. bool CGameLogic_dcs::IsCardsIsHunYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount,BOOL HaveFengKe)
  1979. {
  1980. BYTE TmpcbCardIndex[MAX_INDEX] = { 0 };
  1981. CopyMemory(TmpcbCardIndex, cbCardIndex, MAX_INDEX);
  1982. //////////////////////////////////////////////////////////////////////////
  1983. //无风牌 不是混一色
  1984. int cbFengCount = 0;
  1985. int cbItemColor = -1;
  1986. bool bHasFeng2 = false;
  1987. for (int i = 0; i < cbWeaveCount; i++)
  1988. {
  1989. BYTE cbColor = GetCardColor(WeaveItem[i].cbCenterCard);
  1990. if (cbColor == Color_Feng)
  1991. {
  1992. bHasFeng2 = true;
  1993. cbFengCount++;
  1994. continue;
  1995. }
  1996. if (cbItemColor == -1)
  1997. {
  1998. cbItemColor = cbColor;
  1999. }
  2000. if (cbItemColor != cbColor)
  2001. {
  2002. return false;
  2003. }
  2004. }
  2005. //////////////////////////////////////////////////////////////////////////
  2006. //删除风 删除财神 判断是否是一色
  2007. int nCurrentMagicCount = DeleteMagicCards(TmpcbCardIndex);
  2008. //如果没有 东南西北中发白 不可能是混一色
  2009. for (int i = 1; i < 8; i++)
  2010. {
  2011. if (TmpcbCardIndex[26 + i] != 0 )
  2012. {
  2013. bHasFeng2 = true;
  2014. break;
  2015. }
  2016. else
  2017. {
  2018. continue;
  2019. }
  2020. }
  2021. if (!bHasFeng2&&!cbFengCount&&!HaveFengKe)
  2022. {
  2023. return false;
  2024. }
  2025. if (cbItemColor != -1)
  2026. {
  2027. for (BYTE i = 0; i < 27; i++){
  2028. if (TmpcbCardIndex[i] != 0)
  2029. {
  2030. if (GetCardColor(SwitchToCardData(i)) != cbItemColor)
  2031. {
  2032. return false;
  2033. }
  2034. }
  2035. }
  2036. }
  2037. else
  2038. {
  2039. BYTE cbFirst = 0;
  2040. //遍历前 27张0-26
  2041. //得到第一张颜色 如果后面的颜色与第一个不一样,返回false
  2042. for (BYTE i = 0; i < 27; i++){
  2043. if (TmpcbCardIndex[i] != 0)
  2044. {
  2045. if (cbFirst == 0)
  2046. {
  2047. cbFirst = SwitchToCardData(i);
  2048. continue;
  2049. }
  2050. if (GetCardColor(cbFirst) != GetCardColor(SwitchToCardData(i)))
  2051. {
  2052. return false;
  2053. }
  2054. }
  2055. }
  2056. }
  2057. return true;
  2058. }
  2059. //听牌分析,
  2060. bool CGameLogic_dcs::AnalyseTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE *m_cbTingPaiData, const BYTE FanHui[MAX_INDEX], BYTE wChairID)
  2061. {
  2062. //复制数据
  2063. BYTE cbCardIndexTemp[MAX_INDEX];
  2064. CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  2065. //BYTE FanHui[MAX_INDEX] = { 0 };
  2066. //IsCanChangCardAndCount(cbCardIndexTemp, FanHui);
  2067. BYTE cbCardCount = GetCardCount(cbCardIndexTemp);
  2068. if (cbCardCount > 1 && (cbCardCount - 1) % 3 != 0)
  2069. {
  2070. ASSERT(false);
  2071. return false;
  2072. }
  2073. CChiHuRight chr;
  2074. BYTE TaiShu = 0;
  2075. bool isHu = false;
  2076. for (BYTE i = 0; i < MAX_INDEX; i++)
  2077. {
  2078. if (FanHui[i]==0
  2079. && !IsMagicCard(SwitchToCardData(i)))
  2080. {
  2081. continue;
  2082. }
  2083. BYTE CardTempData = SwitchToCardData(i);
  2084. if (WIK_ZI_MO & AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, CardTempData, chr, TaiShu))
  2085. {
  2086. //翻财神
  2087. m_cbTingPaiData[i] = TaiShu;
  2088. isHu = true;
  2089. }
  2090. else
  2091. {
  2092. m_cbTingPaiData[i] = 0;
  2093. }
  2094. }
  2095. return isHu;
  2096. }
  2097. //是否听牌
  2098. //bool CGameLogic::IsTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, const BYTE FanHui[MAX_INDEX])
  2099. //{
  2100. // //复制数据
  2101. // BYTE cbCardIndexTemp[MAX_INDEX];
  2102. // CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  2103. // //BYTE FanHui[MAX_INDEX] = { 0 };
  2104. // //IsCanChangCardAndCount(cbCardIndexTemp, FanHui);
  2105. // for (BYTE i = 0; i < MAX_INDEX; i++)
  2106. // {
  2107. // if (FanHui[i] == 0)continue;
  2108. // BYTE cbTempCardData = SwitchToCardData(i);
  2109. // CChiHuRight chr;
  2110. // BYTE TaiShu = 0;
  2111. // if (WIK_ZI_MO & AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, cbTempCardData,chr,TaiShu))
  2112. // return true;
  2113. // }
  2114. // return false;
  2115. //}
  2116. //扑克转换
  2117. BYTE CGameLogic_dcs::SwitchToCardData(BYTE cbCardIndex)
  2118. {
  2119. //ASSERT(cbCardIndex<34);
  2120. return ((cbCardIndex/9)<<4)|(cbCardIndex%9+1);
  2121. }
  2122. //扑克转换
  2123. BYTE CGameLogic_dcs::SwitchToCardIndex(BYTE cbCardData)
  2124. {
  2125. ASSERT(IsValidCard(cbCardData));
  2126. return ((cbCardData&MASK_COLOR)>>4)*9+(cbCardData&MASK_VALUE)-1;
  2127. }
  2128. //扑克转换
  2129. BYTE CGameLogic_dcs::SwitchToCardData(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT])
  2130. {
  2131. //转换扑克
  2132. BYTE cbPosition=0;
  2133. for (BYTE i=0;i<MAX_INDEX;i++)
  2134. {
  2135. if (cbCardIndex[i]!=0)
  2136. {
  2137. for (BYTE j=0;j<cbCardIndex[i];j++)
  2138. {
  2139. ASSERT(cbPosition<=MAX_COUNT);
  2140. cbCardData[cbPosition++]=SwitchToCardData(i);
  2141. }
  2142. }
  2143. }
  2144. return cbPosition;
  2145. }
  2146. //扑克转换
  2147. BYTE CGameLogic_dcs::SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX])
  2148. {
  2149. //设置变量
  2150. ZeroMemory(cbCardIndex,sizeof(BYTE)*MAX_INDEX);
  2151. //转换扑克
  2152. for (BYTE i=0;i<cbCardCount;i++)
  2153. {
  2154. ASSERT(IsValidCard(cbCardData[i]));
  2155. cbCardIndex[SwitchToCardIndex(cbCardData[i])]++;
  2156. }
  2157. return cbCardCount;
  2158. }
  2159. //分析扑克 无癞子情况下是否可以胡牌,标志AnalyseItemArray.GetCount()>0
  2160. bool CGameLogic_dcs::AnalyseCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CAnalyseItemArray & AnalyseItemArray)
  2161. {
  2162. //计算数目
  2163. BYTE cbCardCount = GetCardCount(cbCardIndex);
  2164. //效验数目
  2165. if ((cbCardCount<2) || (cbCardCount>MAX_COUNT) || ((cbCardCount - 2) % 3 != 0))
  2166. return false;
  2167. //变量定义
  2168. BYTE cbKindItemCount = 0;//组合个数
  2169. tagKindItem KindItem[27 * 2 + 7 + 14];
  2170. ZeroMemory(KindItem, sizeof(KindItem));
  2171. //需求判断
  2172. BYTE cbLessKindItem = (cbCardCount - 2) / 3;//表示手牌需要几个组合才能胡牌
  2173. ASSERT((cbLessKindItem + cbWeaveCount) == 4);
  2174. //单吊判断
  2175. if (cbLessKindItem == 0)
  2176. {
  2177. //牌眼判断
  2178. for (BYTE i = 0; i < MAX_INDEX; i++)
  2179. {
  2180. if (cbCardIndex[i] == 2)
  2181. {
  2182. //变量定义
  2183. tagAnalyseItem AnalyseItem;
  2184. ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
  2185. //设置结果
  2186. for (BYTE j = 0; j < cbWeaveCount; j++)
  2187. {
  2188. AnalyseItem.cbWeaveKind[j] = WeaveItem[j].cbWeaveKind;
  2189. AnalyseItem.cbCenterCard[j] = WeaveItem[j].cbCenterCard;
  2190. GetWeaveCard(WeaveItem[j].cbWeaveKind, WeaveItem[j].cbCenterCard, WeaveItem[j].cbMargicOffset, AnalyseItem.cbCardData[j]);
  2191. }
  2192. AnalyseItem.cbCardEye = SwitchToCardData(i);
  2193. AnalyseItem.bMagicEye = false;
  2194. //插入结果
  2195. AnalyseItemArray.Add(AnalyseItem);
  2196. return true;
  2197. }
  2198. }
  2199. return false;
  2200. }
  2201. //拆分分析,用户手上的临时牌变量
  2202. BYTE cbMagicCardIndex[MAX_INDEX];
  2203. CopyMemory(cbMagicCardIndex, cbCardIndex, sizeof(cbMagicCardIndex));
  2204. if (cbCardCount >= 3)
  2205. {
  2206. for (BYTE i = 0; i < MAX_INDEX; i++)
  2207. {
  2208. //同牌判断
  2209. if (cbMagicCardIndex[i] >= 3)
  2210. {
  2211. ASSERT(cbKindItemCount < CountArray(KindItem));
  2212. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  2213. KindItem[cbKindItemCount].cbCardIndex[1] = i;
  2214. KindItem[cbKindItemCount].cbCardIndex[2] = i;
  2215. KindItem[cbKindItemCount].cbWeaveKind = WIK_PENG;
  2216. KindItem[cbKindItemCount].cbCenterCard = SwitchToCardData(i);
  2217. KindItem[cbKindItemCount].cbValidIndex[0] = i;
  2218. KindItem[cbKindItemCount].cbValidIndex[1] = i;
  2219. KindItem[cbKindItemCount].cbValidIndex[2] = i;
  2220. cbKindItemCount++;
  2221. }
  2222. //连牌判断
  2223. if ((i < (MAX_INDEX - 9)) && ((i % 9) < 7))
  2224. {
  2225. //只要财神牌数加上3个顺序索引的牌数大于等于3,则进行组合
  2226. if (cbMagicCardIndex[i] + cbMagicCardIndex[i + 1] + cbMagicCardIndex[i + 2] >= 3)
  2227. {
  2228. BYTE cbIndex[3] = { cbMagicCardIndex[i], cbMagicCardIndex[i + 1], cbMagicCardIndex[i + 2] };
  2229. int nMagicCountTemp = 0;
  2230. BYTE cbValidIndex[3];
  2231. while (cbIndex[0] + cbIndex[1] + cbIndex[2] >= 3)
  2232. {
  2233. for (BYTE j = 0; j < CountArray(cbIndex); j++)
  2234. {
  2235. if (cbIndex[j] > 0)
  2236. {
  2237. cbIndex[j]--;
  2238. cbValidIndex[j] = i + j;
  2239. }
  2240. else
  2241. {
  2242. nMagicCountTemp--;
  2243. }
  2244. }
  2245. if (nMagicCountTemp == 0)
  2246. {
  2247. ASSERT(cbKindItemCount < CountArray(KindItem));
  2248. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  2249. KindItem[cbKindItemCount].cbCardIndex[1] = i + 1;
  2250. KindItem[cbKindItemCount].cbCardIndex[2] = i + 2;
  2251. KindItem[cbKindItemCount].cbWeaveKind = WIK_LEFT;
  2252. KindItem[cbKindItemCount].cbCenterCard = SwitchToCardData(i);
  2253. CopyMemory(KindItem[cbKindItemCount].cbValidIndex, cbValidIndex, sizeof(cbValidIndex));
  2254. cbKindItemCount++;
  2255. }
  2256. else break;
  2257. }
  2258. }
  2259. }
  2260. }
  2261. }
  2262. //组合分析
  2263. if (cbKindItemCount >= cbLessKindItem)
  2264. {
  2265. //变量定义
  2266. BYTE cbCardIndexTemp[MAX_INDEX];
  2267. ZeroMemory(cbCardIndexTemp, sizeof(cbCardIndexTemp));
  2268. //变量定义
  2269. BYTE cbIndex[4] = { 0, 1, 2, 3 };
  2270. tagKindItem * pKindItem[4];
  2271. ZeroMemory(&pKindItem, sizeof(pKindItem));
  2272. //开始组合
  2273. do
  2274. {
  2275. //设置变量
  2276. CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  2277. for (BYTE i = 0; i < cbLessKindItem; i++)
  2278. pKindItem[i] = &KindItem[cbIndex[i]];
  2279. //数量判断
  2280. bool bEnoughCard = true;
  2281. for (BYTE i = 0; i < cbLessKindItem * 3; i++)
  2282. {
  2283. //存在判断
  2284. BYTE cbCardIndex = pKindItem[i / 3]->cbValidIndex[i % 3];
  2285. if (cbCardIndexTemp[cbCardIndex] == 0)
  2286. {
  2287. bEnoughCard = false;
  2288. break;
  2289. }
  2290. else
  2291. cbCardIndexTemp[cbCardIndex]--;
  2292. }
  2293. //胡牌判断
  2294. if (bEnoughCard == true)
  2295. {
  2296. //牌眼判断
  2297. BYTE cbCardEye = 0;
  2298. bool bMagicEye = false;
  2299. for (BYTE i = 0; i < MAX_INDEX; i++)
  2300. {
  2301. if (cbCardIndexTemp[i] == 2)
  2302. {
  2303. cbCardEye = SwitchToCardData(i);
  2304. break;
  2305. }
  2306. }
  2307. //组合类型
  2308. if (cbCardEye != 0)
  2309. {
  2310. //变量定义
  2311. tagAnalyseItem AnalyseItem;
  2312. ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
  2313. //设置组合
  2314. for (BYTE i = 0; i < cbWeaveCount; i++)
  2315. {
  2316. AnalyseItem.cbWeaveKind[i] = WeaveItem[i].cbWeaveKind;
  2317. AnalyseItem.cbCenterCard[i] = WeaveItem[i].cbCenterCard;
  2318. GetWeaveCard(WeaveItem[i].cbWeaveKind, WeaveItem[i].cbCenterCard, WeaveItem[i].cbMargicOffset,
  2319. AnalyseItem.cbCardData[i]);
  2320. }
  2321. //设置牌型
  2322. for (BYTE i = 0; i < cbLessKindItem; i++)
  2323. {
  2324. AnalyseItem.cbWeaveKind[i + cbWeaveCount] = pKindItem[i]->cbWeaveKind;
  2325. AnalyseItem.cbCenterCard[i + cbWeaveCount] = pKindItem[i]->cbCenterCard;
  2326. AnalyseItem.cbCardData[cbWeaveCount + i][0] = SwitchToCardData(pKindItem[i]->cbValidIndex[0]);
  2327. AnalyseItem.cbCardData[cbWeaveCount + i][1] = SwitchToCardData(pKindItem[i]->cbValidIndex[1]);
  2328. AnalyseItem.cbCardData[cbWeaveCount + i][2] = SwitchToCardData(pKindItem[i]->cbValidIndex[2]);
  2329. }
  2330. //设置牌眼
  2331. AnalyseItem.cbCardEye = cbCardEye;
  2332. AnalyseItem.bMagicEye = bMagicEye;
  2333. //插入结果
  2334. AnalyseItemArray.Add(AnalyseItem);
  2335. }
  2336. }
  2337. //设置索引
  2338. if (cbIndex[cbLessKindItem - 1] == (cbKindItemCount - 1))
  2339. {
  2340. BYTE i = cbLessKindItem - 1;
  2341. for (; i > 0; i--)
  2342. {
  2343. if ((cbIndex[i - 1] + 1) != cbIndex[i])
  2344. {
  2345. BYTE cbNewIndex = cbIndex[i - 1];
  2346. for (BYTE j = (i - 1); j < cbLessKindItem; j++)
  2347. cbIndex[j] = cbNewIndex + j - i + 2;
  2348. break;
  2349. }
  2350. }
  2351. if (i == 0)
  2352. break;
  2353. }
  2354. else
  2355. cbIndex[cbLessKindItem - 1]++;
  2356. } while (true);
  2357. }
  2358. return (AnalyseItemArray.GetCount() > 0);
  2359. }
  2360. //删除癞子牌
  2361. BYTE CGameLogic_dcs::DeleteMagicCards(BYTE cbCardIndex[MAX_INDEX])
  2362. {
  2363. if (m_MagicType==MagicType_NoMagic)
  2364. {
  2365. return 0;
  2366. }
  2367. if (m_MagicType==MagicType_OneMagic)
  2368. {
  2369. BYTE cbCount = cbCardIndex[m_cbMagicIndexFirst];
  2370. cbCardIndex[m_cbMagicIndexFirst] = 0;
  2371. return cbCount;
  2372. }
  2373. if (m_MagicType==MagicType_TwoMagic)
  2374. {
  2375. BYTE cbCardData[2] = { 0 };
  2376. BYTE cbCount = cbCardIndex[m_cbMagicIndexFirst] + cbCardIndex[m_cbMagicIndexSecond];
  2377. cbCardIndex[m_cbMagicIndexFirst] = 0;
  2378. cbCardIndex[m_cbMagicIndexSecond] = 0;
  2379. return cbCount;
  2380. }
  2381. return 0;
  2382. }
  2383. BYTE CGameLogic_dcs::DeleteMagicCards(BYTE cbCardIndex[MAX_INDEX], int nDeleteCount)
  2384. {
  2385. int HaveMagicCount = GetMaigcCardCount(cbCardIndex);
  2386. if (nDeleteCount>HaveMagicCount || HaveMagicCount>8)
  2387. {
  2388. CString strInfo;
  2389. strInfo.Format(_T("DeleteMagicCards Have Magic=%d Delete=%d"), HaveMagicCount, nDeleteCount);
  2390. //OutputDebugString(strInfo);
  2391. return 0;
  2392. }
  2393. if (m_MagicType==MagicType_NoMagic)
  2394. {
  2395. return 0;
  2396. }
  2397. if (m_MagicType == MagicType_OneMagic)
  2398. {
  2399. if ((cbCardIndex[m_cbMagicIndexFirst] - nDeleteCount)>4 || (cbCardIndex[m_cbMagicIndexFirst] - nDeleteCount )<0)
  2400. {
  2401. return 0;
  2402. }
  2403. cbCardIndex[m_cbMagicIndexFirst] = cbCardIndex[m_cbMagicIndexFirst] - nDeleteCount;
  2404. return nDeleteCount;
  2405. }
  2406. if (m_MagicType==MagicType_TwoMagic)
  2407. {
  2408. BYTE nConut = 0;
  2409. int nFirstMagicCount = cbCardIndex[m_cbMagicIndexFirst];
  2410. int nSecondMagicCount = cbCardIndex[m_cbMagicIndexSecond];
  2411. if (nDeleteCount > (nFirstMagicCount + nSecondMagicCount))
  2412. {
  2413. return 0;
  2414. }
  2415. for (int i = 0; i < nDeleteCount; i++)
  2416. {
  2417. if (cbCardIndex[m_cbMagicIndexFirst] > 0) {
  2418. cbCardIndex[m_cbMagicIndexFirst]--;
  2419. nConut++;
  2420. }
  2421. else if (cbCardIndex[m_cbMagicIndexSecond] > 0)
  2422. {
  2423. cbCardIndex[m_cbMagicIndexSecond]--;
  2424. nConut++;
  2425. }
  2426. }
  2427. return nConut;
  2428. }
  2429. return 0;
  2430. }
  2431. //获取牌值需要财神牌个数nNeedNum,组成扑(扑指的是顺子或者三重牌(比如 一饼二饼三饼 或者东风东风东风))
  2432. int CGameLogic_dcs::GetOneColorNeedMagicCards(const BYTE cbCardData[MAX_COUNT], int DataCount, int nNeedNum, bool isShun)
  2433. {
  2434. //CString strTmpPrint;
  2435. //strTmpPrint = _T("GetOneColorNeedMagicCards 分析 ");
  2436. //{
  2437. // for (int i = 0; i < DataCount; i++)
  2438. // {
  2439. // CString tmp;
  2440. // tmp.Format(_T(" %02x"), cbCardData[i]);
  2441. // strTmpPrint.Append(tmp);
  2442. // }
  2443. // strTmpPrint.Append(_T("\r\n"));
  2444. // //OutputDebugString(strTmpPrint);
  2445. //}
  2446. if (mNeedMinMagicNum == 0)
  2447. {
  2448. return -1;
  2449. }
  2450. if (nNeedNum >= mNeedMinMagicNum)
  2451. {
  2452. return -1;
  2453. }
  2454. switch (DataCount)
  2455. {
  2456. case 0:{//cbCardData内没有同一花色的牌不需要财神牌变
  2457. mNeedMinMagicNum = min(nNeedNum, mNeedMinMagicNum);//0
  2458. break;
  2459. }
  2460. case 1:{
  2461. mNeedMinMagicNum = min(nNeedNum + 2, mNeedMinMagicNum);
  2462. CString strTmp;
  2463. strTmp.Format(_T("财神充当碰牌 需要2财神 %02X\r\n "), cbCardData[0]);
  2464. ////OutputDebugString(strTmp);
  2465. //mMagicData[mMagicDataCount++] = cbCardData[0];
  2466. break;
  2467. }
  2468. case 2:{
  2469. BYTE cbFirst = cbCardData[0];
  2470. BYTE cbSecend = cbCardData[1];
  2471. //花色是3 为 东南西北中发白 不可能出现顺子
  2472. if (GetCardColor(cbSecend) == 3)
  2473. {
  2474. if (cbFirst == cbSecend&&!isShun)
  2475. {
  2476. //DebugLog(_T("GetOneColorNeedMagicCards 风牌只有刻字 %02x %02x %02x\r\n"),cbFirst,cbSecend,cbFirst);
  2477. mNeedMinMagicNum = min(mNeedMinMagicNum, nNeedNum + 1);
  2478. ////OutputDebugString(_T("财神是风牌的碰\r\n"));
  2479. mMagicData[mMagicDataCount++] = cbFirst;
  2480. }
  2481. else
  2482. {
  2483. mNeedMinMagicNum = min(mNeedMinMagicNum, nNeedNum + 4);
  2484. }
  2485. }
  2486. else if (cbSecend - cbFirst < 3)//判断相差两个顺序牌需要财神mMagicData变能“碰”、“吃”(左、中、右)
  2487. {
  2488. //DebugLog(_T("GetOneColorNeedMagicCards 顺子/刻字 %02x %02x magic\r\n"), cbFirst, cbSecend);
  2489. if (cbSecend-cbFirst==0)
  2490. {
  2491. CString strTmp;
  2492. strTmp.Format(_T("财神充当碰牌 %02X\r\n "), cbFirst);
  2493. ////OutputDebugString(strTmp);
  2494. mMagicData[mMagicDataCount++] = cbFirst;
  2495. }
  2496. else if (cbSecend-cbFirst==1)
  2497. {
  2498. if (GetCardValue(cbFirst)==1)
  2499. {
  2500. CString strTmp;
  2501. strTmp.Format(_T("财神充当 右吃 %02X\r\n "), cbSecend + 1);
  2502. ////OutputDebugString(strTmp);
  2503. mMagicData[mMagicDataCount++] = cbSecend+1;
  2504. }
  2505. else
  2506. {
  2507. CString strTmp;
  2508. strTmp.Format(_T("财神充当 左吃 %02X\r\n "), cbFirst - 1);
  2509. ////OutputDebugString(strTmp);
  2510. mMagicData[mMagicDataCount++] = cbFirst - 1;
  2511. }
  2512. }
  2513. else if (cbSecend-cbFirst==2)
  2514. {
  2515. CString strTmp;
  2516. strTmp.Format(_T("财神充当 中吃 %02X\r\n "), cbFirst+1);
  2517. ////OutputDebugString(strTmp);
  2518. mMagicData[mMagicDataCount++] = cbFirst+1;
  2519. }
  2520. if (isShun&&cbSecend - cbFirst == 0)
  2521. {
  2522. mNeedMinMagicNum = min(mNeedMinMagicNum, nNeedNum + 4);
  2523. }
  2524. else
  2525. {
  2526. mNeedMinMagicNum = min(mNeedMinMagicNum, nNeedNum + 1);
  2527. }
  2528. }
  2529. else
  2530. {
  2531. if (isShun)
  2532. {
  2533. mNeedMinMagicNum = min(mNeedMinMagicNum, nNeedNum + 4);
  2534. }
  2535. else{
  2536. mNeedMinMagicNum = min(mNeedMinMagicNum, nNeedNum + 4);
  2537. }
  2538. }
  2539. break;
  2540. }
  2541. default:
  2542. {
  2543. //取前三张
  2544. BYTE cbFirst = cbCardData[0];
  2545. BYTE cbSecend = cbCardData[1];
  2546. BYTE cbThree = cbCardData[2];
  2547. //第一个自己一扑
  2548. if (nNeedNum + 2 < mNeedMinMagicNum)
  2549. {
  2550. GetOneColorNeedMagicCards(cbCardData + 1, DataCount - 1, nNeedNum + 2, isShun);//从cbCardData一个一个元素开始,所以DataCount - 1,需要两个财神才能成(扑)
  2551. }
  2552. //第一个跟其它的一个一扑
  2553. if (nNeedNum + 1 < mNeedMinMagicNum){
  2554. if (GetCardColor(cbFirst) == 3){//东南西北中发白牌型
  2555. if (cbFirst == cbSecend)
  2556. {
  2557. GetOneColorNeedMagicCards(cbCardData + 2, DataCount - 2, nNeedNum + 1, isShun);//如果是刻字(两两相等),则需要+1财神牌变,才能碰(即成扑)
  2558. }
  2559. }
  2560. else
  2561. {
  2562. for (int i = 1; i < DataCount; i++)
  2563. {
  2564. if (nNeedNum + 1 >= mNeedMinMagicNum)//财神数最多7个,还有一个是第一次摸牌显示在台桌上无效
  2565. {
  2566. break;
  2567. }
  2568. cbSecend = cbCardData[i];
  2569. if (i + 1 != DataCount){
  2570. cbThree = cbCardData[i + 1];
  2571. if (cbThree == cbSecend){
  2572. continue;
  2573. }
  2574. }
  2575. if (GetCardValue(cbSecend) - GetCardValue(cbFirst) < 3)
  2576. {
  2577. //删除 此时的 p1 p2
  2578. /*BYTE *pTmpData = new BYTE[DataCount];
  2579. ZeroMemory(pTmpData, DataCount);
  2580. int nCount = 0;
  2581. for (int j = 0; j < DataCount; j++)
  2582. {
  2583. if (j == i || j == 0)
  2584. {
  2585. continue;
  2586. }
  2587. pTmpData[nCount++] = cbCardData[j];
  2588. }*/
  2589. if (isShun&&GetCardValue(cbSecend) - GetCardValue(cbFirst)==0)
  2590. {
  2591. BYTE delCards[2] = { 0 };
  2592. delCards[0] = cbFirst;
  2593. delCards[1] = cbSecend;
  2594. BYTE outCards[14] = { 0 };
  2595. DeleteCards(cbCardData, 14, delCards, 2, outCards);
  2596. GetOneColorNeedMagicCards(outCards, DataCount - 2, nNeedNum + 4, isShun);
  2597. }
  2598. else
  2599. {
  2600. BYTE delCards[2] = { 0 };
  2601. delCards[0] = cbFirst;
  2602. delCards[1] = cbSecend;
  2603. BYTE outCards[14] = { 0 };
  2604. DeleteCards(cbCardData, 14, delCards, 2, outCards);
  2605. GetOneColorNeedMagicCards(outCards, DataCount - 2, nNeedNum + 1, isShun);
  2606. }
  2607. }
  2608. else
  2609. {
  2610. break;
  2611. }
  2612. }
  2613. }
  2614. }
  2615. //第一个和其它两个一扑
  2616. //后面间隔两张张不跟前面一张相同222234
  2617. //可能性为222 234
  2618. for (int i = 1; i < DataCount; i++){
  2619. if (nNeedNum >= mNeedMinMagicNum){
  2620. break;
  2621. }
  2622. cbSecend = cbCardData[i];
  2623. if (i + 2 < DataCount)
  2624. {
  2625. if (cbCardData[i + 2] == cbSecend)
  2626. {
  2627. continue;
  2628. }
  2629. }
  2630. for (unsigned int j = i + 1; j < DataCount; j++)
  2631. {
  2632. if (nNeedNum >= mNeedMinMagicNum)
  2633. {
  2634. break;
  2635. }
  2636. cbThree = cbCardData[j];
  2637. if (cbFirst == cbThree)
  2638. {
  2639. //不处理
  2640. }
  2641. if (j + 1 < DataCount)
  2642. {
  2643. if (cbThree == cbCardData[j + 1])
  2644. {
  2645. continue;
  2646. }
  2647. }
  2648. if (isShun)
  2649. {
  2650. if (test3combineToShun(cbFirst, cbSecend, cbThree))
  2651. {
  2652. //删除 1 2 3
  2653. BYTE delCards[3] = { 0 };
  2654. delCards[0] = cbFirst;
  2655. delCards[1] = cbSecend;
  2656. delCards[2] = cbThree;
  2657. BYTE outCards[14] = { 0 };
  2658. DeleteCards(cbCardData, 14, delCards, 3, outCards);
  2659. CString strDeletecards;
  2660. CString strout = _T("删除 ");
  2661. for (int i = 0; i < 3; i++)
  2662. {
  2663. strDeletecards.Format(_T("%02x "), delCards[i]);
  2664. strout += strDeletecards;
  2665. }
  2666. ////OutputDebugString(strout);
  2667. GetOneColorNeedMagicCards(outCards, DataCount - 3, nNeedNum, isShun);
  2668. }
  2669. }
  2670. else
  2671. {
  2672. if (test3Combine(cbFirst, cbSecend, cbThree))
  2673. {
  2674. //删除 1 2 3
  2675. BYTE delCards[3] = { 0 };
  2676. delCards[0] = cbFirst;
  2677. delCards[1] = cbSecend;
  2678. delCards[2] = cbThree;
  2679. BYTE outCards[14] = { 0 };
  2680. DeleteCards(cbCardData, 14, delCards, 3, outCards);
  2681. CString strDeletecards;
  2682. CString strout = _T("删除 ");
  2683. for (int i = 0; i < 3; i++)
  2684. {
  2685. strDeletecards.Format(_T("%02x "), delCards[i]);
  2686. strout += strDeletecards;
  2687. }
  2688. ////OutputDebugString(strout);
  2689. GetOneColorNeedMagicCards(outCards, DataCount - 3, nNeedNum, isShun);
  2690. }
  2691. }
  2692. }
  2693. }
  2694. }
  2695. break;
  2696. }
  2697. }
  2698. //钻牌
  2699. bool CGameLogic_dcs::IsMagicCard( BYTE cbCardData )
  2700. {
  2701. if (m_MagicType==MagicType_NoMagic)
  2702. {
  2703. return false;
  2704. }
  2705. if (m_MagicType==MagicType_OneMagic)
  2706. {
  2707. if (SwitchToCardIndex(cbCardData)==m_cbMagicIndexFirst)
  2708. {
  2709. return true;
  2710. }
  2711. }
  2712. if (m_MagicType==MagicType_TwoMagic)
  2713. {
  2714. if (SwitchToCardIndex(cbCardData) == m_cbMagicIndexFirst ||
  2715. SwitchToCardIndex(cbCardData) == m_cbMagicIndexSecond)
  2716. return true;
  2717. }
  2718. return false;
  2719. }
  2720. //test3
  2721. bool CGameLogic_dcs::test3Combine(const BYTE cbCard1, const BYTE cbCard2, const BYTE cbCard3)
  2722. {
  2723. //花色不同 不能组合
  2724. if (GetCardColor(cbCard1) != GetCardColor(cbCard2) || GetCardColor(cbCard1) != GetCardColor(cbCard3))
  2725. {
  2726. return false;
  2727. }
  2728. //刻字
  2729. if (cbCard1 == cbCard2&& cbCard2 == cbCard3)
  2730. {
  2731. // DebugLog(_T("test3Combine 刻字 %02x %02x %02x\r\n"), cbCard1, cbCard2, cbCard3);
  2732. return true;
  2733. }
  2734. //风牌不能组成顺子
  2735. if (GetCardColor(cbCard3) == 3)
  2736. {
  2737. return false;
  2738. }
  2739. if (cbCard1 + 1 == cbCard2&& cbCard2 + 1 == cbCard3)
  2740. {
  2741. // DebugLog(_T("test3Combine 顺子 %02x %02x %02x\r\n"), cbCard1, cbCard2, cbCard3);
  2742. return true;
  2743. }
  2744. return false;
  2745. }
  2746. bool CGameLogic_dcs::test3combineToShun(const BYTE cbCard1, const BYTE cbCard2, const BYTE cbCard3)
  2747. {
  2748. //花色不同 不能组合
  2749. if (GetCardColor(cbCard1) != GetCardColor(cbCard2) || GetCardColor(cbCard1) != GetCardColor(cbCard3))
  2750. {
  2751. return false;
  2752. }
  2753. //风牌不能组成顺子
  2754. if (GetCardColor(cbCard3) == 3)
  2755. {
  2756. return false;
  2757. }
  2758. if (cbCard1 + 1 == cbCard2&& cbCard2 + 1 == cbCard3)
  2759. {
  2760. // DebugLog(_T("test3Combine 顺子 %02x %02x %02x\r\n"), cbCard1, cbCard2, cbCard3);
  2761. return true;
  2762. }
  2763. return false;
  2764. }
  2765. //test2
  2766. bool CGameLogic_dcs::test2Combine(const BYTE cbCard1, const BYTE cbCard2)
  2767. {
  2768. if (cbCard1 == cbCard2)
  2769. {
  2770. // DebugLog(_T("test3Combine peng %02x %02x \r\n"), cbCard1, cbCard2);
  2771. return true;
  2772. }
  2773. return false;
  2774. }
  2775. //排序,根据牌值排序
  2776. bool CGameLogic_dcs::SortCardList( BYTE cbCardData[MAX_COUNT], BYTE cbCardCount )
  2777. {
  2778. //数目过虑
  2779. if (cbCardCount==0||cbCardCount>MAX_COUNT) return false;
  2780. //排序操作
  2781. bool bSorted=true;
  2782. BYTE cbSwitchData=0,cbLast=cbCardCount-1;
  2783. do
  2784. {
  2785. bSorted=true;
  2786. for (BYTE i=0;i<cbLast;i++)
  2787. {
  2788. if (cbCardData[i]>cbCardData[i+1])
  2789. {
  2790. //设置标志
  2791. bSorted=false;
  2792. //扑克数据
  2793. cbSwitchData=cbCardData[i];
  2794. cbCardData[i]=cbCardData[i+1];
  2795. cbCardData[i+1]=cbSwitchData;
  2796. }
  2797. }
  2798. cbLast--;
  2799. } while(bSorted==false);
  2800. return true;
  2801. }
  2802. //编码
  2803. //WORD占两个字节,
  2804. //num占高三位,剩下给倍数
  2805. //uFangShu 7位
  2806. //PaiZhi 占用低六位,
  2807. WORD CGameLogic_dcs::GetValue(BYTE uNum, BYTE uFangShu, WORD PaiZhi)
  2808. {
  2809. WORD mcd = PaiZhi | (uFangShu << 6) | (uNum << 13);
  2810. return mcd;
  2811. }
  2812. //解码
  2813. BYTE CGameLogic_dcs::DeCodeCard(const WORD cbCardData)
  2814. {
  2815. BYTE TempCardData = cbCardData & 0x003F;
  2816. return TempCardData;
  2817. }
  2818. //解码番薯
  2819. BYTE CGameLogic_dcs::DeCodeFanshu(const WORD cbCardData)
  2820. {
  2821. //BYTE num = (cbCardData & 0x3800) >> 11;
  2822. BYTE fanshu = (cbCardData & 0x07C0) >> 6;
  2823. //BYTE TempCardData = cbCardData & 0x003F;
  2824. return fanshu;
  2825. }
  2826. bool CGameLogic_dcs::PeiPai(BYTE ParZhi[MAX_REPERTORY_ZJ])
  2827. {
  2828. std::ifstream in;
  2829. std::string filename = "zuopai.dat";
  2830. in.open(filename);
  2831. if (!in.is_open())
  2832. {
  2833. return false;
  2834. }
  2835. static BYTE TempCardData[MAX_REPERTORY_ZJ];
  2836. ZeroMemory(TempCardData, sizeof(TempCardData));
  2837. BYTE tempCount = 0;
  2838. char ch[1];
  2839. while (!in.eof())
  2840. {
  2841. in.read(ch, 1);
  2842. TempCardData[tempCount++] = ch[0];
  2843. }
  2844. in.close();
  2845. if (tempCount<MAX_REPERTORY_ZJ)
  2846. {
  2847. return false;
  2848. }
  2849. for (BYTE i = 0; i < MAX_REPERTORY_ZJ; i++)
  2850. {
  2851. ASSERT(i < MAX_REPERTORY_ZJ);
  2852. ParZhi[i] = TempCardData[MAX_REPERTORY_ZJ - i - 1];
  2853. }
  2854. return true;
  2855. }
  2856. BYTE CGameLogic_dcs::GetEndCard(BYTE cbCardIndex[MAX_INDEX])
  2857. {
  2858. for (BYTE i = MAX_INDEX - 1; i >= 0; i--)
  2859. {
  2860. if (cbCardIndex[i] > 0 && !IsMagicCard(SwitchToCardData(i)))
  2861. {
  2862. return SwitchToCardData(i);
  2863. }
  2864. }
  2865. if (m_MagicType==MagicType_OneMagic)
  2866. {
  2867. return SwitchToCardData(m_cbMagicIndexFirst);
  2868. }
  2869. if (m_MagicType==MagicType_TwoMagic)
  2870. {
  2871. if (m_cbMagicIndexFirst > m_cbMagicIndexSecond)
  2872. {
  2873. return SwitchToCardData(m_cbMagicIndexFirst);
  2874. }
  2875. return SwitchToCardData(m_cbMagicIndexSecond);
  2876. }
  2877. }
  2878. /*
  2879. // 胡法分析函数
  2880. */
  2881. //大对子
  2882. bool CGameLogic_dcs::IsPengPeng(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount)
  2883. {
  2884. for (BYTE i = 0; i < cbItemCount; i++)
  2885. {
  2886. if (WeaveItem[i].cbWeaveKind&(WIK_LEFT | WIK_RIGHT | WIK_CENTER))
  2887. return false;
  2888. }
  2889. BYTE cbCardCount = GetCardCount(cbCardIndex);
  2890. BYTE DanCount = 0;
  2891. BYTE DuiZiCount = 0;
  2892. for (BYTE i = 0; i<MAX_INDEX; i++)
  2893. {
  2894. if (cbCardIndex[i] == 3)
  2895. {
  2896. DuiZiCount++;
  2897. }
  2898. if (cbCardIndex[i] == 2)
  2899. {
  2900. DanCount++;
  2901. }
  2902. }
  2903. switch (cbCardCount)
  2904. {
  2905. case 2:
  2906. if (DanCount == 1)
  2907. return true;
  2908. case 5:
  2909. if (DuiZiCount == 1 && DanCount == 1)
  2910. return true;
  2911. case 8:
  2912. if (DuiZiCount == 2 && DanCount == 1)
  2913. return true;
  2914. case 11:
  2915. if (DuiZiCount == 3 && DanCount == 1)
  2916. return true;
  2917. case 14:
  2918. if (DuiZiCount == 4 && DanCount == 1)
  2919. return true;
  2920. default:
  2921. return false;
  2922. }
  2923. return false;
  2924. }
  2925. //清一色牌
  2926. bool CGameLogic_dcs::IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount)
  2927. {
  2928. ////胡牌判断
  2929. //BYTE cbCardColor = 0xFF;
  2930. //for (BYTE i = 0; i < MAX_INDEX; i++)
  2931. //{
  2932. // if (cbCardIndex[i] != 0)
  2933. // {
  2934. // //花色判断
  2935. // if (cbCardColor != 0xFF)
  2936. // return false;
  2937. // //设置花色
  2938. // cbCardColor = (SwitchToCardData(i)&MASK_COLOR);
  2939. // //设置索引
  2940. // i = (i / 9 + 1) * 9 - 1;
  2941. // }
  2942. //}
  2943. ////组合判断
  2944. //for (BYTE i = 0; i<cbItemCount; i++)
  2945. //{
  2946. // BYTE cbCenterCard = WeaveItem[i].cbCenterCard;
  2947. // if ((cbCenterCard&MASK_COLOR) != cbCardColor) return false;
  2948. //}
  2949. //return true;
  2950. BYTE TmpcbCardIndex[MAX_INDEX] = { 0 };
  2951. CopyMemory(TmpcbCardIndex, cbCardIndex, MAX_INDEX);
  2952. //////////////////////////////////////////////////////////////////////////
  2953. //有风牌 不是青一色
  2954. int cbItemColor = -1;
  2955. for (int i = 0; i < cbItemCount; i++)
  2956. {
  2957. BYTE cbColor = GetCardColor(WeaveItem[i].cbCenterCard);
  2958. if (cbColor == Color_Feng)
  2959. {
  2960. return false;
  2961. }
  2962. if (cbItemColor == -1)
  2963. {
  2964. cbItemColor = cbColor;
  2965. }
  2966. if (cbItemColor != cbColor)
  2967. {
  2968. return false;
  2969. }
  2970. }
  2971. //////////////////////////////////////////////////////////////////////////
  2972. //删除风 删除财神 判断是否是一色
  2973. int nCurrentMagicCount = DeleteMagicCards(TmpcbCardIndex);
  2974. //如果有 东南西北中发白 不可能是青一色
  2975. bool bHasFeng2 = false;
  2976. for (int i = 1; i < 8; i++)
  2977. {
  2978. if (TmpcbCardIndex[26 + i] >0 )
  2979. {
  2980. return false;
  2981. }
  2982. }
  2983. if (cbItemColor != -1)
  2984. {
  2985. for (BYTE i = 0; i < 27; i++){
  2986. if (TmpcbCardIndex[i] != 0)
  2987. {
  2988. if (GetCardColor(SwitchToCardData(i)) != cbItemColor)
  2989. {
  2990. return false;
  2991. }
  2992. }
  2993. }
  2994. }
  2995. else
  2996. {
  2997. BYTE cbFirst = 0;
  2998. //遍历前 27张0-26
  2999. //得到第一张颜色 如果后面的颜色与第一个不一样,返回false
  3000. for (BYTE i = 0; i < 27; i++){
  3001. if (TmpcbCardIndex[i] != 0)
  3002. {
  3003. if (cbFirst == 0)
  3004. {
  3005. cbFirst = SwitchToCardData(i);
  3006. continue;
  3007. }
  3008. if (GetCardColor(cbFirst) != GetCardColor(SwitchToCardData(i)))
  3009. {
  3010. return false;
  3011. }
  3012. }
  3013. }
  3014. }
  3015. return true;
  3016. }
  3017. //门前清
  3018. bool CGameLogic_dcs::IsMenQianQing(const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount)
  3019. {
  3020. for (int i = 0; i < cbWeaveCount; i++)
  3021. {
  3022. if (WeaveItem[i].cbWeaveKind & (WIK_LEFT|WIK_RIGHT|WIK_CENTER|WIK_PENG|WIK_MING_GANG|WIK_BU_GANG))
  3023. {
  3024. return false;
  3025. }
  3026. }
  3027. return true;
  3028. }
  3029. bool CGameLogic_dcs::HaveFengKe(BYTE cbCardIndex[MAX_INDEX], tagWeaveItem WeaveItem[], BYTE& cbItemCount,int nCardIndex)
  3030. {
  3031. if (cbCardIndex[nCardIndex] + GetMaigcCardCount(cbCardIndex)<3)
  3032. {
  3033. return false;
  3034. }
  3035. //手牌已经有3个或以上 东风,则不需要计算了,有
  3036. BYTE cbCardTmpIndex[MAX_INDEX];
  3037. ZeroMemory(cbCardTmpIndex, MAX_INDEX);
  3038. CopyMemory(cbCardTmpIndex, cbCardIndex, MAX_INDEX);
  3039. if (cbCardTmpIndex[nCardIndex] >= 3 && !IsMagicCard(SwitchToCardData(nCardIndex))){
  3040. //手牌减去3个东风
  3041. cbCardTmpIndex[nCardIndex] -= 3;
  3042. WeaveItem[cbItemCount].cbCenterCard = SwitchToCardData(nCardIndex);
  3043. WeaveItem[cbItemCount].cbWeaveKind = WIK_PENG;
  3044. CopyMemory(cbCardIndex, cbCardTmpIndex, MAX_INDEX);
  3045. cbItemCount = cbItemCount + 1;
  3046. return true;
  3047. }
  3048. int nCountGang=0;
  3049. BYTE cbIndex[4] = { 0 };
  3050. for (int i = 0; i < MAX_INDEX;i++)
  3051. {
  3052. if (cbCardTmpIndex[i]==0)
  3053. {
  3054. continue;
  3055. }
  3056. if (cbCardTmpIndex[i]==4&&!IsMagicCard(SwitchToCardData(i)))
  3057. {
  3058. cbIndex[nCountGang++]=i;
  3059. }
  3060. }
  3061. if (nCountGang>=2)
  3062. {
  3063. BYTE cbCardTmp2Index[MAX_INDEX];
  3064. ZeroMemory(cbCardTmp2Index, MAX_INDEX);
  3065. CopyMemory(cbCardTmp2Index, cbCardTmpIndex, MAX_INDEX);
  3066. int nMagicTmpCount = DeleteMagicCards(cbCardTmp2Index);
  3067. for (int i = 0; i < nCountGang; i++)
  3068. {
  3069. cbCardTmp2Index[cbIndex[i]] = 1;
  3070. }
  3071. if (nMagicTmpCount>3)
  3072. {
  3073. nMagicTmpCount -= 3;
  3074. }
  3075. if (!TestHu(cbCardTmp2Index, nMagicTmpCount, WeaveItem, cbItemCount))
  3076. {
  3077. return false;
  3078. }
  3079. }
  3080. //如果手牌有 1/2 东风,怎计算一下 拿财神配合一下 剩下的牌胡不胡
  3081. // if (cbCardIndex[nCardIndex]>0)
  3082. // {
  3083. int nMagic = GetMaigcCardCount(cbCardIndex);
  3084. if (cbCardIndex[nCardIndex] !=0&& IsMagicCard(SwitchToCardData(nCardIndex)))//
  3085. {
  3086. if (nMagic<3)
  3087. {
  3088. return false;
  3089. }
  3090. //减去三个财神 判断能不能胡
  3091. if (DeleteMagicCards(cbCardTmpIndex, 3) != 3){
  3092. return false;
  3093. }
  3094. {
  3095. tagWeaveItem TmpWeaveItem[7];
  3096. ZeroMemory(TmpWeaveItem, sizeof(TmpWeaveItem));
  3097. CopyMemory(TmpWeaveItem, WeaveItem, sizeof(tagWeaveItem)*cbItemCount);
  3098. int cbItemCountTmp = cbItemCount;
  3099. TmpWeaveItem[cbItemCountTmp].cbCenterCard = SwitchToCardData(nCardIndex);
  3100. TmpWeaveItem[cbItemCountTmp].cbWeaveKind = WIK_SHUANG_PENG;
  3101. if (AnalyseCardNew(cbCardTmpIndex, TmpWeaveItem, cbItemCountTmp))
  3102. {
  3103. cbItemCount = cbItemCountTmp + 1;
  3104. CopyMemory(cbCardIndex, cbCardTmpIndex, MAX_INDEX);
  3105. CopyMemory(WeaveItem, TmpWeaveItem, sizeof(tagWeaveItem)*cbItemCount);
  3106. return true;
  3107. }
  3108. }
  3109. //////////////////////////////////////////////////////////////////////////////
  3110. //减去4个财神 判断能不能胡
  3111. ZeroMemory(cbCardTmpIndex, MAX_INDEX);
  3112. CopyMemory(cbCardTmpIndex, cbCardIndex, MAX_INDEX);
  3113. if (GetMaigcCardCount(cbCardIndex)>=4)
  3114. {
  3115. if (DeleteMagicCards(cbCardTmpIndex, 4) != 4){
  3116. return false;
  3117. }
  3118. {
  3119. tagWeaveItem TmpWeaveItem[7];
  3120. ZeroMemory(TmpWeaveItem, sizeof(TmpWeaveItem));
  3121. CopyMemory(TmpWeaveItem, WeaveItem, sizeof(tagWeaveItem)*cbItemCount);
  3122. int cbItemCountTmp = cbItemCount;
  3123. TmpWeaveItem[cbItemCountTmp].cbCenterCard = SwitchToCardData(nCardIndex);
  3124. TmpWeaveItem[cbItemCountTmp].cbWeaveKind = WIK_SAN_MING_GANG;
  3125. if (AnalyseCardNew(cbCardTmpIndex, TmpWeaveItem, cbItemCountTmp))
  3126. {
  3127. cbItemCount = cbItemCountTmp + 1;
  3128. CopyMemory(cbCardIndex, cbCardTmpIndex, MAX_INDEX);
  3129. CopyMemory(WeaveItem, TmpWeaveItem, sizeof(tagWeaveItem)*cbItemCount);
  3130. return true;
  3131. }
  3132. }
  3133. }
  3134. }
  3135. else
  3136. {
  3137. if (nMagic + cbCardIndex[nCardIndex] < 3)
  3138. {
  3139. return false;
  3140. }
  3141. }
  3142. //组成3张刻字
  3143. int nDeleteMagic = 0;
  3144. if (cbCardIndex[nCardIndex]<4)
  3145. {
  3146. nDeleteMagic = 3 - cbCardIndex[nCardIndex];
  3147. cbCardTmpIndex[nCardIndex] = 0;
  3148. if (DeleteMagicCards(cbCardTmpIndex, nDeleteMagic) == nDeleteMagic)
  3149. {
  3150. tagWeaveItem TmpWeaveItem[7];
  3151. ZeroMemory(TmpWeaveItem, sizeof(TmpWeaveItem));
  3152. CopyMemory(TmpWeaveItem, WeaveItem, sizeof(tagWeaveItem)*cbItemCount);
  3153. int cbItemCountTmp = cbItemCount;
  3154. TmpWeaveItem[cbItemCountTmp].cbCenterCard = SwitchToCardData(nCardIndex);
  3155. if (nDeleteMagic == 1)
  3156. {
  3157. TmpWeaveItem[cbItemCountTmp].cbWeaveKind = WIK_DAN_PENG;
  3158. }
  3159. else if (nDeleteMagic == 2)
  3160. {
  3161. TmpWeaveItem[cbItemCountTmp].cbWeaveKind = WIK_SHUANG_PENG;
  3162. }
  3163. else
  3164. {
  3165. TmpWeaveItem[cbItemCountTmp].cbWeaveKind = WIK_SHUANG_PENG;
  3166. }
  3167. if (AnalyseCardNew(cbCardTmpIndex, TmpWeaveItem, cbItemCountTmp))
  3168. {
  3169. cbItemCount = cbItemCountTmp + 1;
  3170. CopyMemory(cbCardIndex, cbCardTmpIndex, MAX_INDEX);
  3171. CopyMemory(WeaveItem, TmpWeaveItem, sizeof(tagWeaveItem)*cbItemCount);
  3172. return true;
  3173. }
  3174. }
  3175. }
  3176. //组成4张杠
  3177. {
  3178. ZeroMemory(cbCardTmpIndex, MAX_INDEX);
  3179. CopyMemory(cbCardTmpIndex, cbCardIndex, MAX_INDEX);
  3180. if (nMagic + cbCardIndex[nCardIndex]<4)
  3181. {
  3182. return false;
  3183. }
  3184. int nDeleteMagic = 4 - cbCardIndex[nCardIndex];
  3185. cbCardTmpIndex[nCardIndex] = 0;
  3186. if (DeleteMagicCards(cbCardTmpIndex, nDeleteMagic) == nDeleteMagic)
  3187. {
  3188. tagWeaveItem TmpWeaveItem[7];
  3189. CopyMemory(TmpWeaveItem, WeaveItem, sizeof(WeaveItem));
  3190. int cbItemCountTmp = cbItemCount;
  3191. TmpWeaveItem[cbItemCountTmp].cbCenterCard = SwitchToCardData(nCardIndex);
  3192. if (nDeleteMagic == 1)
  3193. {
  3194. TmpWeaveItem[cbItemCountTmp].cbWeaveKind = WIK_DAN_MING_GANG;
  3195. }
  3196. else if (nDeleteMagic == 2)
  3197. {
  3198. TmpWeaveItem[cbItemCountTmp].cbWeaveKind = WIK_SHUANG_PENG;
  3199. }
  3200. else{
  3201. TmpWeaveItem[cbItemCountTmp].cbWeaveKind = WIK_SAN_MING_GANG;
  3202. }
  3203. if (AnalyseCardNew(cbCardTmpIndex, TmpWeaveItem, cbItemCountTmp))
  3204. {
  3205. CopyMemory(cbCardIndex, cbCardTmpIndex, MAX_INDEX);
  3206. CopyMemory(WeaveItem, TmpWeaveItem, sizeof(TmpWeaveItem));
  3207. cbItemCount = cbItemCountTmp+1;
  3208. return true;
  3209. }
  3210. }
  3211. }
  3212. // }
  3213. return false;
  3214. }
  3215. //获取癞子个数
  3216. BYTE CGameLogic_dcs::GetMaigcCardCount(const BYTE cbCardIndex[MAX_INDEX])
  3217. {
  3218. if (m_MagicType==MagicType_NoMagic)
  3219. {
  3220. return 0;
  3221. }
  3222. if (m_MagicType==MagicType_OneMagic)
  3223. {
  3224. return cbCardIndex[m_cbMagicIndexFirst];
  3225. }
  3226. if (m_MagicType==MagicType_TwoMagic)
  3227. {
  3228. return cbCardIndex[m_cbMagicIndexFirst] + cbCardIndex[m_cbMagicIndexSecond];
  3229. }
  3230. return 0;
  3231. }
  3232. //对财神牌可变牌判断
  3233. void CGameLogic_dcs::IsCanChangCardAndCount(const BYTE cbCardIndex[MAX_INDEX], BYTE Fanhui[MAX_INDEX])
  3234. {
  3235. //目的 减少后续的计算里量
  3236. //遍历手牌,将包含的牌 附近的2张牌 设置为1,因为只有相关的牌才可能产生影响,不产生影响的牌 不必要计算
  3237. //如果手牌没有万字 则可以在后续计算时 排除万字计算
  3238. ZeroMemory(Fanhui, MAX_INDEX);
  3239. for (int UserCardIndex = 0; UserCardIndex < MAX_INDEX; UserCardIndex++)
  3240. {
  3241. if (UserCardIndex>31||UserCardIndex==27)
  3242. {
  3243. Fanhui[UserCardIndex] = 1;
  3244. continue;
  3245. }
  3246. if (cbCardIndex[UserCardIndex] != 0)
  3247. {
  3248. if (UserCardIndex < 27)
  3249. {
  3250. if ((UserCardIndex % 9) > 2 && (UserCardIndex % 9) < 7)
  3251. {
  3252. //如果有 3-7 的手牌 则把前后2张牌 都设置为 有用的牌,留下来计算
  3253. for (int j = UserCardIndex - 2; j <= UserCardIndex + 2; j++)
  3254. {
  3255. Fanhui[j] = 1;
  3256. }
  3257. }
  3258. else if ((UserCardIndex % 9) <= 2)
  3259. {
  3260. //如水果是1-2 则把后两张设置为可用
  3261. BYTE GaoWei = UserCardIndex / 9;
  3262. for (int j = 9 * GaoWei; j <= UserCardIndex + 2; j++)
  3263. {
  3264. Fanhui[j] = 1;
  3265. }
  3266. }
  3267. else
  3268. {
  3269. //如水果是8-9 则把前两张设置为可用
  3270. for (int j = UserCardIndex - 2; j < (1 + UserCardIndex / 9) * 9; j++)
  3271. {
  3272. Fanhui[j] = 1;
  3273. }
  3274. }
  3275. }
  3276. else
  3277. {
  3278. //风牌都设置为1
  3279. Fanhui[UserCardIndex] = 1;
  3280. }
  3281. }
  3282. }
  3283. }
  3284. void CGameLogic_dcs::ShowMagicData()
  3285. {
  3286. if (mMagicDataCount==0)
  3287. {
  3288. return;
  3289. }
  3290. CString strData;
  3291. strData = _T("财神充当以下牌 ");
  3292. for (int i = 0; i < mMagicDataCount;i++)
  3293. {
  3294. mMagicReplaceCard[SwitchToCardIndex(mMagicData[i])] = 1;
  3295. CString strTmpData;
  3296. strTmpData.Format(_T(" %02x "), mMagicData[i]);
  3297. strData.Append(strTmpData);
  3298. }
  3299. strData.Append(_T("\r\n"));
  3300. ////OutputDebugString(strData);
  3301. }
  3302. void CGameLogic_dcs::ShowMagicReplaceData()
  3303. {
  3304. CString strData;
  3305. strData = _T("ShowMagicReplaceData 财神充当以下牌 ----------\r\n");
  3306. for (int n = 0; n < MAX_INDEX;n++)
  3307. {
  3308. if (mMagicReplaceCard[n]>0)
  3309. {
  3310. CString strTmpData;
  3311. strTmpData.Format(_T(" %02x "), SwitchToCardData(n));
  3312. strData.Append(strTmpData);
  3313. }
  3314. }
  3315. strData.Append(_T("\r\n"));
  3316. ////OutputDebugString(strData);
  3317. }
  3318. //删掉pSrc数组中有和pDeleteCards中的nDelCount个元素相等的元素,再将删了元素的数组pSrc,重新按序放入一个新的数组中Cards
  3319. void CGameLogic_dcs::DeleteCards(const BYTE* pSrc, int nCount, const BYTE* pDeleteCards, int nDelCount, BYTE Cards[14]) {
  3320. BYTE * pTmpSrc = new BYTE[nCount];
  3321. ZeroMemory(pTmpSrc, nCount);
  3322. CopyMemory(pTmpSrc, pSrc, nCount);
  3323. for (int i = 0; i < nDelCount; i++)
  3324. {
  3325. for (int nSrc = 0; nSrc < nCount; nSrc++) {
  3326. if (pDeleteCards[i]== pTmpSrc[nSrc])
  3327. {
  3328. pTmpSrc[nSrc] = 0;
  3329. break;
  3330. }
  3331. }
  3332. }
  3333. int nCountOut = 0;
  3334. ZeroMemory(Cards, 14);
  3335. for (int i = 0; i < nCount; i++)
  3336. {
  3337. if (pTmpSrc[i]!=0)
  3338. {
  3339. Cards[nCountOut++] = pTmpSrc[i];
  3340. }
  3341. }
  3342. delete pTmpSrc;
  3343. pTmpSrc = NULL;
  3344. }
  3345. BOOL CGameLogic_dcs::IsCanHuAllCards(BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  3346. {
  3347. for (int i = 0; i < MAX_INDEX; i++)
  3348. {
  3349. if (cbCardIndex[i]==4)
  3350. {
  3351. continue;
  3352. }
  3353. cbCardIndex[i]++;
  3354. if (!AnalyseCardNew(cbCardIndex, WeaveItem,cbWeaveCount))
  3355. {
  3356. cbCardIndex[i]--;
  3357. return FALSE;
  3358. }
  3359. //CChiHuRight cht;
  3360. //BYTE cbData;
  3361. //if (AnalyseChiHuCard(cbCardIndex,WeaveItem,cbWeaveCount,SwitchToCardData(i),cht,cbData)==WIK_NULL)
  3362. //{
  3363. // return FALSE;
  3364. //}
  3365. cbCardIndex[i]--;
  3366. }
  3367. return TRUE;
  3368. }
  3369. #include<algorithm>
  3370. bool comp_TaiNums(const qg_taiNums &a, const qg_taiNums &b){
  3371. return a.nTaiNum > b.nTaiNum;
  3372. }
  3373. int CGameLogic_dcs::AnalyseChiHuCard_DeleteMagic( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount,
  3374. BYTE cbCurrentCard, CChiHuRight &ChiHuRight, BYTE& nHuTai, bool bFlag, bool bQiangGangFlag)
  3375. {
  3376. int nMagicCount = GetMaigcCardCount(cbCardIndex);
  3377. std::vector<qg_taiNums> TempVerTaiNum;
  3378. //if (nMagicCount >=1)
  3379. //{
  3380. // //用一个财神 与抢杠牌 组成顺子
  3381. // do
  3382. // {
  3383. // if (CardIsOne(cbCurrentCard))
  3384. // {
  3385. // //只能组成 1x3 12x
  3386. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 2, WIK_LEFT, TempVerTaiNum);
  3387. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 1, WIK_LEFT, TempVerTaiNum);
  3388. //
  3389. // }
  3390. // else if (CardIsNine(cbCurrentCard))
  3391. // {
  3392. // //只能组成 7x9 x89
  3393. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -2, WIK_RIGHT, TempVerTaiNum);
  3394. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1, WIK_RIGHT, TempVerTaiNum);
  3395. //
  3396. // }
  3397. // else if (CardIsTwo(cbCurrentCard))
  3398. // { //2 123 234 x23 12x 2x4 23x
  3399. //
  3400. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 1, WIK_CENTER, TempVerTaiNum);
  3401. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1, WIK_CENTER, TempVerTaiNum);
  3402. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 2, WIK_LEFT, TempVerTaiNum);
  3403. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 1, WIK_LEFT, TempVerTaiNum);
  3404. // }
  3405. // else if(CardIsEight(cbCurrentCard))
  3406. // {//8 678 789 x78 6x8 7x9 78x
  3407. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1, WIK_RIGHT, TempVerTaiNum);
  3408. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -2, WIK_RIGHT, TempVerTaiNum);
  3409. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 1, WIK_CENTER, TempVerTaiNum);
  3410. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 2, WIK_CENTER, TempVerTaiNum);
  3411. // }
  3412. // else
  3413. // {
  3414. // // 以3 为例子 1x3 x23 (123) 23x x34 (234) 3x5 34x (345)
  3415. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1, WIK_RIGHT, TempVerTaiNum);
  3416. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -2, WIK_RIGHT, TempVerTaiNum);
  3417. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 1, WIK_CENTER, TempVerTaiNum);
  3418. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1, WIK_CENTER, TempVerTaiNum);
  3419. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 2, WIK_LEFT, TempVerTaiNum);
  3420. // AnalyseQiangGangTaiNumInfo(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 1, WIK_LEFT, TempVerTaiNum);
  3421. // }
  3422. // } while (false);
  3423. //
  3424. //}
  3425. //if (nMagicCount>=2)
  3426. //{
  3427. // BYTE szTmpCardIndex[MAX_INDEX] = { 0 };
  3428. // CopyMemory(szTmpCardIndex, cbCardIndex, MAX_INDEX);
  3429. // DeleteMagicCards(szTmpCardIndex, 2);
  3430. // //组成2中情况 双财吃 双财碰
  3431. // tagWeaveItem WeaveItemArray[MAX_WEAVE] = { 0 };
  3432. // CopyMemory(WeaveItemArray, WeaveItem, sizeof(tagWeaveItem)*cbWeaveCount);
  3433. //
  3434. // WeaveItemArray[cbWeaveCount].cbCenterCard = cbCurrentCard;
  3435. // WeaveItemArray[cbWeaveCount].cbPublicCard = false;
  3436. // WeaveItemArray[cbWeaveCount].cbWeaveKind = WIK_SHUANG_PENG;
  3437. // int nCbWeaveCount = cbWeaveCount + 1;
  3438. // BYTE nTaiNum = 0;
  3439. // if (GetTaiNumAndChihuRight(szTmpCardIndex, WeaveItemArray, nCbWeaveCount, ChiHuRight, nTaiNum, bFlag, bQiangGangFlag))
  3440. // {
  3441. // if (nTaiNum >= 3)
  3442. // {
  3443. // if (AnalyseCardTaiNum_IsDuMagic(cbCardIndex, WeaveItem, cbWeaveCount))
  3444. // {
  3445. // nTaiNum++;
  3446. // mChiHuRight |= ZJ_TAI_Gang;//定财神 此值 用作 独财胡
  3447. // }
  3448. // qg_taiNums tainum;
  3449. // tainum.chiHuRight = mChiHuRight;
  3450. // tainum.nTaiNum = nTaiNum;
  3451. // TempVerTaiNum.push_back(tainum);
  3452. // }
  3453. // }
  3454. // CopyMemory(WeaveItemArray, WeaveItem, sizeof(tagWeaveItem)*cbWeaveCount);
  3455. //
  3456. // WeaveItemArray[cbWeaveCount].cbCenterCard = cbCurrentCard;
  3457. // WeaveItemArray[cbWeaveCount].cbPublicCard = false;
  3458. // WeaveItemArray[cbWeaveCount].cbWeaveKind = WIK_SHUANG_CAICHI;
  3459. // nCbWeaveCount = cbWeaveCount + 1;
  3460. // if (GetTaiNumAndChihuRight(szTmpCardIndex, WeaveItemArray, nCbWeaveCount, ChiHuRight, nTaiNum, bFlag, bQiangGangFlag))
  3461. // {
  3462. // if (nTaiNum >= 3)
  3463. // {
  3464. // if (AnalyseCardTaiNum_IsDuMagic(cbCardIndex, WeaveItem, cbWeaveCount))
  3465. // {
  3466. // nTaiNum++;
  3467. // mChiHuRight |= ZJ_TAI_Gang;//定财神 此值 用作 独财胡
  3468. // }
  3469. // qg_taiNums tainum;
  3470. // tainum.chiHuRight = mChiHuRight;
  3471. // tainum.nTaiNum = nTaiNum;
  3472. // TempVerTaiNum.push_back(tainum);
  3473. // }
  3474. // }
  3475. //} while (FALSE);
  3476. //增加用0个财神 组合的代码。逻辑上不应该是用户财神的数量 而是与抢杠牌组合的财神数量 来计算。
  3477. //所以当用户有N个财神,但不需要与抢杠的牌组合时 也需要计算
  3478. do
  3479. {
  3480. if (CardIsOne(cbCurrentCard))
  3481. {
  3482. //只能组成123
  3483. AnalyseQiangGangTaiNumInfo_WithNoMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 1,2, WIK_LEFT, TempVerTaiNum);
  3484. }
  3485. else if (CardIsNine(cbCurrentCard))
  3486. {
  3487. //只能组成 789
  3488. AnalyseQiangGangTaiNumInfo_WithNoMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1, -2, WIK_RIGHT, TempVerTaiNum);
  3489. }
  3490. else if (CardIsTwo(cbCurrentCard))
  3491. { //123 234
  3492. AnalyseQiangGangTaiNumInfo_WithNoMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1,1 ,WIK_CENTER, TempVerTaiNum);
  3493. AnalyseQiangGangTaiNumInfo_WithNoMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 1,2, WIK_CENTER, TempVerTaiNum);
  3494. }
  3495. else if (CardIsEight(cbCurrentCard))
  3496. {//8 678 789
  3497. AnalyseQiangGangTaiNumInfo_WithNoMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1,-2, WIK_RIGHT, TempVerTaiNum);
  3498. AnalyseQiangGangTaiNumInfo_WithNoMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1,1, WIK_RIGHT, TempVerTaiNum);
  3499. }
  3500. else
  3501. {
  3502. // 以3 为例子 1x3 x23 (123) 23x x34 (234) 3x5 34x (345)
  3503. AnalyseQiangGangTaiNumInfo_WithNoMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1,-2, WIK_RIGHT, TempVerTaiNum);
  3504. AnalyseQiangGangTaiNumInfo_WithNoMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, -1,1, WIK_RIGHT, TempVerTaiNum);
  3505. AnalyseQiangGangTaiNumInfo_WithNoMagic(cbCardIndex, WeaveItem, cbWeaveCount, cbCurrentCard, 1,2, WIK_CENTER, TempVerTaiNum);
  3506. }
  3507. } while (false);
  3508. if (TempVerTaiNum.size() > 0)
  3509. {
  3510. std::sort(TempVerTaiNum.begin(), TempVerTaiNum.end(), comp_TaiNums);
  3511. nHuTai = TempVerTaiNum[0].nTaiNum;
  3512. ChiHuRight = TempVerTaiNum[0].chiHuRight;
  3513. return WIK_ZI_MO;
  3514. }
  3515. return WIK_NULL;
  3516. }
  3517. BOOL CGameLogic_dcs::AnalyseQiangGangTaiNumInfo(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, int Offset, BYTE cbWeaveKind, std::vector<qg_taiNums>&TempVerTaiNum)
  3518. {
  3519. do
  3520. {
  3521. BYTE szTmpCardIndex[MAX_INDEX] = { 0 };
  3522. CopyMemory(szTmpCardIndex, cbCardIndex, MAX_INDEX);
  3523. DeleteMagicCards(szTmpCardIndex, 1);
  3524. if (szTmpCardIndex[SwitchToCardIndex(cbCurrentCard) + Offset]>0)
  3525. {
  3526. szTmpCardIndex[SwitchToCardIndex(cbCurrentCard) + Offset]--;
  3527. }
  3528. else{
  3529. break;
  3530. }
  3531. tagWeaveItem WeaveItemArray[MAX_WEAVE] = { 0 };
  3532. CopyMemory(WeaveItemArray, WeaveItem, sizeof(tagWeaveItem)*cbWeaveCount);
  3533. tagWeaveItem item;
  3534. WeaveItemArray[cbWeaveCount].cbCenterCard = cbCurrentCard;
  3535. WeaveItemArray[cbWeaveCount].cbPublicCard = false;
  3536. WeaveItemArray[cbWeaveCount].cbWeaveKind = WIK_LEFT;
  3537. int nCbWeaveCount = cbWeaveCount + 1;
  3538. /*
  3539. WIK_LEFT | WIK_CENTER | WIK_RIGHT | WIK_PENG
  3540. */
  3541. BYTE nTaiNum = 0;
  3542. CChiHuRight ChiHuRight;
  3543. if (GetTaiNumAndChihuRight(szTmpCardIndex, WeaveItemArray, nCbWeaveCount, ChiHuRight, nTaiNum, FALSE, TRUE))
  3544. {
  3545. if (nTaiNum >= 3)
  3546. {
  3547. if (AnalyseCardTaiNum_IsDuMagic(cbCardIndex, WeaveItem, cbWeaveCount))
  3548. {
  3549. nTaiNum++;
  3550. mChiHuRight |= ZJ_TAI_Gang;//定财神 此值 用作 独财胡
  3551. }
  3552. qg_taiNums tainum;
  3553. tainum.chiHuRight = mChiHuRight;
  3554. tainum.nTaiNum = nTaiNum;
  3555. TempVerTaiNum.push_back(tainum);
  3556. }
  3557. }
  3558. } while (FALSE);
  3559. return TRUE;
  3560. }
  3561. BOOL CGameLogic_dcs::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)
  3562. {
  3563. do
  3564. {
  3565. BYTE szTmpCardIndex[MAX_INDEX] = { 0 };
  3566. CopyMemory(szTmpCardIndex, cbCardIndex, MAX_INDEX);
  3567. if (szTmpCardIndex[SwitchToCardIndex(cbCurrentCard) + Offset]>0)
  3568. {
  3569. szTmpCardIndex[SwitchToCardIndex(cbCurrentCard) + Offset]--;
  3570. }
  3571. else{
  3572. break;
  3573. }
  3574. if (szTmpCardIndex[SwitchToCardIndex(cbCurrentCard) + Offset2] > 0)
  3575. {
  3576. szTmpCardIndex[SwitchToCardIndex(cbCurrentCard) + Offset2]--;
  3577. }
  3578. else{
  3579. break;
  3580. }
  3581. tagWeaveItem WeaveItemArray[MAX_WEAVE] = { 0 };
  3582. CopyMemory(WeaveItemArray, WeaveItem, sizeof(tagWeaveItem)*cbWeaveCount);
  3583. tagWeaveItem item;
  3584. WeaveItemArray[cbWeaveCount].cbCenterCard = cbCurrentCard;
  3585. WeaveItemArray[cbWeaveCount].cbPublicCard = false;
  3586. WeaveItemArray[cbWeaveCount].cbWeaveKind = WIK_LEFT;
  3587. int nCbWeaveCount = cbWeaveCount + 1;
  3588. /*
  3589. WIK_LEFT | WIK_CENTER | WIK_RIGHT | WIK_PENG
  3590. */
  3591. BYTE nTaiNum = 0;
  3592. CChiHuRight ChiHuRight;
  3593. if (GetTaiNumAndChihuRight(szTmpCardIndex, WeaveItemArray, nCbWeaveCount, ChiHuRight, nTaiNum, FALSE, TRUE))
  3594. {
  3595. if (nTaiNum >= 3)
  3596. {
  3597. if (AnalyseCardTaiNum_IsDuMagic(cbCardIndex, WeaveItem, cbWeaveCount))
  3598. {
  3599. nTaiNum++;
  3600. mChiHuRight |= ZJ_TAI_Gang;//定财神 此值 用作 独财胡
  3601. }
  3602. qg_taiNums tainum;
  3603. tainum.chiHuRight = mChiHuRight;
  3604. tainum.nTaiNum = nTaiNum;
  3605. TempVerTaiNum.push_back(tainum);
  3606. }
  3607. }
  3608. } while (FALSE);
  3609. return TRUE;
  3610. }
  3611. int CGameLogic_dcs::GetTaiNumAndChihuRight(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CChiHuRight &ChiHuRight, BYTE& nHuTai, bool bFlag, bool bQiangGangFlag)
  3612. {
  3613. if (AnalyseCardNew(cbCardIndex, WeaveItem, cbWeaveCount))
  3614. {
  3615. mSunTaiJiangInColor = mJiangInColor;
  3616. int nTai = AnalyseCardTaiNum(cbCardIndex, WeaveItem, cbWeaveCount);
  3617. if (nTai > 0 || bFlag || bQiangGangFlag)
  3618. {
  3619. if (bFlag)
  3620. {
  3621. nTai++;
  3622. }
  3623. if (bQiangGangFlag)
  3624. {
  3625. nTai++;
  3626. }
  3627. nHuTai = nTai;
  3628. ChiHuRight = mChiHuRight;
  3629. }
  3630. return nTai;
  3631. }
  3632. return 0;
  3633. }
  3634. BOOL CGameLogic_dcs::CardIsOne(BYTE cbCard)
  3635. {
  3636. return GetCardValue(cbCard) == 1;
  3637. }
  3638. BOOL CGameLogic_dcs::CardIsTwo(BYTE cbCard)
  3639. {
  3640. return GetCardValue(cbCard) == 2;
  3641. }
  3642. BOOL CGameLogic_dcs::CardIsNine(BYTE cbCard)
  3643. {
  3644. return GetCardValue(cbCard) ==9;
  3645. }
  3646. BOOL CGameLogic_dcs::CardIsEight(byte cbCard)
  3647. {
  3648. return GetCardValue(cbCard) ==8;
  3649. }
  3650. //////////////////////////////////////////////////////////////////////////