诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1464 lines
37 KiB

  1. #include "StdAfx.h"
  2. #include "GameLogicOther.h"
  3. #include "math.h"
  4. #include "TableFrameSinkOther.h"
  5. #include "fstream"
  6. #include "GameLogic.h"
  7. //////////////////////////////////////////////////////////////////////////
  8. //静态变量
  9. //扑克数据,一脚癞油的基础数据
  10. const BYTE CGameLogicOther::m_cbCardDataArray[MAX_REPERTORY] =
  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. };
  25. //三人两房 扑克数据
  26. const BYTE CGameLogicOther::m_cbCardDataArray_SRLF[MAX_REPERTORY_SRLF] =
  27. {
  28. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
  29. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
  30. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
  31. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
  32. 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
  33. 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
  34. 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
  35. 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
  36. };
  37. //////////////////////////////////////////////////////////////////////////
  38. //构造函数
  39. CGameLogicOther::CGameLogicOther(CTableFrameSinkOther* pTableFramSink)
  40. {
  41. m_cbMagicIndex = MAX_INDEX;
  42. m_pTableFramSink = pTableFramSink;
  43. }
  44. //析构函数
  45. CGameLogicOther::~CGameLogicOther()
  46. {
  47. }
  48. //混乱扑克
  49. BYTE CGameLogicOther::RandCardData(BYTE cbCardData[])
  50. {
  51. BYTE cbCardDataTemp[MAX_REPERTORY];
  52. BYTE cbMaxCount = 0;
  53. //混乱准备
  54. //if (srlf == m_pTableFramSink->m_gameConfig.wSubGameID)
  55. //{
  56. // CopyMemory(cbCardDataTemp, m_cbCardDataArray_SRLF, sizeof(m_cbCardDataArray_SRLF));
  57. // cbMaxCount = MAX_REPERTORY_SRLF;
  58. //}
  59. //else {
  60. CopyMemory(cbCardDataTemp, m_cbCardDataArray, sizeof(m_cbCardDataArray));
  61. cbMaxCount = MAX_REPERTORY;
  62. //}
  63. //混乱扑克
  64. BYTE cbRandCount = 0, cbPosition = 0;
  65. do
  66. {
  67. cbPosition = rand() % (cbMaxCount - cbRandCount);
  68. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  69. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  70. } while (cbRandCount < cbMaxCount);
  71. return cbMaxCount;
  72. }
  73. //删除扑克
  74. bool CGameLogicOther::RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard)
  75. {
  76. //效验扑克
  77. ASSERT(IsValidCard(cbRemoveCard));
  78. ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard)]>0);
  79. //删除扑克
  80. BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard);
  81. if (cbCardIndex[cbRemoveIndex]>0)
  82. {
  83. cbCardIndex[cbRemoveIndex]--;
  84. return true;
  85. }
  86. //失败效验
  87. ASSERT(FALSE);
  88. return false;
  89. }
  90. //删除扑克
  91. bool CGameLogicOther::RemoveCard(BYTE cbCardIndex[MAX_INDEX], const BYTE cbRemoveCard[], BYTE cbRemoveCount)
  92. {
  93. //删除扑克
  94. for (BYTE i=0;i<cbRemoveCount;i++)
  95. {
  96. //效验扑克
  97. ASSERT(IsValidCard(cbRemoveCard[i]));
  98. ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard[i])]>0);
  99. //删除扑克
  100. BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard[i]);
  101. if (cbCardIndex[cbRemoveIndex]==0)
  102. {
  103. //错误断言
  104. ASSERT(FALSE);
  105. //还原删除
  106. for (BYTE j=0;j<i;j++)
  107. {
  108. ASSERT(IsValidCard(cbRemoveCard[j]));
  109. cbCardIndex[SwitchToCardIndex(cbRemoveCard[j])]++;
  110. }
  111. return false;
  112. }
  113. else
  114. {
  115. //删除扑克
  116. --cbCardIndex[cbRemoveIndex];
  117. }
  118. }
  119. return true;
  120. }
  121. //删除扑克
  122. bool CGameLogicOther::RemoveCard(BYTE cbCardData[], BYTE cbCardCount, const BYTE cbRemoveCard[], BYTE cbRemoveCount)
  123. {
  124. //检验数据
  125. ASSERT(cbCardCount<=14);
  126. ASSERT(cbRemoveCount<=cbCardCount);
  127. //定义变量
  128. BYTE cbDeleteCount=0,cbTempCardData[14];
  129. if (cbCardCount>CountArray(cbTempCardData))
  130. return false;
  131. CopyMemory(cbTempCardData,cbCardData,cbCardCount*sizeof(cbCardData[0]));
  132. //置零扑克
  133. for (BYTE i=0;i<cbRemoveCount;i++)
  134. {
  135. for (BYTE j=0;j<cbCardCount;j++)
  136. {
  137. if (cbRemoveCard[i]==cbTempCardData[j])
  138. {
  139. cbDeleteCount++;
  140. cbTempCardData[j]=0;
  141. break;
  142. }
  143. }
  144. }
  145. //成功判断
  146. if (cbDeleteCount!=cbRemoveCount)
  147. {
  148. ASSERT(FALSE);
  149. return false;
  150. }
  151. //清理扑克
  152. BYTE cbCardPos=0;
  153. for (BYTE i=0;i<cbCardCount;i++)
  154. {
  155. if (cbTempCardData[i]!=0)
  156. cbCardData[cbCardPos++]=cbTempCardData[i];
  157. }
  158. return true;
  159. }
  160. //有效判断
  161. bool CGameLogicOther::IsValidCard(BYTE cbCardData)
  162. {
  163. BYTE cbValue=(cbCardData&MASK_VALUE);
  164. BYTE cbColor=(cbCardData&MASK_COLOR)>>4;
  165. return (((cbValue>=1)&&(cbValue<=9)&&(cbColor<=2))||((cbValue>=1)&&(cbValue<=7)&&(cbColor==3)));
  166. }
  167. //扑克数目
  168. BYTE CGameLogicOther::GetCardCount(const BYTE cbCardIndex[MAX_INDEX])
  169. {
  170. //数目统计
  171. BYTE cbCardCount=0;
  172. for (BYTE i=0;i<MAX_INDEX;i++)
  173. cbCardCount+=cbCardIndex[i];
  174. return cbCardCount;
  175. }
  176. //获取组合
  177. BYTE CGameLogicOther::GetWeaveCard(int cbWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4])
  178. {
  179. //组合扑克
  180. switch (cbWeaveKind)
  181. {
  182. case WIK_LEFT: //上牌操作
  183. {
  184. //设置变量
  185. cbCardBuffer[0]=cbCenterCard;
  186. cbCardBuffer[1]=cbCenterCard+1;
  187. cbCardBuffer[2]=cbCenterCard+2;
  188. return 3;
  189. }
  190. case WIK_RIGHT: //上牌操作
  191. {
  192. //设置变量
  193. cbCardBuffer[0]=cbCenterCard;
  194. cbCardBuffer[1]=cbCenterCard-1;
  195. cbCardBuffer[2]=cbCenterCard-2;
  196. return 3;
  197. }
  198. case WIK_CENTER: //上牌操作
  199. {
  200. //设置变量
  201. cbCardBuffer[0]=cbCenterCard;
  202. cbCardBuffer[1]=cbCenterCard-1;
  203. cbCardBuffer[2]=cbCenterCard+1;
  204. return 3;
  205. }
  206. case WIK_PENG: //碰牌操作
  207. {
  208. //设置变量
  209. cbCardBuffer[0]=cbCenterCard;
  210. cbCardBuffer[1]=cbCenterCard;
  211. cbCardBuffer[2]=cbCenterCard;
  212. return 3;
  213. }
  214. case WIK_GANG: //杠牌操作
  215. {
  216. //设置变量
  217. cbCardBuffer[0]=cbCenterCard;
  218. cbCardBuffer[1]=cbCenterCard;
  219. cbCardBuffer[2]=cbCenterCard;
  220. cbCardBuffer[3]=cbCenterCard;
  221. return 4;
  222. }
  223. case WIK_MING_GANG: //明杠牌操作
  224. {
  225. //设置变量
  226. cbCardBuffer[0] = cbCenterCard;
  227. cbCardBuffer[1] = cbCenterCard;
  228. cbCardBuffer[2] = cbCenterCard;
  229. cbCardBuffer[3] = cbCenterCard;
  230. return 4;
  231. }
  232. case WIK_AN_GANG: //暗杠牌操作
  233. {
  234. //设置变量
  235. cbCardBuffer[0] = cbCenterCard;
  236. cbCardBuffer[1] = cbCenterCard;
  237. cbCardBuffer[2] = cbCenterCard;
  238. cbCardBuffer[3] = cbCenterCard;
  239. return 4;
  240. }
  241. case WIK_AN_PIGANG: //暗皮杠牌操作
  242. {
  243. //设置变量
  244. cbCardBuffer[0] = cbCenterCard;
  245. cbCardBuffer[1] = cbCenterCard;
  246. cbCardBuffer[2] = cbCenterCard;
  247. return 3;
  248. }
  249. case WIK_MING_PIGANG: //明皮杠牌操作
  250. {
  251. //设置变量
  252. cbCardBuffer[0] = cbCenterCard;
  253. cbCardBuffer[1] = cbCenterCard;
  254. cbCardBuffer[2] = cbCenterCard;
  255. return 3;
  256. }
  257. case WIK_BU_GANG:
  258. {
  259. cbCardBuffer[0] = cbCenterCard;
  260. cbCardBuffer[1] = cbCenterCard;
  261. cbCardBuffer[2] = cbCenterCard;
  262. cbCardBuffer[3] = cbCenterCard;
  263. return 4;
  264. }
  265. default:
  266. {
  267. ASSERT(FALSE);
  268. }
  269. }
  270. return 0;
  271. }
  272. //动作等级,只有碰,杠
  273. BYTE CGameLogicOther::GetUserActionRank(INT cbUserAction)
  274. {
  275. //胡牌等级
  276. if (cbUserAction&WIK_CHI_HU) { return 4; }
  277. if (cbUserAction&WIK_DUO_PAO){ return 3; }
  278. //杠牌等级
  279. if (cbUserAction&WIK_MING_GANG) { return 2; }
  280. //碰牌等级
  281. if (cbUserAction&WIK_PENG) { return 1; }
  282. //上牌等级
  283. //if (cbUserAction&(WIK_RIGHT|WIK_CENTER|WIK_LEFT)) { return 1; }
  284. return 0;
  285. }
  286. //胡牌等级
  287. WORD CGameLogicOther::GetChiHuActionRank(const CChiHuRight & ChiHuRight)
  288. {
  289. WORD wFanShu = 0;
  290. if (!(ChiHuRight&CHR_QING_DUI).IsEmpty())
  291. wFanShu = 4;
  292. else if( !(ChiHuRight&CHR_QING_YI_SE).IsEmpty() )
  293. wFanShu = 2;
  294. else if (!(ChiHuRight&CHK_PENGPENG).IsEmpty())
  295. wFanShu = 2;
  296. else if (!(ChiHuRight&CHK_CHI_HU).IsEmpty())
  297. wFanShu = 1;
  298. ASSERT( wFanShu > 0 );
  299. return wFanShu;
  300. }
  301. //吃牌判断 一脚耐油不需要
  302. /*
  303. BYTE CGameLogic::EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  304. {
  305. //参数效验
  306. ASSERT(IsValidCard(cbCurrentCard));
  307. //过滤判断
  308. if ( cbCurrentCard>=0x31 || IsMagicCard(cbCurrentCard) )
  309. return WIK_NULL;
  310. //变量定义
  311. BYTE cbExcursion[3]={0,1,2};
  312. BYTE cbItemKind[3]={WIK_LEFT,WIK_CENTER,WIK_RIGHT};
  313. //吃牌判断
  314. BYTE cbEatKind=0,cbFirstIndex=0;
  315. BYTE cbCurrentIndex=SwitchToCardIndex(cbCurrentCard);
  316. for (BYTE i=0;i<CountArray(cbItemKind);i++)
  317. {
  318. BYTE cbValueIndex=cbCurrentIndex%9;
  319. if ((cbValueIndex>=cbExcursion[i])&&((cbValueIndex-cbExcursion[i])<=6))
  320. {
  321. //吃牌判断
  322. cbFirstIndex=cbCurrentIndex-cbExcursion[i];
  323. //吃牌不能包含有王霸
  324. if( m_cbMagicIndex != MAX_INDEX &&
  325. m_cbMagicIndex >= cbFirstIndex && m_cbMagicIndex <= cbFirstIndex+2 ) continue;
  326. if ((cbCurrentIndex!=cbFirstIndex)&&(cbCardIndex[cbFirstIndex]==0))
  327. continue;
  328. if ((cbCurrentIndex!=(cbFirstIndex+1))&&(cbCardIndex[cbFirstIndex+1]==0))
  329. continue;
  330. if ((cbCurrentIndex!=(cbFirstIndex+2))&&(cbCardIndex[cbFirstIndex+2]==0))
  331. continue;
  332. //设置类型
  333. cbEatKind|=cbItemKind[i];
  334. }
  335. }
  336. return cbEatKind;
  337. }*/
  338. //碰牌判断
  339. int CGameLogicOther::EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  340. {
  341. //参数效验
  342. ASSERT(IsValidCard(cbCurrentCard));
  343. //过滤判断
  344. if (IsMagicCard(cbCurrentCard))
  345. return WIK_NULL;
  346. //碰牌判断
  347. return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)] >= 2) ? WIK_PENG : WIK_NULL;
  348. }
  349. //杠牌判断
  350. int CGameLogicOther::EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  351. {
  352. //参数效验
  353. ASSERT(IsValidCard(cbCurrentCard));
  354. //过滤判断
  355. if ( IsMagicCard(cbCurrentCard) )
  356. return WIK_NULL;
  357. BYTE index = SwitchToCardIndex(cbCurrentCard);
  358. BYTE zhi = cbCardIndex[index];
  359. //杠牌判断
  360. return (zhi==3)?WIK_MING_GANG:WIK_NULL;
  361. }
  362. //杠牌分析
  363. int CGameLogicOther::AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult, BYTE bProvideCard, bool bCanAnGang /* = true */)
  364. {
  365. //设置变量
  366. int cbActionMask = WIK_NULL;
  367. ZeroMemory(&GangCardResult, sizeof(GangCardResult));
  368. //手上杠牌
  369. for (BYTE i = 0; i < MAX_INDEX; i++)
  370. {
  371. if (i == m_cbMagicIndex) continue;
  372. if (cbCardIndex[i] == 4)
  373. {
  374. BYTE cbCardData = SwitchToCardData(i);
  375. cbActionMask |= WIK_GANG;
  376. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = cbCardData;
  377. }
  378. }
  379. //组合杠牌
  380. for (BYTE i = 0; i < cbWeaveCount; i++)
  381. {
  382. if (WeaveItem[i].cbWeaveKind == WIK_PENG)
  383. {
  384. if (cbCardIndex[SwitchToCardIndex(WeaveItem[i].cbCenterCard)] == 1)
  385. {
  386. cbActionMask |= WIK_BU_GANG;
  387. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = WeaveItem[i].cbCenterCard;
  388. }
  389. }
  390. }
  391. return cbActionMask;
  392. }
  393. ////吃胡分析,把吃胡分析改成自摸分析。因为我们已经没有吃牌动作了,所以不存在吃胡模式
  394. //int CGameLogic::AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, CChiHuRight &ChiHuRight, BYTE m_cbLaiZi)
  395. //{
  396. // //变量定义
  397. // int cbChiHuKind=WIK_NULL;
  398. // CAnalyseItemArray AnalyseItemArray;
  399. //
  400. // //设置变量
  401. // AnalyseItemArray.RemoveAll();
  402. // ChiHuRight.SetEmpty();
  403. //
  404. // //构造扑克
  405. // BYTE cbCardIndexTemp[MAX_INDEX];
  406. // CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  407. //
  408. // //cbCurrentCard一定不为0 !!!!!!!!!
  409. // ASSERT( cbCurrentCard != 0 );
  410. // if( cbCurrentCard == 0 ) return WIK_NULL;
  411. //
  412. // if( !ChiHuRight.IsEmpty() )
  413. // cbChiHuKind = WIK_ZI_MO;
  414. //
  415. // //插入扑克
  416. // if (cbCurrentCard == 0)
  417. // {
  418. // ASSERT(false);
  419. // return false;
  420. // }
  421. //
  422. // cbCardIndexTemp[SwitchToCardIndex(cbCurrentCard)]++;
  423. //
  424. // BYTE LaiZiIndex = SwitchToCardIndex(m_cbLaiZi);//癞子在牌里面的索引
  425. // if (cbCardIndexTemp[LaiZiIndex]>1)//手上癞子超过2个或者2个,就不能胡牌,必须打掉一个
  426. // {
  427. // return WIK_NULL;
  428. // }
  429. // BYTE isHuPaiCount = 0;
  430. // if (cbCardIndexTemp[LaiZiIndex] == 1 && cbCurrentCard != m_cbLaiZi)
  431. // {
  432. // cbCardIndexTemp[LaiZiIndex]--;
  433. // //分析扑克,cbCardIndexTemp是用户手上的牌,WeaveItem,
  434. // for (BYTE i = 0; i < MAX_INDEX; i++)
  435. // {
  436. // cbCardIndexTemp[i]++;
  437. // AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray);
  438. // //胡牌分析
  439. // if (AnalyseItemArray.GetCount()>0)
  440. // {
  441. // cbChiHuKind = WIK_ZI_MO;
  442. // isHuPaiCount++;
  443. // }
  444. // cbCardIndexTemp[i]--;
  445. // }
  446. // cbCardIndexTemp[LaiZiIndex]++;
  447. // if (isHuPaiCount == 27) //当有癞子时,且癞子是个万能和牌时,需要打掉,或者改牌
  448. // {
  449. // isHuPaiCount = 0;
  450. // return WIK_NULL;
  451. // }
  452. // return cbChiHuKind;
  453. // }
  454. // else
  455. // {
  456. // if (cbCurrentCard == m_cbLaiZi)
  457. // {
  458. // if (cbCardIndexTemp[LaiZiIndex] != 1)
  459. // {
  460. // ASSERT(false);
  461. // return false;
  462. // }
  463. // cbCardIndexTemp[LaiZiIndex]--;
  464. // //分析扑克,cbCardIndexTemp是用户手上的牌,WeaveItem,
  465. // for (BYTE i = 0; i < MAX_INDEX; i++)
  466. // {
  467. // cbCardIndexTemp[i]++;
  468. // AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray);
  469. // //胡牌分析
  470. // if (AnalyseItemArray.GetCount()>0)
  471. // {
  472. // cbChiHuKind = WIK_ZI_MO;
  473. // }
  474. // cbCardIndexTemp[i]--;
  475. // }
  476. // cbCardIndexTemp[LaiZiIndex]++;
  477. // return cbChiHuKind;
  478. // }
  479. // else
  480. // {
  481. // AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray);
  482. // //胡牌分析
  483. // if (AnalyseItemArray.GetCount() > 0)
  484. // {
  485. // cbChiHuKind = WIK_ZI_MO;
  486. // ChiHuRight |= CHR_YING_ZIMO;
  487. // }
  488. // return cbChiHuKind;
  489. // }
  490. // }
  491. //}
  492. int CGameLogicOther::AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CChiHuRight &ChiHuRight, BYTE bSubMit)
  493. {
  494. if (bSubMit == XueLiu)
  495. {
  496. //变量定义
  497. int cbChiHuKind = WIK_NULL;
  498. CAnalyseItemArray AnalyseItemArray;
  499. //设置变量
  500. AnalyseItemArray.RemoveAll();
  501. ChiHuRight.SetEmpty();
  502. //构造扑克
  503. BYTE cbCardIndexTemp[MAX_INDEX];
  504. CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  505. if (!ChiHuRight.IsEmpty())
  506. cbChiHuKind = WIK_ZI_MO;
  507. if (IsHuaZhu(cbCardIndexTemp, WeaveItem, cbWeaveCount))
  508. {
  509. AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray);
  510. //胡牌分析
  511. if (AnalyseItemArray.GetCount() > 0)
  512. {
  513. cbChiHuKind |= WIK_ZI_MO;
  514. }
  515. return cbChiHuKind;
  516. }
  517. return WIK_NULL;
  518. }
  519. return WIK_NULL;
  520. }
  521. bool CGameLogicOther::AnalyseTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE *m_cbTingPaiData, BYTE subMit)
  522. {
  523. //复制数据
  524. BYTE cbCardIndexTemp[MAX_INDEX];
  525. CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  526. BYTE cbCardCount = GetCardCount(cbCardIndexTemp);
  527. if (cbCardCount > 1 && (cbCardCount - 1) % 3 != 0)
  528. {
  529. ASSERT(false);
  530. return false;
  531. }
  532. CChiHuRight chr;
  533. for (BYTE i = 0; i < MAX_INDEX; i++)
  534. {
  535. if (cbCardIndexTemp[i] == 4)continue;
  536. cbCardIndexTemp[i]++;
  537. if (WIK_ZI_MO & AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, chr, subMit))
  538. m_cbTingPaiData[i] = 1;
  539. else
  540. {
  541. m_cbTingPaiData[i] = 0;
  542. }
  543. cbCardIndexTemp[i]--;
  544. }
  545. int tempcount = 0;
  546. for (int i = 0; i < MAX_INDEX; i++)
  547. {
  548. if (m_cbTingPaiData[i] == 1)tempcount++;
  549. }
  550. if (tempcount == 0)return false;
  551. return true;
  552. }
  553. //是否听牌,true表示已经听牌
  554. bool CGameLogicOther::IsTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE subMit)
  555. {
  556. //复制数据
  557. BYTE cbCardIndexTemp[MAX_INDEX];
  558. CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  559. CChiHuRight chr;
  560. for (BYTE i = 0; i < MAX_INDEX; i++)
  561. {
  562. if (cbCardIndexTemp[i] == 4)continue;
  563. cbCardIndexTemp[i]++;
  564. if (WIK_ZI_MO & AnalyseChiHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, chr, subMit))
  565. return true;
  566. cbCardIndexTemp[i]--;
  567. }
  568. return false;
  569. }
  570. //扑克转换
  571. BYTE CGameLogicOther::SwitchToCardData(BYTE cbCardIndex)
  572. {
  573. //ASSERT(cbCardIndex<34);
  574. return ((cbCardIndex/9)<<4)|(cbCardIndex%9+1);
  575. }
  576. //扑克转换
  577. BYTE CGameLogicOther::SwitchToCardIndex(BYTE cbCardData)
  578. {
  579. ASSERT(IsValidCard(cbCardData));
  580. return ((cbCardData&MASK_COLOR)>>4)*9+(cbCardData&MASK_VALUE)-1;
  581. }
  582. //扑克转换
  583. BYTE CGameLogicOther::SwitchToCardData(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT])
  584. {
  585. //转换扑克
  586. BYTE cbPosition=0;
  587. //钻牌
  588. if( m_cbMagicIndex != MAX_INDEX )
  589. {
  590. for( BYTE i = 0; i < cbCardIndex[m_cbMagicIndex]; i++ )
  591. cbCardData[cbPosition++] = SwitchToCardData(m_cbMagicIndex);
  592. }
  593. for (BYTE i=0;i<MAX_INDEX;i++)
  594. {
  595. if( i == m_cbMagicIndex ) continue;
  596. if (cbCardIndex[i]!=0)
  597. {
  598. for (BYTE j=0;j<cbCardIndex[i];j++)
  599. {
  600. ASSERT(cbPosition<MAX_COUNT);
  601. cbCardData[cbPosition++]=SwitchToCardData(i);
  602. }
  603. }
  604. }
  605. return cbPosition;
  606. }
  607. //扑克转换
  608. BYTE CGameLogicOther::SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX])
  609. {
  610. //设置变量
  611. ZeroMemory(cbCardIndex,sizeof(BYTE)*MAX_INDEX);
  612. //转换扑克
  613. for (BYTE i=0;i<cbCardCount;i++)
  614. {
  615. ASSERT(IsValidCard(cbCardData[i]));
  616. cbCardIndex[SwitchToCardIndex(cbCardData[i])]++;
  617. }
  618. return cbCardCount;
  619. }
  620. //默认换三张
  621. bool CGameLogicOther::ExchangeCardIndex(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[EXCHANGE])
  622. {
  623. BYTE TempCardIndex[MAX_INDEX] = {0};
  624. CopyMemory(TempCardIndex, cbCardIndex, sizeof(TempCardIndex));
  625. BYTE cbTempCardData[MAX_COUNT] = { 0 };
  626. SwitchToCardData(TempCardIndex, cbTempCardData);
  627. BYTE WanCount = 0;//万
  628. BYTE WanTempCardData[MAX_COUNT];
  629. BYTE TiaoCount = 0;//条
  630. BYTE TiaoTempCardData[MAX_COUNT];
  631. BYTE TongCount = 0;//筒
  632. BYTE TongTempCardData[MAX_COUNT];
  633. ZeroMemory(WanTempCardData, sizeof(WanTempCardData));
  634. ZeroMemory(TiaoTempCardData, sizeof(TiaoTempCardData));
  635. ZeroMemory(TongTempCardData, sizeof(TongTempCardData));
  636. for (int i = 0; i < MAX_INDEX; i++)//获取手牌花色个数
  637. {
  638. if (TempCardIndex[i] == 0)continue;
  639. if (i < 9)
  640. while (TempCardIndex[i]--)
  641. WanTempCardData[WanCount++] = SwitchToCardData(i);
  642. else if (i < 18)
  643. while (TempCardIndex[i]--)
  644. TiaoTempCardData[TiaoCount++] = SwitchToCardData(i);
  645. else
  646. while (TempCardIndex[i]--)
  647. TongTempCardData[TongCount++] = SwitchToCardData(i);
  648. }
  649. if (TongCount>TiaoCount&&TongCount > WanCount)//根据花色多少决定默认换三张的牌,筒最多
  650. {
  651. if (TiaoCount > WanCount&&WanCount >= 3)
  652. {
  653. CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
  654. return true;
  655. }
  656. else if (TiaoCount >= 3)
  657. {
  658. CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
  659. return true;
  660. }
  661. else if (WanCount >= 3)
  662. {
  663. CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
  664. return true;
  665. }
  666. else
  667. {
  668. CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
  669. return true;
  670. }
  671. ASSERT(false);
  672. return false;
  673. }
  674. else if (TiaoCount > TongCount&&TiaoCount > WanCount)//条最多
  675. {
  676. if (TongCount > WanCount&&WanCount >= 3)
  677. {
  678. CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
  679. return true;
  680. }
  681. else if(TongCount >= 3)
  682. {
  683. CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
  684. return true;
  685. }
  686. else if (WanCount >= 3)
  687. {
  688. CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
  689. return true;
  690. }
  691. else
  692. {
  693. CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
  694. return true;
  695. }
  696. ASSERT(false);
  697. return false;
  698. }
  699. else if (WanCount > TongCount&&WanCount > TiaoCount) //万最多
  700. {
  701. if (TongCount > TiaoCount&&TiaoCount >= 3)
  702. {
  703. CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
  704. return true;
  705. }
  706. else if (TongCount >= 3)
  707. {
  708. CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
  709. return true;
  710. }
  711. else if (TiaoCount >= 3)
  712. {
  713. CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
  714. return true;
  715. }
  716. else
  717. {
  718. CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
  719. return true;
  720. }
  721. ASSERT(false);
  722. return false;
  723. }
  724. else
  725. {
  726. if (TiaoCount == TongCount&&WanCount >= 3)
  727. {
  728. CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
  729. return true;
  730. }
  731. else if(TiaoCount == WanCount&&TongCount >= 3)
  732. {
  733. CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
  734. return true;
  735. }
  736. else if (WanCount == TongCount && TiaoCount>=3)
  737. {
  738. CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
  739. return true;
  740. }
  741. else if (TiaoCount == TongCount&&WanCount < 3)
  742. {
  743. CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
  744. return true;
  745. }
  746. else if (TiaoCount == WanCount&&TongCount < 3)
  747. {
  748. CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
  749. return true;
  750. }
  751. else
  752. {
  753. CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
  754. return true;
  755. }
  756. }
  757. /*if (WanCount <= TiaoCount&&WanCount <= TongCount&&WanCount >= 3)
  758. {
  759. CopyMemory(cbCardData, WanTempCardData, EXCHANGE);
  760. return true;
  761. }
  762. else if (TiaoCount <= WanCount&& TiaoCount <= TongCount&& TiaoCount >= 3)
  763. {
  764. CopyMemory(cbCardData, TiaoTempCardData, EXCHANGE);
  765. return true;
  766. }
  767. else
  768. {
  769. CopyMemory(cbCardData, TongTempCardData, EXCHANGE);
  770. return true;
  771. }*/
  772. ASSERT(false);
  773. return false;
  774. }
  775. //分析扑克
  776. bool CGameLogicOther::AnalyseCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CAnalyseItemArray & AnalyseItemArray)
  777. {
  778. //计算数目
  779. BYTE cbCardCount = GetCardCount(cbCardIndex);
  780. //效验数目
  781. //ASSERT((cbCardCount>=2)&&(cbCardCount<=MAX_COUNT)&&((cbCardCount-2)%3==0));
  782. if ((cbCardCount<2) || (cbCardCount>MAX_COUNT) || ((cbCardCount - 2) % 3 != 0))
  783. return false;
  784. //变量定义
  785. BYTE cbKindItemCount = 0;
  786. tagKindItem KindItem[27 * 2 + 7 + 14];
  787. ZeroMemory(KindItem, sizeof(KindItem));
  788. //需求判断
  789. BYTE cbLessKindItem = (cbCardCount - 2) / 3;
  790. ASSERT((cbLessKindItem + cbWeaveCount) == 4);
  791. //单吊判断
  792. if (cbLessKindItem == 0)
  793. {
  794. //效验参数
  795. ASSERT((cbCardCount == 2) && (cbWeaveCount == 4));
  796. //牌眼判断
  797. for (BYTE i = 0; i < MAX_INDEX; i++)
  798. {
  799. if (cbCardIndex[i] == 2 ||
  800. (m_cbMagicIndex != MAX_INDEX && i != m_cbMagicIndex && cbCardIndex[m_cbMagicIndex] + cbCardIndex[i] == 2))
  801. {
  802. //变量定义
  803. tagAnalyseItem AnalyseItem;
  804. ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
  805. //设置结果
  806. for (BYTE j = 0; j < cbWeaveCount; j++)
  807. {
  808. AnalyseItem.cbWeaveKind[j] = WeaveItem[j].cbWeaveKind;
  809. AnalyseItem.cbCenterCard[j] = WeaveItem[j].cbCenterCard;
  810. GetWeaveCard(WeaveItem[j].cbWeaveKind, WeaveItem[j].cbCenterCard, AnalyseItem.cbCardData[j]);
  811. }
  812. AnalyseItem.cbCardEye = SwitchToCardData(i);
  813. if (cbCardIndex[i] < 2 || i == m_cbMagicIndex)
  814. AnalyseItem.bMagicEye = true;
  815. else AnalyseItem.bMagicEye = false;
  816. //插入结果
  817. AnalyseItemArray.Add(AnalyseItem);
  818. return true;
  819. }
  820. }
  821. return false;
  822. }
  823. //拆分分析,用户手上的临时牌变量
  824. BYTE cbMagicCardIndex[MAX_INDEX];
  825. CopyMemory(cbMagicCardIndex, cbCardIndex, sizeof(cbMagicCardIndex));
  826. BYTE cbMagicCardCount = 0;//用来干什么的不知道
  827. if (m_cbMagicIndex != MAX_INDEX)
  828. {
  829. cbMagicCardCount = cbCardIndex[m_cbMagicIndex];
  830. if (cbMagicCardIndex[m_cbMagicIndex]) cbMagicCardIndex[m_cbMagicIndex] = 1; //减小多余组合
  831. }
  832. if (cbCardCount >= 3)
  833. {
  834. for (BYTE i = 0; i < MAX_INDEX; i++)
  835. {
  836. //同牌判断
  837. if (cbMagicCardIndex[i] + cbMagicCardCount >= 3)
  838. {
  839. ASSERT(cbKindItemCount < CountArray(KindItem));
  840. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  841. KindItem[cbKindItemCount].cbCardIndex[1] = i;
  842. KindItem[cbKindItemCount].cbCardIndex[2] = i;
  843. KindItem[cbKindItemCount].cbWeaveKind = WIK_PENG;
  844. KindItem[cbKindItemCount].cbCenterCard = SwitchToCardData(i);
  845. KindItem[cbKindItemCount].cbValidIndex[0] = cbMagicCardIndex[i] > 0 ? i : m_cbMagicIndex;
  846. KindItem[cbKindItemCount].cbValidIndex[1] = cbMagicCardIndex[i] > 1 ? i : m_cbMagicIndex;
  847. KindItem[cbKindItemCount].cbValidIndex[2] = cbMagicCardIndex[i] > 2 ? i : m_cbMagicIndex;
  848. cbKindItemCount++;
  849. if (cbMagicCardIndex[i] + cbMagicCardCount >= 6)
  850. {
  851. ASSERT(cbKindItemCount < CountArray(KindItem));
  852. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  853. KindItem[cbKindItemCount].cbCardIndex[1] = i;
  854. KindItem[cbKindItemCount].cbCardIndex[2] = i;
  855. KindItem[cbKindItemCount].cbWeaveKind = WIK_PENG;
  856. KindItem[cbKindItemCount].cbCenterCard = SwitchToCardData(i);
  857. KindItem[cbKindItemCount].cbValidIndex[0] = cbMagicCardIndex[i] > 3 ? i : m_cbMagicIndex;
  858. KindItem[cbKindItemCount].cbValidIndex[1] = m_cbMagicIndex;
  859. KindItem[cbKindItemCount].cbValidIndex[2] = m_cbMagicIndex;
  860. cbKindItemCount++;
  861. }
  862. }
  863. //连牌判断
  864. if ((i < (MAX_INDEX - 2)) && ((i % 9) < 7))
  865. {
  866. //只要财神牌数加上3个顺序索引的牌数大于等于3,则进行组合
  867. if (cbMagicCardCount + cbMagicCardIndex[i] + cbMagicCardIndex[i + 1] + cbMagicCardIndex[i + 2] >= 3)
  868. {
  869. BYTE cbIndex[3] = { i == m_cbMagicIndex ? 0 : cbMagicCardIndex[i], (i + 1) == m_cbMagicIndex ? 0 : cbMagicCardIndex[i + 1],
  870. (i + 2) == m_cbMagicIndex ? 0 : cbMagicCardIndex[i + 2] };
  871. int nMagicCountTemp = cbMagicCardCount;
  872. BYTE cbValidIndex[3];
  873. while (nMagicCountTemp + cbIndex[0] + cbIndex[1] + cbIndex[2] >= 3)
  874. {
  875. for (BYTE j = 0; j < CountArray(cbIndex); j++)
  876. {
  877. if (cbIndex[j] > 0)
  878. {
  879. cbIndex[j]--;
  880. cbValidIndex[j] = i + j;
  881. }
  882. else
  883. {
  884. nMagicCountTemp--;
  885. cbValidIndex[j] = m_cbMagicIndex;
  886. }
  887. }
  888. if (nMagicCountTemp >= 0)
  889. {
  890. ASSERT(cbKindItemCount < CountArray(KindItem));
  891. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  892. KindItem[cbKindItemCount].cbCardIndex[1] = i + 1;
  893. KindItem[cbKindItemCount].cbCardIndex[2] = i + 2;
  894. KindItem[cbKindItemCount].cbWeaveKind = WIK_LEFT;
  895. KindItem[cbKindItemCount].cbCenterCard = SwitchToCardData(i);
  896. CopyMemory(KindItem[cbKindItemCount].cbValidIndex, cbValidIndex, sizeof(cbValidIndex));
  897. cbKindItemCount++;
  898. }
  899. else break;
  900. }
  901. }
  902. }
  903. }
  904. }
  905. //组合分析
  906. if (cbKindItemCount >= cbLessKindItem)
  907. {
  908. //变量定义
  909. BYTE cbCardIndexTemp[MAX_INDEX];
  910. ZeroMemory(cbCardIndexTemp, sizeof(cbCardIndexTemp));
  911. //变量定义
  912. BYTE cbIndex[4] = { 0, 1, 2, 3 };
  913. tagKindItem * pKindItem[4];
  914. ZeroMemory(&pKindItem, sizeof(pKindItem));
  915. //开始组合
  916. do
  917. {
  918. //设置变量
  919. CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  920. for (BYTE i = 0; i < cbLessKindItem; i++)
  921. pKindItem[i] = &KindItem[cbIndex[i]];
  922. //数量判断
  923. bool bEnoughCard = true;
  924. for (BYTE i = 0; i < cbLessKindItem * 3; i++)
  925. {
  926. //存在判断
  927. BYTE cbCardIndex = pKindItem[i / 3]->cbValidIndex[i % 3];
  928. if (cbCardIndexTemp[cbCardIndex] == 0)
  929. {
  930. bEnoughCard = false;
  931. break;
  932. }
  933. else
  934. cbCardIndexTemp[cbCardIndex]--;
  935. }
  936. //胡牌判断
  937. if (bEnoughCard == true)
  938. {
  939. //牌眼判断
  940. BYTE cbCardEye = 0;
  941. bool bMagicEye = false;
  942. for (BYTE i = 0; i < MAX_INDEX; i++)
  943. {
  944. if (cbCardIndexTemp[i] == 2)
  945. {
  946. cbCardEye = SwitchToCardData(i);
  947. if (i == m_cbMagicIndex) bMagicEye = true;
  948. break;
  949. }
  950. else if (i != m_cbMagicIndex &&
  951. m_cbMagicIndex != MAX_INDEX && cbCardIndexTemp[i] + cbCardIndexTemp[m_cbMagicIndex] == 2)
  952. {
  953. cbCardEye = SwitchToCardData(i);
  954. bMagicEye = true;
  955. }
  956. }
  957. //组合类型
  958. if (cbCardEye != 0)
  959. {
  960. //变量定义
  961. tagAnalyseItem AnalyseItem;
  962. ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
  963. //设置组合
  964. for (BYTE i = 0; i < cbWeaveCount; i++)
  965. {
  966. AnalyseItem.cbWeaveKind[i] = WeaveItem[i].cbWeaveKind;
  967. AnalyseItem.cbCenterCard[i] = WeaveItem[i].cbCenterCard;
  968. GetWeaveCard(WeaveItem[i].cbWeaveKind, WeaveItem[i].cbCenterCard,
  969. AnalyseItem.cbCardData[i]);
  970. }
  971. //设置牌型
  972. for (BYTE i = 0; i < cbLessKindItem; i++)
  973. {
  974. AnalyseItem.cbWeaveKind[i + cbWeaveCount] = pKindItem[i]->cbWeaveKind;
  975. AnalyseItem.cbCenterCard[i + cbWeaveCount] = pKindItem[i]->cbCenterCard;
  976. AnalyseItem.cbCardData[cbWeaveCount + i][0] = SwitchToCardData(pKindItem[i]->cbValidIndex[0]);
  977. AnalyseItem.cbCardData[cbWeaveCount + i][1] = SwitchToCardData(pKindItem[i]->cbValidIndex[1]);
  978. AnalyseItem.cbCardData[cbWeaveCount + i][2] = SwitchToCardData(pKindItem[i]->cbValidIndex[2]);
  979. }
  980. //设置牌眼
  981. AnalyseItem.cbCardEye = cbCardEye;
  982. AnalyseItem.bMagicEye = bMagicEye;
  983. //插入结果
  984. AnalyseItemArray.Add(AnalyseItem);
  985. }
  986. }
  987. //设置索引
  988. if (cbIndex[cbLessKindItem - 1] == (cbKindItemCount - 1))
  989. {
  990. BYTE i = cbLessKindItem - 1;
  991. for (; i > 0; i--)
  992. {
  993. if ((cbIndex[i - 1] + 1) != cbIndex[i])
  994. {
  995. BYTE cbNewIndex = cbIndex[i - 1];
  996. for (BYTE j = (i - 1); j < cbLessKindItem; j++)
  997. cbIndex[j] = cbNewIndex + j - i + 2;
  998. break;
  999. }
  1000. }
  1001. if (i == 0)
  1002. break;
  1003. }
  1004. else
  1005. cbIndex[cbLessKindItem - 1]++;
  1006. } while (true);
  1007. }
  1008. return (AnalyseItemArray.GetCount() > 0);
  1009. }
  1010. //钻牌
  1011. bool CGameLogicOther::IsMagicCard(BYTE cbCardData)
  1012. {
  1013. if( m_cbMagicIndex != MAX_INDEX )
  1014. return SwitchToCardIndex(cbCardData) == m_cbMagicIndex;
  1015. return false;
  1016. }
  1017. //排序,根据牌值排序
  1018. bool CGameLogicOther::SortCardList(BYTE cbCardData[MAX_COUNT], BYTE cbCardCount)
  1019. {
  1020. //数目过虑
  1021. if (cbCardCount==0||cbCardCount>MAX_COUNT) return false;
  1022. //排序操作
  1023. bool bSorted=true;
  1024. BYTE cbSwitchData=0,cbLast=cbCardCount-1;
  1025. do
  1026. {
  1027. bSorted=true;
  1028. for (BYTE i=0;i<cbLast;i++)
  1029. {
  1030. if (cbCardData[i]>cbCardData[i+1])
  1031. {
  1032. //设置标志
  1033. bSorted=false;
  1034. //扑克数据
  1035. cbSwitchData=cbCardData[i];
  1036. cbCardData[i]=cbCardData[i+1];
  1037. cbCardData[i+1]=cbSwitchData;
  1038. }
  1039. }
  1040. cbLast--;
  1041. } while(bSorted==false);
  1042. return true;
  1043. }
  1044. //编码
  1045. WORD CGameLogicOther::GetValue(BYTE uNum, BYTE uFangShu, BYTE PaiZhi)
  1046. {
  1047. WORD mcd = PaiZhi | (uFangShu << 6) | (uNum << 11);
  1048. return mcd;
  1049. }
  1050. //解码
  1051. BYTE CGameLogicOther::DeCodeCard(const WORD cbCardData)
  1052. {
  1053. //BYTE num = (cbCardData & 0x3800) >> 11;
  1054. //BYTE fanshu = (cbCardData & 0x07C0) >> 6;
  1055. BYTE TempCardData = cbCardData & 0x003F;
  1056. return TempCardData;
  1057. }
  1058. //解码番薯
  1059. BYTE CGameLogicOther::DeCodeFanshu(const WORD cbCardData)
  1060. {
  1061. //BYTE num = (cbCardData & 0x3800) >> 11;
  1062. BYTE fanshu = (cbCardData & 0x07C0) >> 6;
  1063. //BYTE TempCardData = cbCardData & 0x003F;
  1064. return fanshu;
  1065. }
  1066. bool CGameLogicOther::PeiPai(BYTE ParZhi[MAX_REPERTORY])
  1067. {
  1068. std::ifstream in;
  1069. std::string filename = "zuopai.dat";
  1070. in.open(filename);
  1071. if (!in.is_open())
  1072. {
  1073. return false;
  1074. //ASSERT(false);
  1075. }
  1076. static BYTE TempCardData[MAX_REPERTORY];
  1077. ZeroMemory(TempCardData, sizeof(TempCardData));
  1078. BYTE tempCount = 0;
  1079. char ch[1];
  1080. while (!in.eof())
  1081. {
  1082. in.read(ch, 1);
  1083. TempCardData[tempCount++] = ch[0];
  1084. }
  1085. in.close();
  1086. for (BYTE i = 0; i < MAX_REPERTORY; i++)
  1087. {
  1088. ASSERT(i < MAX_REPERTORY);
  1089. ParZhi[i] = TempCardData[MAX_REPERTORY - i - 1];
  1090. }
  1091. return true;
  1092. }
  1093. BYTE CGameLogicOther::GetEndCard(BYTE cbCardIndex[MAX_INDEX])
  1094. {
  1095. for (int i = MAX_INDEX - 1; i >= 0; i--)
  1096. {
  1097. if (cbCardIndex[i] > 0 )
  1098. {
  1099. return SwitchToCardData(i);
  1100. }
  1101. }
  1102. ASSERT(false);
  1103. return 1;
  1104. }
  1105. /*
  1106. // 胡法分析函数
  1107. */
  1108. //中张(不带1和9)
  1109. //bool CGameLogic::IsZhongZhang(const BYTE cbCardIndex[], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  1110. //{
  1111. // for (BYTE i = 0; i < MAX_INDEX; i++)
  1112. // {
  1113. // if (cbCardIndex[i] > 0)
  1114. // {
  1115. // BYTE cbCardValue = SwitchToCardData(i) & MASK_VALUE;
  1116. // if (cbCardValue == 1 || cbCardValue == 9) return false;
  1117. // }
  1118. // }
  1119. //
  1120. // for (BYTE i = 0; i < cbWeaveCount; i++)
  1121. // {
  1122. // BYTE cbCardValue = WeaveItem[i].cbCenterCard & MASK_VALUE;
  1123. //
  1124. // if (WeaveItem[i].cbWeaveKind & WIK_LEFT)
  1125. // {
  1126. // if (cbCardValue == 1 || cbCardValue == 7) return false;
  1127. // }
  1128. // else if (WeaveItem[i].cbWeaveKind & WIK_CENTER)
  1129. // {
  1130. // if (cbCardValue == 2 || cbCardValue == 8) return false;
  1131. // }
  1132. // else if (WeaveItem[i].cbWeaveKind & WIK_RIGHT)
  1133. // {
  1134. // if (cbCardValue == 3 || cbCardValue == 9) return false;
  1135. // }
  1136. // else
  1137. // {
  1138. // if (cbCardValue == 1 || cbCardValue == 9) return false;
  1139. // }
  1140. // }
  1141. //
  1142. // return true;
  1143. //}
  1144. //大对子
  1145. //bool CGameLogic::IsPengPeng( const tagAnalyseItem *pAnalyseItem )
  1146. //{
  1147. // for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
  1148. // {
  1149. // if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
  1150. // return false;
  1151. // }
  1152. // return true;
  1153. //}
  1154. //清一色牌
  1155. bool CGameLogicOther::IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount, const BYTE cbCurrentCard)
  1156. {
  1157. //胡牌判断
  1158. BYTE cbCardColor=0xFF;
  1159. for (BYTE i=0;i<MAX_INDEX;i++)
  1160. {
  1161. if (cbCardIndex[i]!=0)
  1162. {
  1163. //花色判断
  1164. if (cbCardColor!=0xFF)
  1165. return false;
  1166. //设置花色
  1167. cbCardColor=(SwitchToCardData(i)&MASK_COLOR);
  1168. //设置索引
  1169. i=(i/9+1)*9-1;
  1170. }
  1171. }
  1172. //组合判断
  1173. for (BYTE i = 0; i<cbItemCount; i++)
  1174. {
  1175. BYTE cbCenterCard = WeaveItem[i].cbCenterCard;
  1176. if ((cbCenterCard&MASK_COLOR) != cbCardColor) return false;
  1177. }
  1178. //如果手上只有王霸
  1179. //if( cbCardColor == 0xFF )
  1180. //{
  1181. // ASSERT( m_cbMagicIndex != MAX_INDEX && cbCardIndex[m_cbMagicIndex] > 0 );
  1182. // //检查组合
  1183. // ASSERT( cbItemCount > 0 );
  1184. // cbCardColor = WeaveItem[0].cbCenterCard&MASK_COLOR;
  1185. //}
  1186. //if((cbCurrentCard&MASK_COLOR)!=cbCardColor && !IsMagicCard(cbCurrentCard) ) return false;
  1187. return true;
  1188. }
  1189. //七小对牌
  1190. //bool CGameLogic::IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount,const BYTE cbCurrentCard)
  1191. //{
  1192. // //组合判断
  1193. // if (cbWeaveCount!=0) return false;
  1194. //
  1195. // //单牌数目
  1196. // BYTE cbReplaceCount = 0;
  1197. //
  1198. // //临时数据
  1199. // BYTE cbCardIndexTemp[MAX_INDEX];
  1200. // CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  1201. //
  1202. // //插入数据
  1203. // BYTE cbCurrentIndex = SwitchToCardIndex(cbCurrentCard);
  1204. // cbCardIndexTemp[cbCurrentIndex]++;
  1205. //
  1206. // //计算单牌
  1207. // for (BYTE i=0;i<MAX_INDEX;i++)
  1208. // {
  1209. // BYTE cbCardCount=cbCardIndexTemp[i];
  1210. //
  1211. // //王牌过滤
  1212. // if( i == m_cbMagicIndex ) continue;
  1213. //
  1214. // //单牌统计
  1215. // if( cbCardCount == 1 || cbCardCount == 3 ) cbReplaceCount++;
  1216. // }
  1217. //
  1218. // //王牌不够
  1219. // if( m_cbMagicIndex != MAX_INDEX && cbReplaceCount > cbCardIndexTemp[m_cbMagicIndex] ||
  1220. // m_cbMagicIndex == MAX_INDEX && cbReplaceCount > 0 )
  1221. // return false;
  1222. //
  1223. // return true;
  1224. //
  1225. //}
  1226. //带幺
  1227. //bool CGameLogic::IsDaiYao( const tagAnalyseItem *pAnalyseItem )
  1228. //{
  1229. // //检查牌眼
  1230. // BYTE cbCardValue = pAnalyseItem->cbCardEye&MASK_VALUE;
  1231. // if( cbCardValue != 1 && cbCardValue != 9 ) return false;
  1232. //
  1233. // for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
  1234. // {
  1235. // if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
  1236. // {
  1237. // BYTE j = 0;
  1238. // for( ; j < 3; j++ )
  1239. // {
  1240. // cbCardValue = pAnalyseItem->cbCardData[i][j]&MASK_VALUE;
  1241. // if( cbCardValue == 1 || cbCardValue == 9 ) break;
  1242. // }
  1243. // if( j == 3 ) return false;
  1244. // }
  1245. // else
  1246. // {
  1247. // cbCardValue = pAnalyseItem->cbCenterCard[i]&MASK_VALUE;
  1248. // if( cbCardValue != 1 && cbCardValue != 9 ) return false;
  1249. // }
  1250. // }
  1251. // return true;
  1252. //}
  1253. //将对
  1254. //bool CGameLogic::IsJiangDui( const tagAnalyseItem *pAnalyseItem )
  1255. //{
  1256. // //是否大对子
  1257. // if( !IsPengPeng(pAnalyseItem) ) return false;
  1258. //
  1259. // //检查牌眼
  1260. // BYTE cbCardValue = pAnalyseItem->cbCardEye&MASK_VALUE;
  1261. // if( cbCardValue != 2 && cbCardValue != 5 && cbCardValue != 8 ) return false;
  1262. //
  1263. // for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
  1264. // {
  1265. // if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
  1266. // {
  1267. // BYTE j = 0;
  1268. // for( ; j < 3; j++ )
  1269. // {
  1270. // cbCardValue = pAnalyseItem->cbCardData[i][j]&MASK_VALUE;
  1271. // if( cbCardValue == 2 || cbCardValue == 5 || cbCardValue == 8 ) break;
  1272. // }
  1273. // if( j == 3 ) return false;
  1274. // }
  1275. // else
  1276. // {
  1277. // cbCardValue = pAnalyseItem->cbCenterCard[i]&MASK_VALUE;
  1278. // if( cbCardValue != 2 && cbCardValue != 5 && cbCardValue != 8 ) return false;
  1279. // }
  1280. // }
  1281. // return true;
  1282. //}
  1283. //是否花猪,xueliu判断花猪牌型,false为花柱
  1284. bool CGameLogicOther::IsHuaZhu(const BYTE cbCardIndex[], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount)
  1285. {
  1286. BYTE cbColor[3] = { 0,0,0 };
  1287. for( BYTE i = 0; i < MAX_INDEX; i++ )
  1288. {
  1289. if( cbCardIndex[i] > 0 )
  1290. {
  1291. BYTE cbCardColor = SwitchToCardData(i)&MASK_COLOR;
  1292. cbColor[cbCardColor>>4]++;
  1293. i = (i/9+1)*9-1;
  1294. }
  1295. }
  1296. for( BYTE i = 0; i < cbWeaveCount; i++ )
  1297. {
  1298. BYTE cbCardColor = WeaveItem[i].cbCenterCard&MASK_COLOR;
  1299. cbColor[cbCardColor>>4]++;
  1300. }
  1301. //if (INVALID_BYTE != cbDingque && 0 != cbColor[cbDingque])
  1302. // return true;
  1303. //缺一门就不是花猪
  1304. for( BYTE i = 0; i < CountArray(cbColor); i++ )
  1305. if( cbColor[i] == 0 ) return true;
  1306. return false;
  1307. }
  1308. //是否碰碰胡
  1309. bool CGameLogicOther::IsPengPeng(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount)
  1310. {
  1311. BYTE cbCardCount = GetCardCount(cbCardIndex);
  1312. BYTE DanCount = 0;
  1313. BYTE DuiZiCount = 0;
  1314. for (BYTE i = 0; i<MAX_INDEX; i++)
  1315. {
  1316. if (cbCardIndex[i] == 3)
  1317. {
  1318. DuiZiCount++;
  1319. }
  1320. if (cbCardIndex[i] == 2)
  1321. {
  1322. DanCount++;
  1323. }
  1324. }
  1325. switch (cbCardCount)
  1326. {
  1327. case 2:
  1328. if (DanCount == 1)
  1329. return true;
  1330. case 5:
  1331. if (DuiZiCount == 1 && DanCount == 1)
  1332. return true;
  1333. case 8:
  1334. if (DuiZiCount == 2 && DanCount == 1)
  1335. return true;
  1336. case 11:
  1337. if (DuiZiCount == 3 && DanCount == 1)
  1338. return true;
  1339. case 14:
  1340. if (DuiZiCount == 4 && DanCount == 1)
  1341. return true;
  1342. default:
  1343. return false;
  1344. }
  1345. return false;
  1346. }
  1347. //////////////////////////////////////////////////////////////////////////