诸暨麻将添加redis
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

1258 Zeilen
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. /*
  402. BYTE CGameLogic::EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  403. {
  404. //参数效验
  405. ASSERT(IsValidCard(cbCurrentCard));
  406. //过滤判断
  407. if ( cbCurrentCard>=0x31 || IsMagicCard(cbCurrentCard) )
  408. return WIK_NULL;
  409. //变量定义
  410. BYTE cbExcursion[3]={0,1,2};
  411. BYTE cbItemKind[3]={WIK_LEFT,WIK_CENTER,WIK_RIGHT};
  412. //吃牌判断
  413. BYTE cbEatKind=0,cbFirstIndex=0;
  414. BYTE cbCurrentIndex=SwitchToCardIndex(cbCurrentCard);
  415. for (BYTE i=0;i<CountArray(cbItemKind);i++)
  416. {
  417. BYTE cbValueIndex=cbCurrentIndex%9;
  418. if ((cbValueIndex>=cbExcursion[i])&&((cbValueIndex-cbExcursion[i])<=6))
  419. {
  420. //吃牌判断
  421. cbFirstIndex=cbCurrentIndex-cbExcursion[i];
  422. //吃牌不能包含有王霸
  423. if( m_cbMagicIndex != MAX_INDEX &&
  424. m_cbMagicIndex >= cbFirstIndex && m_cbMagicIndex <= cbFirstIndex+2 ) continue;
  425. if ((cbCurrentIndex!=cbFirstIndex)&&(cbCardIndex[cbFirstIndex]==0))
  426. continue;
  427. if ((cbCurrentIndex!=(cbFirstIndex+1))&&(cbCardIndex[cbFirstIndex+1]==0))
  428. continue;
  429. if ((cbCurrentIndex!=(cbFirstIndex+2))&&(cbCardIndex[cbFirstIndex+2]==0))
  430. continue;
  431. //设置类型
  432. cbEatKind|=cbItemKind[i];
  433. }
  434. }
  435. return cbEatKind;
  436. }*/
  437. //碰牌判断
  438. BYTE CGameLogic::EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  439. {
  440. //参数效验
  441. ASSERT(IsValidCard(cbCurrentCard));
  442. //过滤判断
  443. if ( IsMagicCard(cbCurrentCard) )
  444. return WIK_NULL;
  445. //碰牌判断
  446. return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]>=2)?WIK_PENG:WIK_NULL;
  447. }
  448. //杠牌判断
  449. BYTE CGameLogic::EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  450. {
  451. //参数效验
  452. ASSERT(IsValidCard(cbCurrentCard));
  453. //过滤判断
  454. if ( IsMagicCard(cbCurrentCard) )
  455. return WIK_NULL;
  456. //杠牌判断
  457. return (cbCardIndex[SwitchToCardIndex(cbCurrentCard)]==3)?WIK_GANG:WIK_NULL;
  458. }
  459. //杠牌分析
  460. BYTE CGameLogic::AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, tagGangCardResult & GangCardResult)
  461. {
  462. //设置变量
  463. BYTE cbActionMask=WIK_NULL;
  464. ZeroMemory(&GangCardResult,sizeof(GangCardResult));
  465. //手上杠牌
  466. for (BYTE i=0;i<MAX_INDEX;i++)
  467. {
  468. if( i == m_cbMagicIndex ) continue;
  469. if (cbCardIndex[i]==4)
  470. {
  471. cbActionMask|=WIK_GANG;
  472. GangCardResult.cbCardData[GangCardResult.cbCardCount++]=SwitchToCardData(i);
  473. }
  474. }
  475. //组合杠牌
  476. for (BYTE i=0;i<cbWeaveCount;i++)
  477. {
  478. if (WeaveItem[i].cbWeaveKind==WIK_PENG)
  479. {
  480. if (cbCardIndex[SwitchToCardIndex(WeaveItem[i].cbCenterCard)]==1)
  481. {
  482. cbActionMask|=WIK_GANG;
  483. GangCardResult.cbCardData[GangCardResult.cbCardCount++]=WeaveItem[i].cbCenterCard;
  484. }
  485. }
  486. }
  487. return cbActionMask;
  488. }
  489. //吃胡分析
  490. BYTE CGameLogic::AnalyseChiHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard, CChiHuRight &ChiHuRight)
  491. {
  492. //变量定义
  493. BYTE cbChiHuKind=WIK_NULL;
  494. CAnalyseItemArray AnalyseItemArray;
  495. //设置变量
  496. AnalyseItemArray.RemoveAll();
  497. ChiHuRight.SetEmpty();
  498. //构造扑克
  499. BYTE cbCardIndexTemp[MAX_INDEX];
  500. CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  501. //cbCurrentCard一定不为0 !!!!!!!!!
  502. ASSERT( cbCurrentCard != 0 );
  503. if( cbCurrentCard == 0 ) return WIK_NULL;
  504. /*
  505. // 特殊番型
  506. */
  507. //七小对牌
  508. if( IsQiXiaoDui(cbCardIndex,WeaveItem,cbWeaveCount,cbCurrentCard) )
  509. ChiHuRight |= CHR_QI_XIAO_DUI;
  510. if( !ChiHuRight.IsEmpty() )
  511. cbChiHuKind = WIK_CHI_HU;
  512. //插入扑克
  513. if (cbCurrentCard!=0)
  514. cbCardIndexTemp[SwitchToCardIndex(cbCurrentCard)]++;
  515. //必须缺一门
  516. if( IsHuaZhu(cbCardIndexTemp,WeaveItem,cbWeaveCount) ) return WIK_NULL;
  517. //分析扑克
  518. AnalyseCard(cbCardIndexTemp,WeaveItem,cbWeaveCount,AnalyseItemArray);
  519. //胡牌分析
  520. if (AnalyseItemArray.GetCount()>0)
  521. {
  522. //
  523. cbChiHuKind = WIK_CHI_HU;
  524. //牌型分析
  525. for (INT_PTR i=0;i<AnalyseItemArray.GetCount();i++)
  526. {
  527. //变量定义
  528. tagAnalyseItem * pAnalyseItem=&AnalyseItemArray[i];
  529. /*
  530. // 判断番型
  531. */
  532. //碰碰和
  533. if( IsPengPeng(pAnalyseItem) )
  534. ChiHuRight |= CHR_DA_DUI_ZI;
  535. //带幺
  536. if( IsDaiYao(pAnalyseItem) )
  537. ChiHuRight |= CHR_DAI_YAO;
  538. //将对
  539. if( IsJiangDui(pAnalyseItem) )
  540. ChiHuRight |= CHR_JIANG_DUI;
  541. }
  542. }
  543. //素番
  544. if( cbChiHuKind == WIK_CHI_HU && ChiHuRight.IsEmpty() )
  545. ChiHuRight |= CHR_SHU_FAN;
  546. if( cbChiHuKind == WIK_CHI_HU )
  547. {
  548. //清一色牌
  549. if( IsQingYiSe(cbCardIndex,WeaveItem,cbWeaveCount,cbCurrentCard) )
  550. ChiHuRight |= CHR_QING_YI_SE;
  551. }
  552. return cbChiHuKind;
  553. }
  554. //听牌分析
  555. BYTE CGameLogic::AnalyseTingCard( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount )
  556. {
  557. //复制数据
  558. BYTE cbCardIndexTemp[MAX_INDEX];
  559. CopyMemory( cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp) );
  560. BYTE cbCardCount = GetCardCount(cbCardIndexTemp);
  561. CChiHuRight chr;
  562. if( (cbCardCount-2)%3==0 )
  563. {
  564. for( BYTE i = 0; i < MAX_INDEX-ZI_PAI_COUNT; i++ )
  565. {
  566. if( cbCardIndexTemp[i] == 0 ) continue;
  567. cbCardIndexTemp[i]--;
  568. for( BYTE j = 0; j < MAX_INDEX-ZI_PAI_COUNT; j++ )
  569. {
  570. BYTE cbCurrentCard = SwitchToCardData(j);
  571. if( WIK_CHI_HU == AnalyseChiHuCard(cbCardIndexTemp,WeaveItem,cbWeaveCount,cbCurrentCard,chr) )
  572. return WIK_LISTEN;
  573. }
  574. cbCardIndexTemp[i]++;
  575. }
  576. }
  577. else
  578. {
  579. for( BYTE j = 0; j < MAX_INDEX-ZI_PAI_COUNT; j++ )
  580. {
  581. BYTE cbCurrentCard = SwitchToCardData(j);
  582. if( WIK_CHI_HU == AnalyseChiHuCard(cbCardIndexTemp,WeaveItem,cbWeaveCount,cbCurrentCard,chr) )
  583. return WIK_LISTEN;
  584. }
  585. }
  586. return WIK_NULL;
  587. }
  588. //是否听牌
  589. bool CGameLogic::IsTingCard( const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount )
  590. {
  591. //复制数据
  592. BYTE cbCardIndexTemp[MAX_INDEX];
  593. CopyMemory( cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp) );
  594. CChiHuRight chr;
  595. for( BYTE i = 0; i < MAX_INDEX-7; i++ )
  596. {
  597. BYTE cbCurrentCard = SwitchToCardData( i );
  598. if( WIK_CHI_HU == AnalyseChiHuCard( cbCardIndexTemp,WeaveItem,cbWeaveCount,cbCurrentCard,chr ) )
  599. return true;
  600. }
  601. return false;
  602. }
  603. //扑克转换
  604. BYTE CGameLogic::SwitchToCardData(BYTE cbCardIndex)
  605. {
  606. ASSERT(cbCardIndex<34);
  607. return ((cbCardIndex/9)<<4)|(cbCardIndex%9+1);
  608. }
  609. //扑克转换
  610. BYTE CGameLogic::SwitchToCardIndex(BYTE cbCardData)
  611. {
  612. ASSERT(IsValidCard(cbCardData));
  613. return ((cbCardData&MASK_COLOR)>>4)*9+(cbCardData&MASK_VALUE)-1;
  614. }
  615. //扑克转换
  616. BYTE CGameLogic::SwitchToCardData(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCardData[MAX_COUNT])
  617. {
  618. //转换扑克
  619. BYTE cbPosition=0;
  620. //钻牌
  621. if( m_cbMagicIndex != MAX_INDEX )
  622. {
  623. for( BYTE i = 0; i < cbCardIndex[m_cbMagicIndex]; i++ )
  624. cbCardData[cbPosition++] = SwitchToCardData(m_cbMagicIndex);
  625. }
  626. for (BYTE i=0;i<MAX_INDEX;i++)
  627. {
  628. if( i == m_cbMagicIndex ) continue;
  629. if (cbCardIndex[i]!=0)
  630. {
  631. for (BYTE j=0;j<cbCardIndex[i];j++)
  632. {
  633. ASSERT(cbPosition<MAX_COUNT);
  634. cbCardData[cbPosition++]=SwitchToCardData(i);
  635. }
  636. }
  637. }
  638. return cbPosition;
  639. }
  640. //扑克转换
  641. BYTE CGameLogic::SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX])
  642. {
  643. //设置变量
  644. ZeroMemory(cbCardIndex,sizeof(BYTE)*MAX_INDEX);
  645. //转换扑克
  646. for (BYTE i=0;i<cbCardCount;i++)
  647. {
  648. ASSERT(IsValidCard(cbCardData[i]));
  649. cbCardIndex[SwitchToCardIndex(cbCardData[i])]++;
  650. }
  651. return cbCardCount;
  652. }
  653. //分析扑克
  654. bool CGameLogic::AnalyseCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, CAnalyseItemArray & AnalyseItemArray)
  655. {
  656. //计算数目
  657. BYTE cbCardCount=GetCardCount(cbCardIndex);
  658. //效验数目
  659. ASSERT((cbCardCount>=2)&&(cbCardCount<=MAX_COUNT)&&((cbCardCount-2)%3==0));
  660. if ((cbCardCount<2)||(cbCardCount>MAX_COUNT)||((cbCardCount-2)%3!=0))
  661. return false;
  662. //变量定义
  663. BYTE cbKindItemCount=0;
  664. tagKindItem KindItem[27*2+7+14];
  665. ZeroMemory(KindItem,sizeof(KindItem));
  666. //需求判断
  667. BYTE cbLessKindItem=(cbCardCount-2)/3;
  668. ASSERT((cbLessKindItem+cbWeaveCount)==4);
  669. //单吊判断
  670. if (cbLessKindItem==0)
  671. {
  672. //效验参数
  673. ASSERT((cbCardCount==2)&&(cbWeaveCount==4));
  674. //牌眼判断
  675. for (BYTE i=0;i<MAX_INDEX;i++)
  676. {
  677. if (cbCardIndex[i]==2 ||
  678. ( m_cbMagicIndex != MAX_INDEX && i != m_cbMagicIndex && cbCardIndex[m_cbMagicIndex]+cbCardIndex[i]==2 ) )
  679. {
  680. //变量定义
  681. tagAnalyseItem AnalyseItem;
  682. ZeroMemory(&AnalyseItem,sizeof(AnalyseItem));
  683. //设置结果
  684. for (BYTE j=0;j<cbWeaveCount;j++)
  685. {
  686. AnalyseItem.cbWeaveKind[j]=WeaveItem[j].cbWeaveKind;
  687. AnalyseItem.cbCenterCard[j]=WeaveItem[j].cbCenterCard;
  688. GetWeaveCard( WeaveItem[j].cbWeaveKind,WeaveItem[j].cbCenterCard,AnalyseItem.cbCardData[j] );
  689. }
  690. AnalyseItem.cbCardEye=SwitchToCardData(i);
  691. if( cbCardIndex[i] < 2 || i == m_cbMagicIndex )
  692. AnalyseItem.bMagicEye = true;
  693. else AnalyseItem.bMagicEye = false;
  694. //插入结果
  695. AnalyseItemArray.Add(AnalyseItem);
  696. return true;
  697. }
  698. }
  699. return false;
  700. }
  701. //拆分分析
  702. BYTE cbMagicCardIndex[MAX_INDEX];
  703. CopyMemory(cbMagicCardIndex,cbCardIndex,sizeof(cbMagicCardIndex));
  704. BYTE cbMagicCardCount = 0;
  705. if( m_cbMagicIndex != MAX_INDEX )
  706. {
  707. cbMagicCardCount = cbCardIndex[m_cbMagicIndex];
  708. if( cbMagicCardIndex[m_cbMagicIndex] ) cbMagicCardIndex[m_cbMagicIndex] = 1; //减小多余组合
  709. }
  710. if (cbCardCount>=3)
  711. {
  712. for (BYTE i=0;i<MAX_INDEX;i++)
  713. {
  714. //同牌判断
  715. if (cbMagicCardIndex[i]+cbMagicCardCount>=3)
  716. {
  717. ASSERT( cbKindItemCount < CountArray(KindItem) );
  718. KindItem[cbKindItemCount].cbCardIndex[0]=i;
  719. KindItem[cbKindItemCount].cbCardIndex[1]=i;
  720. KindItem[cbKindItemCount].cbCardIndex[2]=i;
  721. KindItem[cbKindItemCount].cbWeaveKind=WIK_PENG;
  722. KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
  723. KindItem[cbKindItemCount].cbValidIndex[0] = cbMagicCardIndex[i]>0?i:m_cbMagicIndex;
  724. KindItem[cbKindItemCount].cbValidIndex[1] = cbMagicCardIndex[i]>1?i:m_cbMagicIndex;
  725. KindItem[cbKindItemCount].cbValidIndex[2] = cbMagicCardIndex[i]>2?i:m_cbMagicIndex;
  726. cbKindItemCount++;
  727. if(cbMagicCardIndex[i]+cbMagicCardCount>=6)
  728. {
  729. ASSERT( cbKindItemCount < CountArray(KindItem) );
  730. KindItem[cbKindItemCount].cbCardIndex[0]=i;
  731. KindItem[cbKindItemCount].cbCardIndex[1]=i;
  732. KindItem[cbKindItemCount].cbCardIndex[2]=i;
  733. KindItem[cbKindItemCount].cbWeaveKind=WIK_PENG;
  734. KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
  735. KindItem[cbKindItemCount].cbValidIndex[0] = cbMagicCardIndex[i]>3?i:m_cbMagicIndex;
  736. KindItem[cbKindItemCount].cbValidIndex[1] = m_cbMagicIndex;
  737. KindItem[cbKindItemCount].cbValidIndex[2] = m_cbMagicIndex;
  738. cbKindItemCount++;
  739. }
  740. }
  741. //连牌判断
  742. if ((i<(MAX_INDEX-9))&&((i%9)<7))
  743. {
  744. //只要财神牌数加上3个顺序索引的牌数大于等于3,则进行组合
  745. if( cbMagicCardCount+cbMagicCardIndex[i]+cbMagicCardIndex[i+1]+cbMagicCardIndex[i+2] >= 3 )
  746. {
  747. BYTE cbIndex[3] = { i==m_cbMagicIndex?0:cbMagicCardIndex[i],(i+1)==m_cbMagicIndex?0:cbMagicCardIndex[i+1],
  748. (i+2)==m_cbMagicIndex?0:cbMagicCardIndex[i+2] };
  749. int nMagicCountTemp = cbMagicCardCount;
  750. BYTE cbValidIndex[3];
  751. while( nMagicCountTemp+cbIndex[0]+cbIndex[1]+cbIndex[2] >= 3 )
  752. {
  753. for( BYTE j = 0; j < CountArray(cbIndex); j++ )
  754. {
  755. if( cbIndex[j] > 0 )
  756. {
  757. cbIndex[j]--;
  758. cbValidIndex[j] = i+j;
  759. }
  760. else
  761. {
  762. nMagicCountTemp--;
  763. cbValidIndex[j] = m_cbMagicIndex;
  764. }
  765. }
  766. if( nMagicCountTemp >= 0 )
  767. {
  768. ASSERT( cbKindItemCount < CountArray(KindItem) );
  769. KindItem[cbKindItemCount].cbCardIndex[0]=i;
  770. KindItem[cbKindItemCount].cbCardIndex[1]=i+1;
  771. KindItem[cbKindItemCount].cbCardIndex[2]=i+2;
  772. KindItem[cbKindItemCount].cbWeaveKind=WIK_LEFT;
  773. KindItem[cbKindItemCount].cbCenterCard=SwitchToCardData(i);
  774. CopyMemory( KindItem[cbKindItemCount].cbValidIndex,cbValidIndex,sizeof(cbValidIndex) );
  775. cbKindItemCount++;
  776. }
  777. else break;
  778. }
  779. }
  780. }
  781. }
  782. }
  783. //组合分析
  784. if (cbKindItemCount>=cbLessKindItem)
  785. {
  786. //变量定义
  787. BYTE cbCardIndexTemp[MAX_INDEX];
  788. ZeroMemory(cbCardIndexTemp,sizeof(cbCardIndexTemp));
  789. //变量定义
  790. BYTE cbIndex[4]={0,1,2,3};
  791. tagKindItem * pKindItem[4];
  792. ZeroMemory(&pKindItem,sizeof(pKindItem));
  793. //开始组合
  794. do
  795. {
  796. //设置变量
  797. CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  798. for (BYTE i=0;i<cbLessKindItem;i++)
  799. pKindItem[i]=&KindItem[cbIndex[i]];
  800. //数量判断
  801. bool bEnoughCard=true;
  802. for (BYTE i=0;i<cbLessKindItem*3;i++)
  803. {
  804. //存在判断
  805. BYTE cbCardIndex=pKindItem[i/3]->cbValidIndex[i%3];
  806. if (cbCardIndexTemp[cbCardIndex]==0)
  807. {
  808. bEnoughCard=false;
  809. break;
  810. }
  811. else
  812. cbCardIndexTemp[cbCardIndex]--;
  813. }
  814. //胡牌判断
  815. if (bEnoughCard==true)
  816. {
  817. //牌眼判断
  818. BYTE cbCardEye=0;
  819. bool bMagicEye = false;
  820. for (BYTE i=0;i<MAX_INDEX;i++)
  821. {
  822. if (cbCardIndexTemp[i]==2)
  823. {
  824. cbCardEye=SwitchToCardData(i);
  825. if( i == m_cbMagicIndex ) bMagicEye = true;
  826. break;
  827. }
  828. else if( i!=m_cbMagicIndex &&
  829. m_cbMagicIndex != MAX_INDEX && cbCardIndexTemp[i]+cbCardIndexTemp[m_cbMagicIndex]==2 )
  830. {
  831. cbCardEye = SwitchToCardData(i);
  832. bMagicEye = true;
  833. }
  834. }
  835. //组合类型
  836. if (cbCardEye!=0)
  837. {
  838. //变量定义
  839. tagAnalyseItem AnalyseItem;
  840. ZeroMemory(&AnalyseItem,sizeof(AnalyseItem));
  841. //设置组合
  842. for (BYTE i=0;i<cbWeaveCount;i++)
  843. {
  844. AnalyseItem.cbWeaveKind[i]=WeaveItem[i].cbWeaveKind;
  845. AnalyseItem.cbCenterCard[i]=WeaveItem[i].cbCenterCard;
  846. GetWeaveCard( WeaveItem[i].cbWeaveKind,WeaveItem[i].cbCenterCard,
  847. AnalyseItem.cbCardData[i] );
  848. }
  849. //设置牌型
  850. for (BYTE i=0;i<cbLessKindItem;i++)
  851. {
  852. AnalyseItem.cbWeaveKind[i+cbWeaveCount]=pKindItem[i]->cbWeaveKind;
  853. AnalyseItem.cbCenterCard[i+cbWeaveCount]=pKindItem[i]->cbCenterCard;
  854. AnalyseItem.cbCardData[cbWeaveCount+i][0] = SwitchToCardData(pKindItem[i]->cbValidIndex[0]);
  855. AnalyseItem.cbCardData[cbWeaveCount+i][1] = SwitchToCardData(pKindItem[i]->cbValidIndex[1]);
  856. AnalyseItem.cbCardData[cbWeaveCount+i][2] = SwitchToCardData(pKindItem[i]->cbValidIndex[2]);
  857. }
  858. //设置牌眼
  859. AnalyseItem.cbCardEye=cbCardEye;
  860. AnalyseItem.bMagicEye = bMagicEye;
  861. //插入结果
  862. AnalyseItemArray.Add(AnalyseItem);
  863. }
  864. }
  865. //设置索引
  866. if (cbIndex[cbLessKindItem-1]==(cbKindItemCount-1))
  867. {
  868. BYTE i=cbLessKindItem-1;
  869. for (;i>0;i--)
  870. {
  871. if ((cbIndex[i-1]+1)!=cbIndex[i])
  872. {
  873. BYTE cbNewIndex=cbIndex[i-1];
  874. for (BYTE j=(i-1);j<cbLessKindItem;j++)
  875. cbIndex[j]=cbNewIndex+j-i+2;
  876. break;
  877. }
  878. }
  879. if (i==0)
  880. break;
  881. }
  882. else
  883. cbIndex[cbLessKindItem-1]++;
  884. } while (true);
  885. }
  886. return (AnalyseItemArray.GetCount()>0);
  887. }
  888. //钻牌
  889. bool CGameLogic::IsMagicCard( BYTE cbCardData )
  890. {
  891. if( m_cbMagicIndex != MAX_INDEX )
  892. return SwitchToCardIndex(cbCardData) == m_cbMagicIndex;
  893. return false;
  894. }
  895. //排序,根据牌值排序
  896. bool CGameLogic::SortCardList( BYTE cbCardData[MAX_COUNT], BYTE cbCardCount )
  897. {
  898. //数目过虑
  899. if (cbCardCount==0||cbCardCount>MAX_COUNT) return false;
  900. //排序操作
  901. bool bSorted=true;
  902. BYTE cbSwitchData=0,cbLast=cbCardCount-1;
  903. do
  904. {
  905. bSorted=true;
  906. for (BYTE i=0;i<cbLast;i++)
  907. {
  908. if (cbCardData[i]>cbCardData[i+1])
  909. {
  910. //设置标志
  911. bSorted=false;
  912. //扑克数据
  913. cbSwitchData=cbCardData[i];
  914. cbCardData[i]=cbCardData[i+1];
  915. cbCardData[i+1]=cbSwitchData;
  916. }
  917. }
  918. cbLast--;
  919. } while(bSorted==false);
  920. return true;
  921. }
  922. /*
  923. // 胡法分析函数
  924. */
  925. //大对子
  926. bool CGameLogic::IsPengPeng( const tagAnalyseItem *pAnalyseItem )
  927. {
  928. for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
  929. {
  930. if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
  931. return false;
  932. }
  933. return true;
  934. }
  935. //清一色牌
  936. bool CGameLogic::IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount,const BYTE cbCurrentCard)
  937. {
  938. //胡牌判断
  939. BYTE cbCardColor=0xFF;
  940. for (BYTE i=0;i<MAX_INDEX;i++)
  941. {
  942. if(i==m_cbMagicIndex) continue;
  943. if (cbCardIndex[i]!=0)
  944. {
  945. //花色判断
  946. if (cbCardColor!=0xFF)
  947. return false;
  948. //设置花色
  949. cbCardColor=(SwitchToCardData(i)&MASK_COLOR);
  950. //设置索引
  951. i=(i/9+1)*9-1;
  952. }
  953. }
  954. //如果手上只有王霸
  955. if( cbCardColor == 0xFF )
  956. {
  957. ASSERT( m_cbMagicIndex != MAX_INDEX && cbCardIndex[m_cbMagicIndex] > 0 );
  958. //检查组合
  959. ASSERT( cbItemCount > 0 );
  960. cbCardColor = WeaveItem[0].cbCenterCard&MASK_COLOR;
  961. }
  962. if((cbCurrentCard&MASK_COLOR)!=cbCardColor && !IsMagicCard(cbCurrentCard) ) return false;
  963. //组合判断
  964. for (BYTE i=0;i<cbItemCount;i++)
  965. {
  966. BYTE cbCenterCard=WeaveItem[i].cbCenterCard;
  967. if ((cbCenterCard&MASK_COLOR)!=cbCardColor) return false;
  968. }
  969. return true;
  970. }
  971. //七小对牌
  972. bool CGameLogic::IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount,const BYTE cbCurrentCard)
  973. {
  974. //组合判断
  975. if (cbWeaveCount!=0) return false;
  976. //单牌数目
  977. BYTE cbReplaceCount = 0;
  978. //临时数据
  979. BYTE cbCardIndexTemp[MAX_INDEX];
  980. CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  981. //插入数据
  982. BYTE cbCurrentIndex = SwitchToCardIndex(cbCurrentCard);
  983. cbCardIndexTemp[cbCurrentIndex]++;
  984. //计算单牌
  985. for (BYTE i=0;i<MAX_INDEX;i++)
  986. {
  987. BYTE cbCardCount=cbCardIndexTemp[i];
  988. //王牌过滤
  989. if( i == m_cbMagicIndex ) continue;
  990. //单牌统计
  991. if( cbCardCount == 1 || cbCardCount == 3 ) cbReplaceCount++;
  992. }
  993. //王牌不够
  994. if( m_cbMagicIndex != MAX_INDEX && cbReplaceCount > cbCardIndexTemp[m_cbMagicIndex] ||
  995. m_cbMagicIndex == MAX_INDEX && cbReplaceCount > 0 )
  996. return false;
  997. return true;
  998. }
  999. //带幺
  1000. bool CGameLogic::IsDaiYao( const tagAnalyseItem *pAnalyseItem )
  1001. {
  1002. //检查牌眼
  1003. BYTE cbCardValue = pAnalyseItem->cbCardEye&MASK_VALUE;
  1004. if( cbCardValue != 1 && cbCardValue != 9 ) return false;
  1005. for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
  1006. {
  1007. if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
  1008. {
  1009. BYTE j = 0;
  1010. for( ; j < 3; j++ )
  1011. {
  1012. cbCardValue = pAnalyseItem->cbCardData[i][j]&MASK_VALUE;
  1013. if( cbCardValue == 1 || cbCardValue == 9 ) break;
  1014. }
  1015. if( j == 3 ) return false;
  1016. }
  1017. else
  1018. {
  1019. cbCardValue = pAnalyseItem->cbCenterCard[i]&MASK_VALUE;
  1020. if( cbCardValue != 1 && cbCardValue != 9 ) return false;
  1021. }
  1022. }
  1023. return true;
  1024. }
  1025. //将对
  1026. bool CGameLogic::IsJiangDui( const tagAnalyseItem *pAnalyseItem )
  1027. {
  1028. //是否大对子
  1029. if( !IsPengPeng(pAnalyseItem) ) return false;
  1030. //检查牌眼
  1031. BYTE cbCardValue = pAnalyseItem->cbCardEye&MASK_VALUE;
  1032. if( cbCardValue != 2 && cbCardValue != 5 && cbCardValue != 8 ) return false;
  1033. for( BYTE i = 0; i < CountArray(pAnalyseItem->cbWeaveKind); i++ )
  1034. {
  1035. if( pAnalyseItem->cbWeaveKind[i]&(WIK_LEFT|WIK_CENTER|WIK_RIGHT) )
  1036. {
  1037. BYTE j = 0;
  1038. for( ; j < 3; j++ )
  1039. {
  1040. cbCardValue = pAnalyseItem->cbCardData[i][j]&MASK_VALUE;
  1041. if( cbCardValue == 2 || cbCardValue == 5 || cbCardValue == 8 ) break;
  1042. }
  1043. if( j == 3 ) return false;
  1044. }
  1045. else
  1046. {
  1047. cbCardValue = pAnalyseItem->cbCenterCard[i]&MASK_VALUE;
  1048. if( cbCardValue != 2 && cbCardValue != 5 && cbCardValue != 8 ) return false;
  1049. }
  1050. }
  1051. return true;
  1052. }
  1053. //是否花猪
  1054. bool CGameLogic::IsHuaZhu( const BYTE cbCardIndex[], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE bDingQueHuase)
  1055. {
  1056. BYTE cbColor[3] = { 0,0,0 };
  1057. for( BYTE i = 0; i < MAX_INDEX; i++ )
  1058. {
  1059. if( cbCardIndex[i] > 0 )
  1060. {
  1061. BYTE cbCardColor = SwitchToCardData(i)&MASK_COLOR;
  1062. cbColor[cbCardColor>>4]++;
  1063. i = (i/9+1)*9-1;
  1064. }
  1065. }
  1066. for( BYTE i = 0; i < cbWeaveCount; i++ )
  1067. {
  1068. BYTE cbCardColor = WeaveItem[i].cbCenterCard&MASK_COLOR;
  1069. cbColor[cbCardColor>>4]++;
  1070. }
  1071. //缺一门就不是花猪
  1072. for( BYTE i = 0; i < CountArray(cbColor); i++ )
  1073. if( cbColor[i] == 0 ) return false;
  1074. if (INVALID_BYTE!= bDingQueHuase && 0 != cbColor[bDingQueHuase])
  1075. return false;
  1076. return true;
  1077. }
  1078. //////////////////////////////////////////////////////////////////////////