诸暨麻将添加redis
您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字
 
 
 
 
 
 

1194 行
31 KiB

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