诸暨麻将添加redis
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

1254 lignes
30 KiB

  1. #include "StdAfx.h"
  2. #include "GameLogic.h"
  3. #include "math.h"
  4. //////////////////////////////////////////////////////////////////////////
  5. //静态变量
  6. bool CChiHuRight::m_bInit = false;
  7. DWORD CChiHuRight::m_dwRightMask[MAX_RIGHT_COUNT];
  8. //构造函数
  9. CChiHuRight::CChiHuRight()
  10. {
  11. ZeroMemory( m_dwRight,sizeof(m_dwRight) );
  12. if( !m_bInit )
  13. {
  14. m_bInit = true;
  15. for( BYTE i = 0; i < CountArray(m_dwRightMask); i++ )
  16. {
  17. if( 0 == i )
  18. m_dwRightMask[i] = 0;
  19. else
  20. m_dwRightMask[i] = (DWORD(pow(2.0,i-1)))<<28;
  21. }
  22. }
  23. }
  24. //赋值符重载
  25. CChiHuRight & CChiHuRight::operator = ( DWORD dwRight )
  26. {
  27. DWORD dwOtherRight = 0;
  28. //验证权位
  29. if( !IsValidRight( dwRight ) )
  30. {
  31. //验证取反权位
  32. ASSERT( IsValidRight( ~dwRight ) );
  33. if( !IsValidRight( ~dwRight ) ) return *this;
  34. dwRight = ~dwRight;
  35. dwOtherRight = MASK_CHI_HU_RIGHT;
  36. }
  37. for( BYTE i = 0; i < CountArray(m_dwRightMask); i++ )
  38. {
  39. if( (dwRight&m_dwRightMask[i]) || (i==0&&dwRight<0x10000000) )
  40. m_dwRight[i] = dwRight&MASK_CHI_HU_RIGHT;
  41. else m_dwRight[i] = dwOtherRight;
  42. }
  43. return *this;
  44. }
  45. //与等于
  46. CChiHuRight & CChiHuRight::operator &= ( DWORD dwRight )
  47. {
  48. bool bNavigate = false;
  49. //验证权位
  50. if( !IsValidRight( dwRight ) )
  51. {
  52. //验证取反权位
  53. ASSERT( IsValidRight( ~dwRight ) );
  54. if( !IsValidRight( ~dwRight ) ) return *this;
  55. //调整权位
  56. DWORD dwHeadRight = (~dwRight)&0xF0000000;
  57. DWORD dwTailRight = dwRight&MASK_CHI_HU_RIGHT;
  58. dwRight = dwHeadRight|dwTailRight;
  59. bNavigate = true;
  60. }
  61. for( BYTE i = 0; i < CountArray(m_dwRightMask); i++ )
  62. {
  63. if( (dwRight&m_dwRightMask[i]) || (i==0&&dwRight<0x10000000) )
  64. {
  65. m_dwRight[i] &= (dwRight&MASK_CHI_HU_RIGHT);
  66. }
  67. else if( !bNavigate )
  68. m_dwRight[i] = 0;
  69. }
  70. return *this;
  71. }
  72. //或等于
  73. CChiHuRight & CChiHuRight::operator |= ( DWORD dwRight )
  74. {
  75. //验证权位
  76. if( !IsValidRight( dwRight ) ) return *this;
  77. for( BYTE i = 0; i < CountArray(m_dwRightMask); i++ )
  78. {
  79. if( (dwRight&m_dwRightMask[i]) || (i==0&&dwRight<0x10000000) )
  80. m_dwRight[i] |= (dwRight&MASK_CHI_HU_RIGHT);
  81. }
  82. return *this;
  83. }
  84. //与
  85. CChiHuRight CChiHuRight::operator & ( DWORD dwRight )
  86. {
  87. CChiHuRight chr = *this;
  88. return (chr &= dwRight);
  89. }
  90. //与
  91. CChiHuRight CChiHuRight::operator & ( DWORD dwRight ) const
  92. {
  93. CChiHuRight chr = *this;
  94. return (chr &= dwRight);
  95. }
  96. //或
  97. CChiHuRight CChiHuRight::operator | ( DWORD dwRight )
  98. {
  99. CChiHuRight chr = *this;
  100. return chr |= dwRight;
  101. }
  102. //或
  103. CChiHuRight CChiHuRight::operator | ( DWORD dwRight ) const
  104. {
  105. CChiHuRight chr = *this;
  106. return chr |= dwRight;
  107. }
  108. //是否权位为空
  109. bool CChiHuRight::IsEmpty()
  110. {
  111. for( BYTE i = 0; i < CountArray(m_dwRight); i++ )
  112. if( m_dwRight[i] ) return false;
  113. return true;
  114. }
  115. //设置权位为空
  116. void CChiHuRight::SetEmpty()
  117. {
  118. ZeroMemory( m_dwRight,sizeof(m_dwRight) );
  119. return;
  120. }
  121. //获取权位数值
  122. BYTE CChiHuRight::GetRightData( DWORD dwRight[], BYTE cbMaxCount )
  123. {
  124. ASSERT( cbMaxCount >= CountArray(m_dwRight) );
  125. if( cbMaxCount < CountArray(m_dwRight) ) return 0;
  126. CopyMemory( dwRight,m_dwRight,sizeof(DWORD)*CountArray(m_dwRight) );
  127. return CountArray(m_dwRight);
  128. }
  129. //设置权位数值
  130. bool CChiHuRight::SetRightData( const DWORD dwRight[], BYTE cbRightCount )
  131. {
  132. ASSERT( cbRightCount <= CountArray(m_dwRight) );
  133. if( cbRightCount > CountArray(m_dwRight) ) return false;
  134. ZeroMemory( m_dwRight,sizeof(m_dwRight) );
  135. CopyMemory( m_dwRight,dwRight,sizeof(DWORD)*cbRightCount );
  136. return true;
  137. }
  138. //检查仅位是否正确
  139. bool CChiHuRight::IsValidRight( DWORD dwRight )
  140. {
  141. DWORD dwRightHead = dwRight & 0xF0000000;
  142. for( BYTE i = 0; i < CountArray(m_dwRightMask); i++ )
  143. if( m_dwRightMask[i] == dwRightHead ) return true;
  144. return false;
  145. }
  146. //////////////////////////////////////////////////////////////////////////
  147. //////////////////////////////////////////////////////////////////////////
  148. //静态变量
  149. //扑克数据
  150. const BYTE CGameLogic::m_cbCardDataArray[MAX_REPERTORY]=
  151. {
  152. 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //万子
  153. 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //万子
  154. 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //万子
  155. 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, //万子
  156. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
  157. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
  158. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
  159. 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, //索子
  160. 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
  161. 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
  162. 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
  163. 0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, //同子
  164. };
  165. //////////////////////////////////////////////////////////////////////////
  166. //构造函数
  167. CGameLogic::CGameLogic()
  168. {
  169. m_cbMagicIndex = MAX_INDEX;
  170. }
  171. //析构函数
  172. CGameLogic::~CGameLogic()
  173. {
  174. }
  175. //混乱扑克
  176. void CGameLogic::RandCardData(BYTE cbCardData[], BYTE cbMaxCount)
  177. {
  178. //混乱准备
  179. BYTE cbCardDataTemp[CountArray(m_cbCardDataArray)];
  180. CopyMemory(cbCardDataTemp,m_cbCardDataArray,sizeof(m_cbCardDataArray));
  181. //混乱扑克
  182. BYTE cbRandCount=0,cbPosition=0;
  183. do
  184. {
  185. cbPosition=rand()%(cbMaxCount-cbRandCount);
  186. cbCardData[cbRandCount++]=cbCardDataTemp[cbPosition];
  187. cbCardDataTemp[cbPosition]=cbCardDataTemp[cbMaxCount-cbRandCount];
  188. } while (cbRandCount<cbMaxCount);
  189. return;
  190. }
  191. //删除扑克
  192. bool CGameLogic::RemoveCard(BYTE cbCardIndex[MAX_INDEX], BYTE cbRemoveCard)
  193. {
  194. //效验扑克
  195. ASSERT(IsValidCard(cbRemoveCard));
  196. ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard)]>0);
  197. //删除扑克
  198. BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard);
  199. if (cbCardIndex[cbRemoveIndex]>0)
  200. {
  201. cbCardIndex[cbRemoveIndex]--;
  202. return true;
  203. }
  204. //失败效验
  205. ASSERT(FALSE);
  206. return false;
  207. }
  208. //删除扑克
  209. bool CGameLogic::RemoveCard(BYTE cbCardIndex[MAX_INDEX], const BYTE cbRemoveCard[], BYTE cbRemoveCount)
  210. {
  211. //删除扑克
  212. for (BYTE i=0;i<cbRemoveCount;i++)
  213. {
  214. //效验扑克
  215. ASSERT(IsValidCard(cbRemoveCard[i]));
  216. ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard[i])]>0);
  217. //删除扑克
  218. BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard[i]);
  219. if (cbCardIndex[cbRemoveIndex]==0)
  220. {
  221. //错误断言
  222. ASSERT(FALSE);
  223. //还原删除
  224. for (BYTE j=0;j<i;j++)
  225. {
  226. ASSERT(IsValidCard(cbRemoveCard[j]));
  227. cbCardIndex[SwitchToCardIndex(cbRemoveCard[j])]++;
  228. }
  229. return false;
  230. }
  231. else
  232. {
  233. //删除扑克
  234. cbCardIndex[cbRemoveIndex];
  235. }
  236. }
  237. return true;
  238. }
  239. //删除扑克
  240. bool CGameLogic::RemoveCard(BYTE cbCardData[], BYTE cbCardCount, const BYTE cbRemoveCard[], BYTE cbRemoveCount)
  241. {
  242. //检验数据
  243. ASSERT(cbCardCount<=14);
  244. ASSERT(cbRemoveCount<=cbCardCount);
  245. //定义变量
  246. BYTE cbDeleteCount=0,cbTempCardData[14];
  247. if (cbCardCount>CountArray(cbTempCardData))
  248. return false;
  249. CopyMemory(cbTempCardData,cbCardData,cbCardCount*sizeof(cbCardData[0]));
  250. //置零扑克
  251. for (BYTE i=0;i<cbRemoveCount;i++)
  252. {
  253. for (BYTE j=0;j<cbCardCount;j++)
  254. {
  255. if (cbRemoveCard[i]==cbTempCardData[j])
  256. {
  257. cbDeleteCount++;
  258. cbTempCardData[j]=0;
  259. break;
  260. }
  261. }
  262. }
  263. //成功判断
  264. if (cbDeleteCount!=cbRemoveCount)
  265. {
  266. ASSERT(FALSE);
  267. return false;
  268. }
  269. //清理扑克
  270. BYTE cbCardPos=0;
  271. for (BYTE i=0;i<cbCardCount;i++)
  272. {
  273. if (cbTempCardData[i]!=0)
  274. cbCardData[cbCardPos++]=cbTempCardData[i];
  275. }
  276. return true;
  277. }
  278. //有效判断
  279. bool CGameLogic::IsValidCard(BYTE cbCardData)
  280. {
  281. BYTE cbValue=(cbCardData&MASK_VALUE);
  282. BYTE cbColor=(cbCardData&MASK_COLOR)>>4;
  283. return (((cbValue>=1)&&(cbValue<=9)&&(cbColor<=2))||((cbValue>=1)&&(cbValue<=7)&&(cbColor==3)));
  284. }
  285. //扑克数目
  286. BYTE CGameLogic::GetCardCount(const BYTE cbCardIndex[MAX_INDEX])
  287. {
  288. //数目统计
  289. BYTE cbCardCount=0;
  290. for (BYTE i=0;i<MAX_INDEX;i++)
  291. cbCardCount+=cbCardIndex[i];
  292. return cbCardCount;
  293. }
  294. //获取组合
  295. BYTE CGameLogic::GetWeaveCard(BYTE cbWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4])
  296. {
  297. //组合扑克
  298. switch (cbWeaveKind)
  299. {
  300. case WIK_LEFT: //上牌操作
  301. {
  302. //设置变量
  303. cbCardBuffer[0]=cbCenterCard;
  304. cbCardBuffer[1]=cbCenterCard+1;
  305. cbCardBuffer[2]=cbCenterCard+2;
  306. return 3;
  307. }
  308. case WIK_RIGHT: //上牌操作
  309. {
  310. //设置变量
  311. cbCardBuffer[0]=cbCenterCard;
  312. cbCardBuffer[1]=cbCenterCard-1;
  313. cbCardBuffer[2]=cbCenterCard-2;
  314. return 3;
  315. }
  316. case WIK_CENTER: //上牌操作
  317. {
  318. //设置变量
  319. cbCardBuffer[0]=cbCenterCard;
  320. cbCardBuffer[1]=cbCenterCard-1;
  321. cbCardBuffer[2]=cbCenterCard+1;
  322. return 3;
  323. }
  324. case WIK_PENG: //碰牌操作
  325. {
  326. //设置变量
  327. cbCardBuffer[0]=cbCenterCard;
  328. cbCardBuffer[1]=cbCenterCard;
  329. cbCardBuffer[2]=cbCenterCard;
  330. return 3;
  331. }
  332. case WIK_GANG: //杠牌操作
  333. {
  334. //设置变量
  335. cbCardBuffer[0]=cbCenterCard;
  336. cbCardBuffer[1]=cbCenterCard;
  337. cbCardBuffer[2]=cbCenterCard;
  338. cbCardBuffer[3]=cbCenterCard;
  339. return 4;
  340. }
  341. default:
  342. {
  343. ASSERT(FALSE);
  344. }
  345. }
  346. return 0;
  347. }
  348. //动作等级
  349. BYTE CGameLogic::GetUserActionRank(BYTE cbUserAction)
  350. {
  351. //胡牌等级
  352. if (cbUserAction&WIK_CHI_HU) { return 4; }
  353. //杠牌等级
  354. if (cbUserAction&WIK_GANG) { return 3; }
  355. //碰牌等级
  356. if (cbUserAction&WIK_PENG) { return 2; }
  357. //上牌等级
  358. if (cbUserAction&(WIK_RIGHT|WIK_CENTER|WIK_LEFT)) { return 1; }
  359. return 0;
  360. }
  361. //胡牌等级
  362. WORD CGameLogic::GetChiHuActionRank(const CChiHuRight & ChiHuRight)
  363. {
  364. WORD wFanShu = 0;
  365. if( !(ChiHuRight&CHR_QING_LONG_QI_DUI).IsEmpty() )
  366. wFanShu = 32;
  367. else if( !(ChiHuRight&CHR_DI_HU).IsEmpty() )
  368. wFanShu = 32;
  369. else if( !(ChiHuRight&CHR_TIAN_HU).IsEmpty() )
  370. wFanShu = 32;
  371. else if( !(ChiHuRight&CHR_LONG_QI_DUI).IsEmpty() )
  372. wFanShu = 16;
  373. else if( !(ChiHuRight&CHR_QING_QI_DUI).IsEmpty() )
  374. wFanShu = 16;
  375. else if( !(ChiHuRight&CHR_QING_YAO_JIU).IsEmpty() )
  376. wFanShu = 16;
  377. else if( !(ChiHuRight&CHR_QING_DUI).IsEmpty() )
  378. wFanShu = 8;
  379. else if( !(ChiHuRight&CHR_JIANG_DUI).IsEmpty() )
  380. wFanShu = 8;
  381. else if( !(ChiHuRight&CHR_QING_YI_SE).IsEmpty() )
  382. wFanShu = 4;
  383. else if( !(ChiHuRight&CHR_DAI_YAO).IsEmpty() )
  384. wFanShu = 4;
  385. else if( !(ChiHuRight&CHR_QI_XIAO_DUI).IsEmpty() )
  386. wFanShu = 4;
  387. else if( !(ChiHuRight&CHR_DA_DUI_ZI).IsEmpty() )
  388. wFanShu = 2;
  389. else if( !(ChiHuRight&CHR_SHU_FAN).IsEmpty() )
  390. wFanShu = 1;
  391. ASSERT( wFanShu > 0 );
  392. //杠上花
  393. if( !(ChiHuRight&CHR_GANG_KAI).IsEmpty() )
  394. wFanShu *= 2;
  395. //杠上炮
  396. if( !(ChiHuRight&CHR_GANG_SHANG_PAO).IsEmpty() )
  397. wFanShu *= 2;
  398. return wFanShu;
  399. }
  400. //吃牌判断
  401. BYTE CGameLogic::EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  402. {
  403. //参数效验
  404. ASSERT(IsValidCard(cbCurrentCard));
  405. //过滤判断
  406. if ( cbCurrentCard>=0x31 || IsMagicCard(cbCurrentCard) )
  407. return WIK_NULL;
  408. //变量定义
  409. BYTE cbExcursion[3]={0,1,2};
  410. BYTE cbItemKind[3]={WIK_LEFT,WIK_CENTER,WIK_RIGHT};
  411. //吃牌判断
  412. BYTE cbEatKind=0,cbFirstIndex=0;
  413. BYTE cbCurrentIndex=SwitchToCardIndex(cbCurrentCard);
  414. for (BYTE i=0;i<CountArray(cbItemKind);i++)
  415. {
  416. BYTE cbValueIndex=cbCurrentIndex%9;
  417. if ((cbValueIndex>=cbExcursion[i])&&((cbValueIndex-cbExcursion[i])<=6))
  418. {
  419. //吃牌判断
  420. cbFirstIndex=cbCurrentIndex-cbExcursion[i];
  421. //吃牌不能包含有王霸
  422. if( m_cbMagicIndex != MAX_INDEX &&
  423. m_cbMagicIndex >= cbFirstIndex && m_cbMagicIndex <= cbFirstIndex+2 ) continue;
  424. if ((cbCurrentIndex!=cbFirstIndex)&&(cbCardIndex[cbFirstIndex]==0))
  425. continue;
  426. if ((cbCurrentIndex!=(cbFirstIndex+1))&&(cbCardIndex[cbFirstIndex+1]==0))
  427. continue;
  428. if ((cbCurrentIndex!=(cbFirstIndex+2))&&(cbCardIndex[cbFirstIndex+2]==0))
  429. continue;
  430. //设置类型
  431. cbEatKind|=cbItemKind[i];
  432. }
  433. }
  434. return cbEatKind;
  435. }
  436. //碰牌判断
  437. BYTE CGameLogic::EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  438. {
  439. //参数效验
  440. ASSERT(IsValidCard(cbCurrentCard));
  441. //过滤判断
  442. if ( IsMagicCard(cbCurrentCard) )
  443. return WIK_NULL;
  444. //碰牌判断
  445. return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]>=2)?WIK_PENG:WIK_NULL;
  446. }
  447. //杠牌判断
  448. BYTE CGameLogic::EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  449. {
  450. //参数效验
  451. ASSERT(IsValidCard(cbCurrentCard));
  452. //过滤判断
  453. if ( IsMagicCard(cbCurrentCard) )
  454. return WIK_NULL;
  455. //杠牌判断
  456. return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]==3)?WIK_GANG:WIK_NULL;
  457. }
  458. //杠牌分析
  459. BYTE CGameLogic::AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult)
  460. {
  461. //设置变量
  462. BYTE cbActionMask=WIK_NULL;
  463. ZeroMemory(&GangCardResult,sizeof(GangCardResult));
  464. //手上杠牌
  465. for (BYTE i=0;i<MAX_INDEX;i++)
  466. {
  467. if( i == m_cbMagicIndex ) continue;
  468. if (cbCardIndex[i]==4)
  469. {
  470. cbActionMask|=WIK_GANG;
  471. GangCardResult.cbCardData[GangCardResult.cbCardCount++]=SwitchToCardData(i);
  472. }
  473. }
  474. //组合杠牌
  475. for (BYTE i=0;i<cbWeaveCount;i++)
  476. {
  477. if (WeaveItem[i].cbWeaveKind==WIK_PENG)
  478. {
  479. if (cbCardIndex[SwitchToCardIndex(WeaveItem[i].cbCenterCard)]==1)
  480. {
  481. cbActionMask|=WIK_GANG;
  482. GangCardResult.cbCardData[GangCardResult.cbCardCount++]=WeaveItem[i].cbCenterCard;
  483. }
  484. }
  485. }
  486. return cbActionMask;
  487. }
  488. //吃胡分析
  489. BYTE CGameLogic::AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, CChiHuRight &ChiHuRight)
  490. {
  491. //变量定义
  492. BYTE cbChiHuKind=WIK_NULL;
  493. CAnalyseItemArray AnalyseItemArray;
  494. //设置变量
  495. AnalyseItemArray.RemoveAll();
  496. ChiHuRight.SetEmpty();
  497. //构造扑克
  498. BYTE cbCardIndexTemp[MAX_INDEX];
  499. CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  500. //cbCurrentCard一定不为0 !!!!!!!!!
  501. ASSERT( cbCurrentCard != 0 );
  502. if( cbCurrentCard == 0 ) return WIK_NULL;
  503. /*
  504. // 特殊番型
  505. */
  506. //七小对牌
  507. if( IsQiXiaoDui(cbCardIndex,WeaveItem,cbWeaveCount,cbCurrentCard) )
  508. ChiHuRight |= CHR_QI_XIAO_DUI;
  509. if( !ChiHuRight.IsEmpty() )
  510. cbChiHuKind = WIK_CHI_HU;
  511. //插入扑克
  512. if (cbCurrentCard!=0)
  513. cbCardIndexTemp[SwitchToCardIndex(cbCurrentCard)]++;
  514. //必须缺一门
  515. if( IsHuaZhu(cbCardIndexTemp,WeaveItem,cbWeaveCount) ) return WIK_NULL;
  516. //分析扑克
  517. AnalyseCard(cbCardIndexTemp,WeaveItem,cbWeaveCount,AnalyseItemArray);
  518. //胡牌分析
  519. if (AnalyseItemArray.GetCount()>0)
  520. {
  521. //
  522. cbChiHuKind = WIK_CHI_HU;
  523. //牌型分析
  524. for (INT_PTR i=0;i<AnalyseItemArray.GetCount();i++)
  525. {
  526. //变量定义
  527. tagAnalyseItem * pAnalyseItem=&AnalyseItemArray[i];
  528. /*
  529. // 判断番型
  530. */
  531. //碰碰和
  532. if( IsPengPeng(pAnalyseItem) )
  533. ChiHuRight |= CHR_DA_DUI_ZI;
  534. //带幺
  535. if( IsDaiYao(pAnalyseItem) )
  536. ChiHuRight |= CHR_DAI_YAO;
  537. //将对
  538. if( IsJiangDui(pAnalyseItem) )
  539. ChiHuRight |= CHR_JIANG_DUI;
  540. }
  541. }
  542. //素番
  543. if( cbChiHuKind == WIK_CHI_HU && ChiHuRight.IsEmpty() )
  544. ChiHuRight |= CHR_SHU_FAN;
  545. if( cbChiHuKind == WIK_CHI_HU )
  546. {
  547. //清一色牌
  548. if( IsQingYiSe(cbCardIndex,WeaveItem,cbWeaveCount,cbCurrentCard) )
  549. ChiHuRight |= CHR_QING_YI_SE;
  550. }
  551. return cbChiHuKind;
  552. }
  553. //听牌分析
  554. BYTE CGameLogic::AnalyseTingCard( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount )
  555. {
  556. //复制数据
  557. BYTE cbCardIndexTemp[MAX_INDEX];
  558. CopyMemory( cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp) );
  559. BYTE cbCardCount = GetCardCount(cbCardIndexTemp);
  560. CChiHuRight chr;
  561. if( (cbCardCount-2)%3==0 )
  562. {
  563. for( BYTE i = 0; i < MAX_INDEX-ZI_PAI_COUNT; i++ )
  564. {
  565. if( cbCardIndexTemp[i] == 0 ) continue;
  566. cbCardIndexTemp[i]--;
  567. for( BYTE j = 0; j < MAX_INDEX-ZI_PAI_COUNT; j++ )
  568. {
  569. BYTE cbCurrentCard = SwitchToCardData(j);
  570. if( WIK_CHI_HU == AnalyseChiHuCard(cbCardIndexTemp,WeaveItem,cbWeaveCount,cbCurrentCard,chr) )
  571. return WIK_LISTEN;
  572. }
  573. cbCardIndexTemp[i]++;
  574. }
  575. }
  576. else
  577. {
  578. for( BYTE j = 0; j < MAX_INDEX-ZI_PAI_COUNT; j++ )
  579. {
  580. BYTE cbCurrentCard = SwitchToCardData(j);
  581. if( WIK_CHI_HU == AnalyseChiHuCard(cbCardIndexTemp,WeaveItem,cbWeaveCount,cbCurrentCard,chr) )
  582. return WIK_LISTEN;
  583. }
  584. }
  585. return WIK_NULL;
  586. }
  587. //是否听牌
  588. bool CGameLogic::IsTingCard( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount )
  589. {
  590. //复制数据
  591. BYTE cbCardIndexTemp[MAX_INDEX];
  592. CopyMemory( cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp) );
  593. CChiHuRight chr;
  594. for( BYTE i = 0; i < MAX_INDEX-7; i++ )
  595. {
  596. BYTE cbCurrentCard = SwitchToCardData( i );
  597. if( WIK_CHI_HU == AnalyseChiHuCard( cbCardIndexTemp,WeaveItem,cbWeaveCount,cbCurrentCard,chr ) )
  598. return true;
  599. }
  600. return false;
  601. }
  602. //扑克转换
  603. BYTE CGameLogic::SwitchToCardData(BYTE cbCardIndex)
  604. {
  605. ASSERT(cbCardIndex<34);
  606. return ((cbCardIndex/9)<<4)|(cbCardIndex%9+1);
  607. }
  608. //扑克转换
  609. BYTE CGameLogic::SwitchToCardIndex(BYTE cbCardData)
  610. {
  611. ASSERT(IsValidCard(cbCardData));
  612. return ((cbCardData&MASK_COLOR)>>4)*9+(cbCardData&MASK_VALUE)-1;
  613. }
  614. //扑克转换
  615. BYTE CGameLogic::SwitchToCardData(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT])
  616. {
  617. //转换扑克
  618. BYTE cbPosition=0;
  619. //钻牌
  620. if( m_cbMagicIndex != MAX_INDEX )
  621. {
  622. for( BYTE i = 0; i < cbCardIndex[m_cbMagicIndex]; i++ )
  623. cbCardData[cbPosition++] = SwitchToCardData(m_cbMagicIndex);
  624. }
  625. for (BYTE i=0;i<MAX_INDEX;i++)
  626. {
  627. if( i == m_cbMagicIndex ) continue;
  628. if (cbCardIndex[i]!=0)
  629. {
  630. for (BYTE j=0;j<cbCardIndex[i];j++)
  631. {
  632. ASSERT(cbPosition<MAX_COUNT);
  633. cbCardData[cbPosition++]=SwitchToCardData(i);
  634. }
  635. }
  636. }
  637. return cbPosition;
  638. }
  639. //扑克转换
  640. BYTE CGameLogic::SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX])
  641. {
  642. //设置变量
  643. ZeroMemory(cbCardIndex,sizeof(BYTE)*MAX_INDEX);
  644. //转换扑克
  645. for (BYTE i=0;i<cbCardCount;i++)
  646. {
  647. ASSERT(IsValidCard(cbCardData[i]));
  648. cbCardIndex[SwitchToCardIndex(cbCardData[i])]++;
  649. }
  650. return cbCardCount;
  651. }
  652. //分析扑克
  653. bool CGameLogic::AnalyseCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CAnalyseItemArray & AnalyseItemArray)
  654. {
  655. //计算数目
  656. BYTE cbCardCount=GetCardCount(cbCardIndex);
  657. //效验数目
  658. ASSERT((cbCardCount>=2)&&(cbCardCount<=MAX_COUNT)&&((cbCardCount-2)%3==0));
  659. if ((cbCardCount<2)||(cbCardCount>MAX_COUNT)||((cbCardCount-2)%3!=0))
  660. return false;
  661. //变量定义
  662. BYTE cbKindItemCount=0;
  663. tagKindItem KindItem[27*2+7+14];
  664. ZeroMemory(KindItem,sizeof(KindItem));
  665. //需求判断
  666. BYTE cbLessKindItem=(cbCardCount-2)/3;
  667. ASSERT((cbLessKindItem+cbWeaveCount)==4);
  668. //单吊判断
  669. if (cbLessKindItem==0)
  670. {
  671. //效验参数
  672. ASSERT((cbCardCount==2)&&(cbWeaveCount==4));
  673. //牌眼判断
  674. for (BYTE i=0;i<MAX_INDEX;i++)
  675. {
  676. if (cbCardIndex[i]==2 ||
  677. ( m_cbMagicIndex != MAX_INDEX && i != m_cbMagicIndex && cbCardIndex[m_cbMagicIndex]+cbCardIndex[i]==2 ) )
  678. {
  679. //变量定义
  680. tagAnalyseItem AnalyseItem;
  681. ZeroMemory(&AnalyseItem,sizeof(AnalyseItem));
  682. //设置结果
  683. for (BYTE j=0;j<cbWeaveCount;j++)
  684. {
  685. AnalyseItem.cbWeaveKind[j]=WeaveItem[j].cbWeaveKind;
  686. AnalyseItem.cbCenterCard[j]=WeaveItem[j].cbCenterCard;
  687. GetWeaveCard( WeaveItem[j].cbWeaveKind,WeaveItem[j].cbCenterCard,AnalyseItem.cbCardData[j] );
  688. }
  689. AnalyseItem.cbCardEye=SwitchToCardData(i);
  690. if( cbCardIndex[i] < 2 || i == m_cbMagicIndex )
  691. AnalyseItem.bMagicEye = true;
  692. else AnalyseItem.bMagicEye = false;
  693. //插入结果
  694. AnalyseItemArray.Add(AnalyseItem);
  695. return true;
  696. }
  697. }
  698. return false;
  699. }
  700. //拆分分析
  701. BYTE cbMagicCardIndex[MAX_INDEX];
  702. CopyMemory(cbMagicCardIndex,cbCardIndex,sizeof(cbMagicCardIndex));
  703. BYTE cbMagicCardCount = 0;
  704. if( m_cbMagicIndex != MAX_INDEX )
  705. {
  706. cbMagicCardCount = cbCardIndex[m_cbMagicIndex];
  707. if( cbMagicCardIndex[m_cbMagicIndex] ) cbMagicCardIndex[m_cbMagicIndex] = 1; //减小多余组合
  708. }
  709. if (cbCardCount>=3)
  710. {
  711. for (BYTE i=0;i<MAX_INDEX;i++)
  712. {
  713. //同牌判断
  714. if (cbMagicCardIndex[i]+cbMagicCardCount>=3)
  715. {
  716. ASSERT( cbKindItemCount < CountArray(KindItem) );
  717. KindItem[cbKindItemCount].cbCardIndex[0]=i;
  718. KindItem[cbKindItemCount].cbCardIndex[1]=i;
  719. KindItem[cbKindItemCount].cbCardIndex[2]=i;
  720. KindItem[cbKindItemCount].cbWeaveKind=WIK_PENG;
  721. KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
  722. KindItem[cbKindItemCount].cbValidIndex[0] = cbMagicCardIndex[i]>0?i:m_cbMagicIndex;
  723. KindItem[cbKindItemCount].cbValidIndex[1] = cbMagicCardIndex[i]>1?i:m_cbMagicIndex;
  724. KindItem[cbKindItemCount].cbValidIndex[2] = cbMagicCardIndex[i]>2?i:m_cbMagicIndex;
  725. cbKindItemCount++;
  726. if(cbMagicCardIndex[i]+cbMagicCardCount>=6)
  727. {
  728. ASSERT( cbKindItemCount < CountArray(KindItem) );
  729. KindItem[cbKindItemCount].cbCardIndex[0]=i;
  730. KindItem[cbKindItemCount].cbCardIndex[1]=i;
  731. KindItem[cbKindItemCount].cbCardIndex[2]=i;
  732. KindItem[cbKindItemCount].cbWeaveKind=WIK_PENG;
  733. KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
  734. KindItem[cbKindItemCount].cbValidIndex[0] = cbMagicCardIndex[i]>3?i:m_cbMagicIndex;
  735. KindItem[cbKindItemCount].cbValidIndex[1] = m_cbMagicIndex;
  736. KindItem[cbKindItemCount].cbValidIndex[2] = m_cbMagicIndex;
  737. cbKindItemCount++;
  738. }
  739. }
  740. //连牌判断
  741. if ((i<(MAX_INDEX-9))&&((i%9)<7))
  742. {
  743. //只要财神牌数加上3个顺序索引的牌数大于等于3,则进行组合
  744. if( cbMagicCardCount+cbMagicCardIndex[i]+cbMagicCardIndex[i+1]+cbMagicCardIndex[i+2] >= 3 )
  745. {
  746. BYTE cbIndex[3] = { i==m_cbMagicIndex?0:cbMagicCardIndex[i],(i+1)==m_cbMagicIndex?0:cbMagicCardIndex[i+1],
  747. (i+2)==m_cbMagicIndex?0:cbMagicCardIndex[i+2] };
  748. int nMagicCountTemp = cbMagicCardCount;
  749. BYTE cbValidIndex[3];
  750. while( nMagicCountTemp+cbIndex[0]+cbIndex[1]+cbIndex[2] >= 3 )
  751. {
  752. for( BYTE j = 0; j < CountArray(cbIndex); j++ )
  753. {
  754. if( cbIndex[j] > 0 )
  755. {
  756. cbIndex[j]--;
  757. cbValidIndex[j] = i+j;
  758. }
  759. else
  760. {
  761. nMagicCountTemp--;
  762. cbValidIndex[j] = m_cbMagicIndex;
  763. }
  764. }
  765. if( nMagicCountTemp >= 0 )
  766. {
  767. ASSERT( cbKindItemCount < CountArray(KindItem) );
  768. KindItem[cbKindItemCount].cbCardIndex[0]=i;
  769. KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
  770. KindItem[cbKindItemCount].cbCardIndex[2]=i+2;
  771. KindItem[cbKindItemCount].cbWeaveKind=WIK_LEFT;
  772. KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
  773. CopyMemory( KindItem[cbKindItemCount].cbValidIndex,cbValidIndex,sizeof(cbValidIndex) );
  774. cbKindItemCount++;
  775. }
  776. else break;
  777. }
  778. }
  779. }
  780. }
  781. }
  782. //组合分析
  783. if (cbKindItemCount>=cbLessKindItem)
  784. {
  785. //变量定义
  786. BYTE cbCardIndexTemp[MAX_INDEX];
  787. ZeroMemory(cbCardIndexTemp,sizeof(cbCardIndexTemp));
  788. //变量定义
  789. BYTE cbIndex[4]={0,1,2,3};
  790. tagKindItem * pKindItem[4];
  791. ZeroMemory(&pKindItem,sizeof(pKindItem));
  792. //开始组合
  793. do
  794. {
  795. //设置变量
  796. CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  797. for (BYTE i=0;i<cbLessKindItem;i++)
  798. pKindItem[i]=&KindItem[cbIndex[i]];
  799. //数量判断
  800. bool bEnoughCard=true;
  801. for (BYTE i=0;i<cbLessKindItem*3;i++)
  802. {
  803. //存在判断
  804. BYTE cbCardIndex=pKindItem[i/3]->cbValidIndex[i%3];
  805. if (cbCardIndexTemp[cbCardIndex]==0)
  806. {
  807. bEnoughCard=false;
  808. break;
  809. }
  810. else
  811. cbCardIndexTemp[cbCardIndex]--;
  812. }
  813. //胡牌判断
  814. if (bEnoughCard==true)
  815. {
  816. //牌眼判断
  817. BYTE cbCardEye=0;
  818. bool bMagicEye = false;
  819. for (BYTE i=0;i<MAX_INDEX;i++)
  820. {
  821. if (cbCardIndexTemp[i]==2)
  822. {
  823. cbCardEye=SwitchToCardData(i);
  824. if( i == m_cbMagicIndex ) bMagicEye = true;
  825. break;
  826. }
  827. else if( i!=m_cbMagicIndex &&
  828. m_cbMagicIndex != MAX_INDEX && cbCardIndexTemp[i]+cbCardIndexTemp[m_cbMagicIndex]==2 )
  829. {
  830. cbCardEye = SwitchToCardData(i);
  831. bMagicEye = true;
  832. }
  833. }
  834. //组合类型
  835. if (cbCardEye!=0)
  836. {
  837. //变量定义
  838. tagAnalyseItem AnalyseItem;
  839. ZeroMemory(&AnalyseItem,sizeof(AnalyseItem));
  840. //设置组合
  841. for (BYTE i=0;i<cbWeaveCount;i++)
  842. {
  843. AnalyseItem.cbWeaveKind[i]=WeaveItem[i].cbWeaveKind;
  844. AnalyseItem.cbCenterCard[i]=WeaveItem[i].cbCenterCard;
  845. GetWeaveCard( WeaveItem[i].cbWeaveKind,WeaveItem[i].cbCenterCard,
  846. AnalyseItem.cbCardData[i] );
  847. }
  848. //设置牌型
  849. for (BYTE i=0;i<cbLessKindItem;i++)
  850. {
  851. AnalyseItem.cbWeaveKind[i+cbWeaveCount]=pKindItem[i]->cbWeaveKind;
  852. AnalyseItem.cbCenterCard[i+cbWeaveCount]=pKindItem[i]->cbCenterCard;
  853. AnalyseItem.cbCardData[cbWeaveCount+i][0] = SwitchToCardData(pKindItem[i]->cbValidIndex[0]);
  854. AnalyseItem.cbCardData[cbWeaveCount+i][1] = SwitchToCardData(pKindItem[i]->cbValidIndex[1]);
  855. AnalyseItem.cbCardData[cbWeaveCount+i][2] = SwitchToCardData(pKindItem[i]->cbValidIndex[2]);
  856. }
  857. //设置牌眼
  858. AnalyseItem.cbCardEye=cbCardEye;
  859. AnalyseItem.bMagicEye = bMagicEye;
  860. //插入结果
  861. AnalyseItemArray.Add(AnalyseItem);
  862. }
  863. }
  864. //设置索引
  865. if (cbIndex[cbLessKindItem-1]==(cbKindItemCount-1))
  866. {
  867. BYTE i=cbLessKindItem-1;
  868. for ( ;i>0;i--)
  869. {
  870. if ((cbIndex[i-1]+1)!=cbIndex[i])
  871. {
  872. BYTE cbNewIndex=cbIndex[i-1];
  873. for (BYTE j=(i-1);j<cbLessKindItem;j++)
  874. cbIndex[j]=cbNewIndex+j-i+2;
  875. break;
  876. }
  877. }
  878. if (i==0)
  879. break;
  880. }
  881. else
  882. cbIndex[cbLessKindItem-1]++;
  883. } while (true);
  884. }
  885. return (AnalyseItemArray.GetCount()>0);
  886. }
  887. //钻牌
  888. bool CGameLogic::IsMagicCard( BYTE cbCardData )
  889. {
  890. if( m_cbMagicIndex != MAX_INDEX )
  891. return SwitchToCardIndex(cbCardData) == m_cbMagicIndex;
  892. return false;
  893. }
  894. //排序,根据牌值排序
  895. bool CGameLogic::SortCardList( BYTE cbCardData[MAX_COUNT], BYTE cbCardCount )
  896. {
  897. //数目过虑
  898. if (cbCardCount==0||cbCardCount>MAX_COUNT) return false;
  899. //排序操作
  900. bool bSorted=true;
  901. BYTE cbSwitchData=0,cbLast=cbCardCount-1;
  902. do
  903. {
  904. bSorted=true;
  905. for (BYTE i=0;i<cbLast;i++)
  906. {
  907. if (cbCardData[i]>cbCardData[i+1])
  908. {
  909. //设置标志
  910. bSorted=false;
  911. //扑克数据
  912. cbSwitchData=cbCardData[i];
  913. cbCardData[i]=cbCardData[i+1];
  914. cbCardData[i+1]=cbSwitchData;
  915. }
  916. }
  917. cbLast--;
  918. } while(bSorted==false);
  919. return true;
  920. }
  921. /*
  922. // 胡法分析函数
  923. */
  924. //大对子
  925. bool CGameLogic::IsPengPeng( const tagAnalyseItem *pAnalyseItem )
  926. {
  927. for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
  928. {
  929. if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
  930. return false;
  931. }
  932. return true;
  933. }
  934. //清一色牌
  935. bool CGameLogic::IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount,const BYTE cbCurrentCard)
  936. {
  937. //胡牌判断
  938. BYTE cbCardColor=0xFF;
  939. for (BYTE i=0;i<MAX_INDEX;i++)
  940. {
  941. if(i==m_cbMagicIndex) continue;
  942. if (cbCardIndex[i]!=0)
  943. {
  944. //花色判断
  945. if (cbCardColor!=0xFF)
  946. return false;
  947. //设置花色
  948. cbCardColor=(SwitchToCardData(i)&MASK_COLOR);
  949. //设置索引
  950. i=(i/9+1)*9-1;
  951. }
  952. }
  953. //如果手上只有王霸
  954. if( cbCardColor == 0xFF )
  955. {
  956. ASSERT( m_cbMagicIndex != MAX_INDEX && cbCardIndex[m_cbMagicIndex] > 0 );
  957. //检查组合
  958. ASSERT( cbItemCount > 0 );
  959. cbCardColor = WeaveItem[0].cbCenterCard&MASK_COLOR;
  960. }
  961. if((cbCurrentCard&MASK_COLOR)!=cbCardColor && !IsMagicCard(cbCurrentCard) ) return false;
  962. //组合判断
  963. for (BYTE i=0;i<cbItemCount;i++)
  964. {
  965. BYTE cbCenterCard=WeaveItem[i].cbCenterCard;
  966. if ((cbCenterCard&MASK_COLOR)!=cbCardColor) return false;
  967. }
  968. return true;
  969. }
  970. //七小对牌
  971. bool CGameLogic::IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount,const BYTE cbCurrentCard)
  972. {
  973. //组合判断
  974. if (cbWeaveCount!=0) return false;
  975. //单牌数目
  976. BYTE cbReplaceCount = 0;
  977. //临时数据
  978. BYTE cbCardIndexTemp[MAX_INDEX];
  979. CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  980. //插入数据
  981. BYTE cbCurrentIndex = SwitchToCardIndex(cbCurrentCard);
  982. cbCardIndexTemp[cbCurrentIndex]++;
  983. //计算单牌
  984. for (BYTE i=0;i<MAX_INDEX;i++)
  985. {
  986. BYTE cbCardCount=cbCardIndexTemp[i];
  987. //王牌过滤
  988. if( i == m_cbMagicIndex ) continue;
  989. //单牌统计
  990. if( cbCardCount == 1 || cbCardCount == 3 ) cbReplaceCount++;
  991. }
  992. //王牌不够
  993. if( m_cbMagicIndex != MAX_INDEX && cbReplaceCount > cbCardIndexTemp[m_cbMagicIndex] ||
  994. m_cbMagicIndex == MAX_INDEX && cbReplaceCount > 0 )
  995. return false;
  996. return true;
  997. }
  998. //带幺
  999. bool CGameLogic::IsDaiYao( const tagAnalyseItem *pAnalyseItem )
  1000. {
  1001. //检查牌眼
  1002. BYTE cbCardValue = pAnalyseItem->cbCardEye&MASK_VALUE;
  1003. if( cbCardValue != 1 && cbCardValue != 9 ) return false;
  1004. for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
  1005. {
  1006. if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
  1007. {
  1008. BYTE j = 0;
  1009. for( ; j < 3; j++ )
  1010. {
  1011. cbCardValue = pAnalyseItem->cbCardData[i][j]&MASK_VALUE;
  1012. if( cbCardValue == 1 || cbCardValue == 9 ) break;
  1013. }
  1014. if( j == 3 ) return false;
  1015. }
  1016. else
  1017. {
  1018. cbCardValue = pAnalyseItem->cbCenterCard[i]&MASK_VALUE;
  1019. if( cbCardValue != 1 && cbCardValue != 9 ) return false;
  1020. }
  1021. }
  1022. return true;
  1023. }
  1024. //将对
  1025. bool CGameLogic::IsJiangDui( const tagAnalyseItem *pAnalyseItem )
  1026. {
  1027. //是否大对子
  1028. if( !IsPengPeng(pAnalyseItem) ) return false;
  1029. //检查牌眼
  1030. BYTE cbCardValue = pAnalyseItem->cbCardEye&MASK_VALUE;
  1031. if( cbCardValue != 2 && cbCardValue != 5 && cbCardValue != 8 ) return false;
  1032. for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
  1033. {
  1034. if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
  1035. {
  1036. BYTE j = 0;
  1037. for( ; j < 3; j++ )
  1038. {
  1039. cbCardValue = pAnalyseItem->cbCardData[i][j]&MASK_VALUE;
  1040. if( cbCardValue == 2 || cbCardValue == 5 || cbCardValue == 8 ) break;
  1041. }
  1042. if( j == 3 ) return false;
  1043. }
  1044. else
  1045. {
  1046. cbCardValue = pAnalyseItem->cbCenterCard[i]&MASK_VALUE;
  1047. if( cbCardValue != 2 && cbCardValue != 5 && cbCardValue != 8 ) return false;
  1048. }
  1049. }
  1050. return true;
  1051. }
  1052. //是否花猪
  1053. bool CGameLogic::IsHuaZhu( const BYTE cbCardIndex[], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount )
  1054. {
  1055. BYTE cbColor[3] = { 0,0,0 };
  1056. for( BYTE i = 0; i < MAX_INDEX; i++ )
  1057. {
  1058. if( cbCardIndex[i] > 0 )
  1059. {
  1060. BYTE cbCardColor = SwitchToCardData(i)&MASK_COLOR;
  1061. cbColor[cbCardColor>>4]++;
  1062. i = (i/9+1)*9-1;
  1063. }
  1064. }
  1065. for( BYTE i = 0; i < cbWeaveCount; i++ )
  1066. {
  1067. BYTE cbCardColor = WeaveItem[i].cbCenterCard&MASK_COLOR;
  1068. cbColor[cbCardColor>>4]++;
  1069. }
  1070. //缺一门就不是花猪
  1071. for( BYTE i = 0; i < CountArray(cbColor); i++ )
  1072. if( cbColor[i] == 0 ) return false;
  1073. return true;
  1074. }
  1075. //////////////////////////////////////////////////////////////////////////