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

3085 行
85 KiB

  1. #include "StdAfx.h"
  2. #include "GameLogicZhiPai.h"
  3. #include "math.h"
  4. #include "TableFrameSinkZhiPai.h"
  5. #include "fstream"
  6. //////////////////////////////////////////////////////////////////////////
  7. //////////////////////////////////////////////////////////////////////////
  8. //静态变量
  9. //麻将数据
  10. BYTE const CGameLogicZhiPai::m_cbCardDataArray_HUA[MAX_REPERTORY_HUA] =
  11. {
  12. 0x01, 0x01, 0x01, 0x11, 0x11, //一
  13. 0x02, 0x02, 0x02, 0x02, 0x02, //二
  14. 0x03, 0x03, 0x03, 0x13, 0x13, //三
  15. 0x04, 0x04, 0x04, 0x04, 0x04, //四
  16. 0x05, 0x05, 0x05, 0x15, 0x15, //五
  17. 0x06, 0x06, 0x06, 0x06, 0x06, //六
  18. 0x07, 0x07, 0x07, 0x17, 0x17, //七
  19. 0x08, 0x08, 0x08, 0x08, 0x08, //八
  20. 0x09, 0x09, 0x09, 0x19, 0x19, //九
  21. 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, //十
  22. 0x21, 0x21, 0x21, 0x21, 0x21, //孔
  23. 0x22, 0x22, 0x22, 0x22, 0x22, //己
  24. 0x23, 0x23, 0x23, 0x23, 0x23, //上
  25. 0x24, 0x24, 0x24, 0x24, 0x24, //大
  26. 0x25, 0x25, 0x25, 0x25, 0x25, //人
  27. 0x26, 0x26, 0x26, 0x26, 0x26, //土
  28. 0x27, 0x27, 0x27, 0x27, 0x27, //化
  29. 0x28, 0x28, 0x28, 0x28, 0x28, //千
  30. 0x29, 0x29, 0x29, 0x29, 0x29, //可
  31. 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, //知
  32. 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, //礼
  33. 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, //子
  34. };
  35. BYTE const CGameLogicZhiPai::m_cbCardDataArray_HUA_One[MAX_REPERTORY_HUA_ONE] =
  36. {
  37. 0x01, 0x01, 0x01, 0x11, 0x11, //一
  38. 0x02, 0x02, 0x02, 0x02, 0x02, //二
  39. 0x03, 0x03, 0x03, 0x13, 0x13, //三
  40. 0x04, 0x04, 0x04, 0x04, 0x04, //四
  41. 0x05, 0x05, 0x05, 0x15, 0x15, //五
  42. 0x06, 0x06, 0x06, 0x06, 0x06, //六
  43. 0x07, 0x07, 0x07, 0x17, 0x17, //七
  44. 0x08, 0x08, 0x08, 0x08, 0x08, //八
  45. 0x09, 0x09, 0x09, 0x19, 0x19, //九
  46. 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, //十
  47. 0x21, 0x21, 0x21, 0x21, 0x21, //孔
  48. 0x22, 0x22, 0x22, 0x22, 0x22, //己
  49. 0x23, 0x23, 0x23, 0x23, 0x23, //上
  50. 0x24, 0x24, 0x24, 0x24, 0x24, //大
  51. 0x25, 0x25, 0x25, 0x25, 0x25, //人
  52. 0x26, 0x26, 0x26, 0x26, 0x26, //土
  53. 0x27, 0x27, 0x27, 0x27, 0x27, //化
  54. 0x28, 0x28, 0x28, 0x28, 0x28, //千
  55. 0x29, 0x29, 0x29, 0x29, 0x29, //可
  56. 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, //知
  57. 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, //礼
  58. 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, //子
  59. 0x2D, //别杠
  60. };
  61. BYTE const CGameLogicZhiPai::m_cbCardDataArray_HUA_Two[MAX_REPERTORY_HUA_TWO] =
  62. {
  63. 0x01, 0x01, 0x01, 0x11, 0x11, //一
  64. 0x02, 0x02, 0x02, 0x02, 0x02, //二
  65. 0x03, 0x03, 0x03, 0x13, 0x13, //三
  66. 0x04, 0x04, 0x04, 0x04, 0x04, //四
  67. 0x05, 0x05, 0x05, 0x15, 0x15, //五
  68. 0x06, 0x06, 0x06, 0x06, 0x06, //六
  69. 0x07, 0x07, 0x07, 0x17, 0x17, //七
  70. 0x08, 0x08, 0x08, 0x08, 0x08, //八
  71. 0x09, 0x09, 0x09, 0x19, 0x19, //九
  72. 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, //十
  73. 0x21, 0x21, 0x21, 0x21, 0x21, //孔
  74. 0x22, 0x22, 0x22, 0x22, 0x22, //己
  75. 0x23, 0x23, 0x23, 0x23, 0x23, //上
  76. 0x24, 0x24, 0x24, 0x24, 0x24, //大
  77. 0x25, 0x25, 0x25, 0x25, 0x25, //人
  78. 0x26, 0x26, 0x26, 0x26, 0x26, //土
  79. 0x27, 0x27, 0x27, 0x27, 0x27, //化
  80. 0x28, 0x28, 0x28, 0x28, 0x28, //千
  81. 0x29, 0x29, 0x29, 0x29, 0x29, //可
  82. 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, //知
  83. 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, //礼
  84. 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, //子
  85. 0x2D, 0x2D, //别杠
  86. };
  87. //////////////////////////////////////////////////////////////////////////
  88. //构造函数
  89. CGameLogicZhiPai::CGameLogicZhiPai(TableFrameSinkZhiPai* pTableFramSink)
  90. {
  91. m_pTableFramSink = pTableFramSink;
  92. m_cbMagicIndex = MAX_INDEX_HUA;
  93. }
  94. //析构函数
  95. CGameLogicZhiPai::~CGameLogicZhiPai()
  96. {
  97. }
  98. //混乱扑克
  99. BYTE CGameLogicZhiPai::RandCardData(BYTE cbCardData[],BYTE bGameType)
  100. {
  101. if (bGameType == 14)
  102. {
  103. BYTE cbCardDataTemp[MAX_REPERTORY_HUA_TWO];
  104. BYTE cbMaxCount = 0;
  105. CopyMemory(cbCardDataTemp, m_cbCardDataArray_HUA_Two, sizeof(m_cbCardDataArray_HUA_Two));
  106. cbMaxCount = MAX_REPERTORY_HUA_TWO;
  107. //}
  108. //混乱扑克
  109. BYTE cbRandCount = 0, cbPosition = 0;
  110. do
  111. {
  112. cbPosition = rand() % (cbMaxCount - cbRandCount);
  113. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  114. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  115. } while (cbRandCount < cbMaxCount);
  116. cbRandCount = 0, cbPosition = 0;
  117. ZeroMemory(cbCardDataTemp, sizeof(cbCardDataTemp));
  118. CopyMemory(cbCardDataTemp, cbCardData, sizeof(cbCardDataTemp));
  119. ZeroMemory(cbCardData, sizeof(cbCardData));
  120. do
  121. {
  122. cbPosition = rand() % (cbMaxCount - cbRandCount);
  123. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  124. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  125. } while (cbRandCount < cbMaxCount);
  126. return cbMaxCount;
  127. }
  128. else if (bGameType == 15)
  129. {
  130. BYTE cbCardDataTemp[MAX_REPERTORY_HUA_ONE];
  131. BYTE cbMaxCount = 0;
  132. CopyMemory(cbCardDataTemp, m_cbCardDataArray_HUA_One, sizeof(m_cbCardDataArray_HUA_One));
  133. cbMaxCount = MAX_REPERTORY_HUA_ONE;
  134. //}
  135. //混乱扑克
  136. BYTE cbRandCount = 0, cbPosition = 0;
  137. do
  138. {
  139. cbPosition = rand() % (cbMaxCount - cbRandCount);
  140. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  141. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  142. } while (cbRandCount < cbMaxCount);
  143. cbRandCount = 0, cbPosition = 0;
  144. ZeroMemory(cbCardDataTemp, sizeof(cbCardDataTemp));
  145. CopyMemory(cbCardDataTemp, cbCardData, sizeof(cbCardDataTemp));
  146. ZeroMemory(cbCardData, sizeof(cbCardData));
  147. do
  148. {
  149. cbPosition = rand() % (cbMaxCount - cbRandCount);
  150. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  151. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  152. } while (cbRandCount < cbMaxCount);
  153. return cbMaxCount;
  154. }
  155. else
  156. {
  157. BYTE cbCardDataTemp[MAX_REPERTORY_HUA];
  158. BYTE cbMaxCount = 0;
  159. CopyMemory(cbCardDataTemp, m_cbCardDataArray_HUA, sizeof(m_cbCardDataArray_HUA));
  160. cbMaxCount = MAX_REPERTORY_HUA;
  161. //}
  162. //混乱扑克
  163. BYTE cbRandCount = 0, cbPosition = 0;
  164. do
  165. {
  166. cbPosition = rand() % (cbMaxCount - cbRandCount);
  167. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  168. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  169. } while (cbRandCount < cbMaxCount);
  170. cbRandCount = 0, cbPosition = 0;
  171. ZeroMemory(cbCardDataTemp, sizeof(cbCardDataTemp));
  172. CopyMemory(cbCardDataTemp, cbCardData, sizeof(cbCardDataTemp));
  173. ZeroMemory(cbCardData, sizeof(cbCardData));
  174. do
  175. {
  176. cbPosition = rand() % (cbMaxCount - cbRandCount);
  177. cbCardData[cbRandCount++] = cbCardDataTemp[cbPosition];
  178. cbCardDataTemp[cbPosition] = cbCardDataTemp[cbMaxCount - cbRandCount];
  179. } while (cbRandCount < cbMaxCount);
  180. return cbMaxCount;
  181. }
  182. }
  183. //删除扑克
  184. bool CGameLogicZhiPai::RemoveCard(BYTE cbCardIndex[MAX_INDEX_HUA], BYTE cbRemoveCard)
  185. {
  186. //效验扑克
  187. ASSERT(IsValidCard(cbRemoveCard));
  188. ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard)]>0);
  189. //删除扑克
  190. BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard);
  191. if (cbCardIndex[cbRemoveIndex]>0)
  192. {
  193. cbCardIndex[cbRemoveIndex]--;
  194. return true;
  195. }
  196. //失败效验
  197. ASSERT(FALSE);
  198. return false;
  199. }
  200. //删除扑克
  201. bool CGameLogicZhiPai::RemoveCard(BYTE cbCardIndex[MAX_INDEX], const BYTE cbRemoveCard[], BYTE cbRemoveCount)
  202. {
  203. //删除扑克
  204. for (BYTE i=0;i<cbRemoveCount;i++)
  205. {
  206. //效验扑克
  207. ASSERT(IsValidCard(cbRemoveCard[i]));
  208. ASSERT(cbCardIndex[SwitchToCardIndex(cbRemoveCard[i])]>0);
  209. //删除扑克
  210. BYTE cbRemoveIndex=SwitchToCardIndex(cbRemoveCard[i]);
  211. if (cbCardIndex[cbRemoveIndex]==0)
  212. {
  213. //错误断言
  214. ASSERT(FALSE);
  215. //还原删除
  216. for (BYTE j=0;j<i;j++)
  217. {
  218. ASSERT(IsValidCard(cbRemoveCard[j]));
  219. cbCardIndex[SwitchToCardIndex(cbRemoveCard[j])]++;
  220. }
  221. return false;
  222. }
  223. else
  224. {
  225. //删除扑克
  226. --cbCardIndex[cbRemoveIndex];
  227. }
  228. }
  229. return true;
  230. }
  231. //删除扑克
  232. bool CGameLogicZhiPai::RemoveCard(BYTE cbCardData[], BYTE cbCardCount, const BYTE cbRemoveCard[], BYTE cbRemoveCount)
  233. {
  234. //检验数据
  235. ASSERT(cbCardCount<=14);
  236. ASSERT(cbRemoveCount<=cbCardCount);
  237. //定义变量
  238. BYTE cbDeleteCount=0,cbTempCardData[14];
  239. if (cbCardCount>CountArray(cbTempCardData))
  240. return false;
  241. CopyMemory(cbTempCardData,cbCardData,cbCardCount*sizeof(cbCardData[0]));
  242. //置零扑克
  243. for (BYTE i=0;i<cbRemoveCount;i++)
  244. {
  245. for (BYTE j=0;j<cbCardCount;j++)
  246. {
  247. if (cbRemoveCard[i]==cbTempCardData[j])
  248. {
  249. cbDeleteCount++;
  250. cbTempCardData[j]=0;
  251. break;
  252. }
  253. }
  254. }
  255. //成功判断
  256. if (cbDeleteCount!=cbRemoveCount)
  257. {
  258. ASSERT(FALSE);
  259. return false;
  260. }
  261. //清理扑克
  262. BYTE cbCardPos=0;
  263. for (BYTE i=0;i<cbCardCount;i++)
  264. {
  265. if (cbTempCardData[i]!=0)
  266. cbCardData[cbCardPos++]=cbTempCardData[i];
  267. }
  268. return true;
  269. }
  270. //有效判断
  271. bool CGameLogicZhiPai::IsValidCard(BYTE cbCardData)
  272. {
  273. BYTE cbValue = (cbCardData&MASK_VALUE);
  274. BYTE cbColor = (cbCardData&MASK_COLOR) >> 4;
  275. //如果颜色是0||1,牌值必须是0--A(10)
  276. //如果颜色是2,牌值必须是0--C(12)
  277. return (((cbColor == 0 || cbColor == 1) && (cbValue>0 && cbValue <= 10)) || ((cbColor == 2) && (cbValue >= 1 && cbValue <= 13)));
  278. }
  279. //扑克数目
  280. BYTE CGameLogicZhiPai::GetCardCount(const BYTE cbCardIndex[MAX_INDEX_HUA])
  281. {
  282. //数目统计
  283. BYTE cbCardCount = 0;
  284. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  285. cbCardCount += cbCardIndex[i];
  286. return cbCardCount;
  287. }
  288. //获取组合
  289. //BYTE CGameLogicZhiPai::GetWeaveCard(int cbWeaveKind, BYTE cbCenterCard, BYTE cbCardBuffer[4])
  290. //{
  291. // //组合扑克
  292. // switch (cbWeaveKind)
  293. // {
  294. // case WIK_LEFT: //上牌操作
  295. // {
  296. // //设置变量
  297. // cbCardBuffer[0] = cbCenterCard;
  298. // cbCardBuffer[1] = cbCenterCard + 1;
  299. // cbCardBuffer[2] = cbCenterCard + 2;
  300. //
  301. // return 3;
  302. // }
  303. // case WIK_RIGHT: //上牌操作
  304. // {
  305. // //设置变量
  306. // cbCardBuffer[0] = cbCenterCard;
  307. // cbCardBuffer[1] = cbCenterCard - 1;
  308. // cbCardBuffer[2] = cbCenterCard - 2;
  309. //
  310. // return 3;
  311. // }
  312. // case WIK_CENTER: //上牌操作
  313. // {
  314. // //设置变量
  315. // cbCardBuffer[0] = cbCenterCard;
  316. // cbCardBuffer[1] = cbCenterCard - 1;
  317. // cbCardBuffer[2] = cbCenterCard + 1;
  318. //
  319. // return 3;
  320. // }
  321. // case WIK_PENG: //碰牌操作
  322. // {
  323. // //设置变量
  324. // cbCardBuffer[0] = cbCenterCard;
  325. // cbCardBuffer[1] = cbCenterCard;
  326. // cbCardBuffer[2] = cbCenterCard;
  327. //
  328. // return 3;
  329. // }
  330. // case WIK_MING_GANG:
  331. // case WIK_AN_GANG:
  332. // case WIK_BU_GANG:
  333. // {
  334. // //设置变量
  335. // cbCardBuffer[0] = cbCenterCard;
  336. // cbCardBuffer[1] = cbCenterCard;
  337. // cbCardBuffer[2] = cbCenterCard;
  338. // cbCardBuffer[3] = cbCenterCard;
  339. //
  340. // return 4;
  341. // }
  342. // default:
  343. // {
  344. // ASSERT(FALSE);
  345. // }
  346. // }
  347. // return 0;
  348. //}
  349. //动作等级,只有碰,杠
  350. BYTE CGameLogicZhiPai::GetUserActionRank(int cbUserAction)
  351. {
  352. //胡牌等级
  353. if (cbUserAction&WIK_CHI_HU) { return 5; }
  354. //招等级
  355. if (cbUserAction&WIK_SAN_ZHAO) { return 3; }
  356. //对等级
  357. if (cbUserAction&WIK_DUI) { return 2; }
  358. return 0;
  359. }
  360. //吃牌判断
  361. //int CGameLogicZhiPai::EstimateEatCard(const BYTE cbCardIndex[MAX_INDEX], BYTE cbCurrentCard)
  362. //{
  363. // //参数效验
  364. // ASSERT(IsValidCard(cbCurrentCard));
  365. //
  366. // //变量定义
  367. // BYTE cbExcursion[3] = { 0, 1, 2 };
  368. // BYTE cbItemKind[3] = { WIK_LEFT, WIK_CENTER, WIK_RIGHT };
  369. //
  370. // //吃牌判断
  371. // BYTE cbEatKind = 0, cbFirstIndex = 0;
  372. // BYTE cbCurrentIndex = SwitchToCardIndex(cbCurrentCard);
  373. // for (BYTE i = 0; i < CountArray(cbItemKind); i++)
  374. // {
  375. // BYTE cbValueIndex = cbCurrentIndex % 9;
  376. // if ((cbValueIndex >= cbExcursion[i]) && ((cbValueIndex - cbExcursion[i]) <= 6))
  377. // {
  378. // //吃牌判断
  379. // cbFirstIndex = cbCurrentIndex - cbExcursion[i];
  380. //
  381. // //吃牌不能包含有王霸
  382. // if (m_cbMagicIndex != MAX_INDEX &&
  383. // m_cbMagicIndex >= cbFirstIndex && m_cbMagicIndex <= cbFirstIndex + 2) continue;
  384. //
  385. // if ((cbCurrentIndex != cbFirstIndex) && (cbCardIndex[cbFirstIndex] == 0))
  386. // continue;
  387. // if ((cbCurrentIndex != (cbFirstIndex + 1)) && (cbCardIndex[cbFirstIndex + 1] == 0))
  388. // continue;
  389. // if ((cbCurrentIndex != (cbFirstIndex + 2)) && (cbCardIndex[cbFirstIndex + 2] == 0))
  390. // continue;
  391. //
  392. // //设置类型
  393. // cbEatKind |= cbItemKind[i];
  394. // }
  395. // }
  396. // return cbEatKind;
  397. //}
  398. //碰牌判断
  399. int CGameLogicZhiPai::EstimatePengCard(const BYTE cbCardIndex[MAX_INDEX_HUA], BYTE cbCurrentCard)
  400. {
  401. //参数效验
  402. ASSERT(IsValidCard(cbCurrentCard));
  403. //碰牌判断
  404. BYTE TempIndex = SwitchToCardIndex(cbCurrentCard);
  405. return (cbCardIndex[TempIndex] >= 2) ? WIK_DUI : WIK_NULL;
  406. }
  407. //杠牌判断
  408. int CGameLogicZhiPai::EstimateGangCard(const BYTE cbCardIndex[MAX_INDEX_HUA], BYTE cbCurrentCard, const tagWeaveItem_Hua WeaveItem[], BYTE cbWeaveCount)
  409. {
  410. ASSERT(IsValidCard(cbCurrentCard));
  411. int actionMask = WIK_NULL;
  412. BYTE index = SwitchToCardIndex(cbCurrentCard);
  413. BYTE zhi = cbCardIndex[index];
  414. //杠牌判断
  415. if (zhi >= 3)
  416. {
  417. actionMask |= WIK_SAN_ZHAO;
  418. }
  419. if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  420. {
  421. for (BYTE i = 0; i < cbWeaveCount; i++)
  422. {
  423. if (WeaveItem[i].cbWeaveKind == WIK_SI_TONG && (SwitchToCardIndex(WeaveItem[i].cbCenterCard) == index) && WeaveItem[i].cbMargicOffset[2] == 0)
  424. {
  425. actionMask |= WIK_SI_ZHAO;
  426. }
  427. }
  428. }
  429. else
  430. {
  431. for (BYTE i = 0; i < cbWeaveCount; i++)
  432. {
  433. if (WeaveItem[i].cbWeaveKind == WIK_SI_TONG && WeaveItem[i].cbCenterCard == cbCurrentCard && WeaveItem[i].cbMargicOffset[2] == 0)
  434. {
  435. actionMask |= WIK_SI_ZHAO;
  436. }
  437. }
  438. }
  439. return actionMask;
  440. }
  441. //是否胡牌
  442. //bool CGameLogicZhiPai::IsHuCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE cbCurrentCard)
  443. //{
  444. // ASSERT(IsValidCard(cbCurrentCard));
  445. //
  446. // BYTE cbCardIndexTemp[MAX_INDEX];
  447. // CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  448. // cbCardIndexTemp[SwitchToCardIndex(cbCurrentCard)]++;
  449. //
  450. // //不符合硬胡规则的牌型
  451. // if (IsQiXiaoDui(cbCardIndexTemp, WeaveItem, cbWeaveCount))
  452. // {
  453. // return true;
  454. // }
  455. // if (IsJiangJiang(cbCardIndexTemp, WeaveItem, cbWeaveCount))
  456. // {
  457. // return true;
  458. // }
  459. //
  460. // CAnalyseItemArray AnalyseItemArray;
  461. // if (1)//(AnalyseCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, AnalyseItemArray))
  462. // {
  463. // //符合硬胡规则牌型,将可以不是 2,5,8
  464. // if (IsQingYiSe(cbCardIndexTemp, WeaveItem, cbWeaveCount))
  465. // return true;
  466. // if (IsPengPeng(cbCardIndexTemp, WeaveItem, cbWeaveCount))
  467. // return true;
  468. // if (IsQuanQiuRen(cbCardIndexTemp, WeaveItem, cbWeaveCount))
  469. // return true;
  470. // //符合硬胡规则牌型,将必须是 2,5,8
  471. // for (BYTE i = 0; i < AnalyseItemArray.GetCount(); i++)
  472. // {
  473. // tagAnalyseItem& tagItem = AnalyseItemArray.GetAt(i);
  474. // BYTE cbCardData = tagItem.cbCardEye&MASK_VALUE;
  475. // if (cbCardData == 0x02 || cbCardData == 0x05 || cbCardData == 0x08)
  476. // return true;
  477. // }
  478. // }
  479. // return false;
  480. //}
  481. //分析胡牌
  482. int CGameLogicZhiPai::AnalyseHuCard(const BYTE cbCardIndex[MAX_INDEX_HUA], const BYTE HuaCardInex[5], BYTE cbCurrentCard, const tagWeaveItem_Hua WeaveItem[], BYTE cbItemCount, const BYTE WeavHuaIndex[5], BYTE TongCount, tagHuCardResult & ChiHuResult)
  483. {
  484. CAnalyseItemArray_hua AnalyseItemArray;
  485. //设置变量
  486. AnalyseItemArray.RemoveAll();
  487. ZeroMemory(&ChiHuResult, sizeof(ChiHuResult));
  488. //定义临时数组保存手中牌索引
  489. BYTE cbCardIndexTemp[MAX_INDEX_HUA];
  490. CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  491. //定义变量保存手中花牌的个数
  492. BYTE cbTempHuaCardIndex[5];
  493. BYTE cbTempWeaveHuaIndex[5];
  494. //tagWeaveItem_Hua WeaveItem[8];//保存组合牌(自摸没有统,统会变成手牌,点炮有统)
  495. //BYTE cbItemCount = 0;
  496. CopyMemory(cbTempHuaCardIndex, HuaCardInex, sizeof(cbTempHuaCardIndex));
  497. CopyMemory(cbTempWeaveHuaIndex, WeavHuaIndex, sizeof(cbTempWeaveHuaIndex));//组合中含有的花牌(自摸没有统,统会变成手牌,点炮有统)
  498. //if (cbCurrentCard == 0)//表示这是自摸
  499. //{
  500. // HeBingCardIndex(cbCardIndexTemp, cbCardIndex_Tong, cbTempHuaCardIndex, HuaCardInex_Tong);
  501. // cbItemCount = cbItemCount_HuPai;
  502. // if (cbItemCount > 0)
  503. // {
  504. // CopyMemory(WeaveItem, WeaveItem_HuPai, sizeof(WeaveItem));
  505. // }
  506. // else
  507. // {
  508. // ZeroMemory(WeaveItem, sizeof(WeaveItem));
  509. // }
  510. //}
  511. //else//放炮
  512. //{
  513. // cbItemCount = cbItemCount_ChiHu;
  514. // if (cbItemCount > 0)
  515. // {
  516. // CopyMemory(WeaveItem, WeaveItem_ChiHu, sizeof(WeaveItem));
  517. // }
  518. // else
  519. // {
  520. // ZeroMemory(WeaveItem, sizeof(WeaveItem));
  521. // }
  522. //}
  523. //将当前牌加入手中牌索引数组中,0表示自摸,非零表示点炮
  524. if (cbCurrentCard != 0)
  525. {
  526. BYTE CardIndex = SwitchToCardIndex(cbCurrentCard);
  527. cbCardIndexTemp[CardIndex]++;
  528. //如果当前牌是花牌,保存到手中花牌索引数组中
  529. if ((cbCurrentCard & 0xF0) == 0x10) cbTempHuaCardIndex[CardIndex / 2]++;
  530. }
  531. //得到手中各经牌的个数
  532. BYTE cbHandGoldCard[3];
  533. for (BYTE i = 0; i<3; i++)
  534. {
  535. cbHandGoldCard[i] = cbCardIndexTemp[(i * 2) + 2];
  536. }
  537. BYTE LaiZi[3] = { 0 };//用来存别杠那个牌变成啥经了
  538. if (cbCardIndexTemp[22] == 0)
  539. {
  540. AnalyseItemArray.RemoveAll();
  541. AnalyseCard(cbCardIndexTemp, WeaveItem, cbItemCount, AnalyseItemArray);
  542. //对胡牌组合进行分析,得出最佳的胡牌组合
  543. if (AnalyseItemArray.GetCount()>0)
  544. {
  545. tagAnalyseItem_hua BestAnalyseItem;
  546. if (AnalyseCardHuNum(cbCardIndexTemp, cbCurrentCard, cbHandGoldCard, LaiZi, cbTempHuaCardIndex, cbTempWeaveHuaIndex, WeaveItem, cbItemCount, TongCount, AnalyseItemArray, BestAnalyseItem) >= 17)
  547. {
  548. ChiHuResult.IsHu = true;
  549. ChiHuResult.bHuPoint = BestAnalyseItem.cbPoint;
  550. ChiHuResult.bRealGold = BestAnalyseItem.cbGoldCard;
  551. CopyMemory(&ChiHuResult.AnalyseItem, &BestAnalyseItem, sizeof(tagAnalyseItem_hua));
  552. return WIK_ZI_MO;
  553. }
  554. }
  555. }
  556. else if (cbCardIndexTemp[22] == 1)
  557. {
  558. cbCardIndexTemp[22] = 0;
  559. tagAnalyseItem_hua MaxBestAnalyseItem;
  560. for (BYTE i = 0; i<3; i++)
  561. {
  562. cbHandGoldCard[i]++;
  563. cbCardIndexTemp[(i * 2) + 2]++;
  564. cbTempHuaCardIndex[i + 1]++;
  565. LaiZi[i] = 1;
  566. AnalyseItemArray.RemoveAll();
  567. AnalyseCard(cbCardIndexTemp, WeaveItem, cbItemCount, AnalyseItemArray);
  568. if (AnalyseItemArray.GetCount()>0)
  569. {
  570. tagAnalyseItem_hua BestAnalyseItem;
  571. if (AnalyseCardHuNum(cbCardIndexTemp, cbCurrentCard, cbHandGoldCard, LaiZi, cbTempHuaCardIndex, cbTempWeaveHuaIndex, WeaveItem, cbItemCount, TongCount, AnalyseItemArray, BestAnalyseItem) >= 17)
  572. {
  573. if (BestAnalyseItem.cbPoint > ChiHuResult.bHuPoint)
  574. {
  575. ChiHuResult.IsHu = true;
  576. ChiHuResult.bHuPoint = BestAnalyseItem.cbPoint;
  577. ChiHuResult.bRealGold = BestAnalyseItem.cbGoldCard;
  578. CopyMemory(&ChiHuResult.AnalyseItem, &BestAnalyseItem, sizeof(tagAnalyseItem_hua));
  579. }
  580. }
  581. }
  582. cbHandGoldCard[i]--;
  583. cbCardIndexTemp[(i * 2) + 2]--;
  584. cbTempHuaCardIndex[i + 1]--;
  585. LaiZi[i] = 0;
  586. }
  587. if (ChiHuResult.IsHu)
  588. {
  589. return WIK_ZI_MO;
  590. }
  591. }
  592. else
  593. {
  594. cbCardIndexTemp[22] = 0;
  595. for (BYTE i = 0; i<3; i++)
  596. {
  597. cbHandGoldCard[i]++;
  598. cbCardIndexTemp[(i * 2) + 2]++;
  599. cbTempHuaCardIndex[i + 1]++;
  600. LaiZi[i]++;
  601. for (BYTE j = 0; j < 3; j++)
  602. {
  603. cbHandGoldCard[j]++;
  604. cbCardIndexTemp[(j * 2) + 2]++;
  605. cbTempHuaCardIndex[j + 1]++;
  606. LaiZi[j]++;
  607. AnalyseItemArray.RemoveAll();
  608. AnalyseCard(cbCardIndexTemp, WeaveItem, cbItemCount, AnalyseItemArray);
  609. if (AnalyseItemArray.GetCount()>0)
  610. {
  611. tagAnalyseItem_hua BestAnalyseItem;
  612. if (AnalyseCardHuNum(cbCardIndexTemp, cbCurrentCard, cbHandGoldCard, LaiZi, cbTempHuaCardIndex, cbTempWeaveHuaIndex, WeaveItem, cbItemCount, TongCount, AnalyseItemArray, BestAnalyseItem) >= 17)
  613. {
  614. if (BestAnalyseItem.cbPoint > ChiHuResult.bHuPoint)
  615. {
  616. ChiHuResult.IsHu = true;
  617. ChiHuResult.bHuPoint = BestAnalyseItem.cbPoint;
  618. ChiHuResult.bRealGold = BestAnalyseItem.cbGoldCard;
  619. CopyMemory(&ChiHuResult.AnalyseItem, &BestAnalyseItem, sizeof(tagAnalyseItem_hua));
  620. }
  621. }
  622. }
  623. cbHandGoldCard[j]--;
  624. cbCardIndexTemp[(j * 2) + 2]--;
  625. cbTempHuaCardIndex[j + 1]--;
  626. LaiZi[j]--;
  627. }
  628. cbHandGoldCard[i]--;
  629. cbCardIndexTemp[(i * 2) + 2]--;
  630. cbTempHuaCardIndex[i + 1]--;
  631. LaiZi[i]--;
  632. }
  633. if (ChiHuResult.IsHu)
  634. {
  635. return WIK_ZI_MO;
  636. }
  637. }
  638. return WIK_NULL;
  639. }
  640. //
  641. //给定一个操作类型和操作中心牌索引,得到三张牌的索引,返回操作索引的个数
  642. BYTE CGameLogicZhiPai::GetWeaveIndex(BYTE cbWeaveKind, BYTE cbCenterCardIndex, BYTE cbCardIndex[])
  643. {
  644. //组合扑克
  645. switch (cbWeaveKind)
  646. {
  647. case WIK_DUI: //对牌操作
  648. {
  649. //设置变量
  650. cbCardIndex[0] = cbCenterCardIndex;
  651. cbCardIndex[1] = cbCenterCardIndex;
  652. cbCardIndex[2] = cbCenterCardIndex;
  653. return 3;
  654. }
  655. case WIK_QI_TA: //三连情况
  656. {
  657. //0--9之间的数字牌组合
  658. if (cbCenterCardIndex<(10 - 2))
  659. {
  660. cbCardIndex[0] = cbCenterCardIndex;
  661. cbCardIndex[1] = cbCenterCardIndex + 1;
  662. cbCardIndex[2] = cbCenterCardIndex + 2;
  663. }
  664. //孔乙已:孔
  665. if (cbCenterCardIndex == 10)
  666. {
  667. cbCardIndex[0] = cbCenterCardIndex;
  668. cbCardIndex[1] = 0;
  669. cbCardIndex[2] = cbCenterCardIndex + 1;
  670. }
  671. //上大人:上
  672. if (cbCenterCardIndex == 12)
  673. {
  674. cbCardIndex[0] = cbCenterCardIndex;
  675. cbCardIndex[1] = cbCenterCardIndex + 1;
  676. cbCardIndex[2] = cbCenterCardIndex + 2;
  677. }
  678. //七十土:土
  679. if (cbCenterCardIndex == 15)
  680. {
  681. cbCardIndex[0] = 6;
  682. cbCardIndex[1] = 9;
  683. cbCardIndex[2] = cbCenterCardIndex;
  684. }
  685. //化三千:化
  686. if (cbCenterCardIndex == 16)
  687. {
  688. cbCardIndex[0] = cbCenterCardIndex;
  689. cbCardIndex[1] = 2;
  690. cbCardIndex[2] = cbCenterCardIndex + 1;
  691. }
  692. //可知礼
  693. if (cbCenterCardIndex == 18)
  694. {
  695. cbCardIndex[0] = (cbCenterCardIndex);
  696. cbCardIndex[1] = (cbCenterCardIndex + 1);
  697. cbCardIndex[2] = (cbCenterCardIndex + 2);
  698. }
  699. //八九子
  700. if (cbCenterCardIndex == 21)
  701. {
  702. cbCardIndex[0] = (7);
  703. cbCardIndex[1] = (8);
  704. cbCardIndex[2] = (cbCenterCardIndex);
  705. }
  706. return 3;
  707. }
  708. case WIK_SI_ZHAO: //四招操作
  709. {
  710. //设置变量
  711. cbCardIndex[0] = cbCenterCardIndex;
  712. cbCardIndex[1] = cbCenterCardIndex;
  713. cbCardIndex[2] = cbCenterCardIndex;
  714. cbCardIndex[3] = cbCenterCardIndex;
  715. cbCardIndex[4] = cbCenterCardIndex;
  716. return 5;
  717. }
  718. case WIK_SAN_ZHAO: //三招操作
  719. {
  720. //设置变量
  721. cbCardIndex[0] = cbCenterCardIndex;
  722. cbCardIndex[1] = cbCenterCardIndex;
  723. cbCardIndex[2] = cbCenterCardIndex;
  724. cbCardIndex[3] = cbCenterCardIndex;
  725. return 4;
  726. }
  727. default:
  728. {
  729. ASSERT(FALSE);
  730. }
  731. }
  732. return 0;
  733. }
  734. //合并手牌
  735. bool CGameLogicZhiPai::HeBingCardIndex(BYTE cbCardIndexTemp[MAX_INDEX_HUA], const BYTE cbCardIndex_Tong[MAX_INDEX_HUA], BYTE cbTempHuaCardIndex[5], const BYTE HuaCardInex_Tong[5])
  736. {
  737. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  738. {
  739. cbCardIndexTemp[i] += cbCardIndex_Tong[i];
  740. ASSERT(cbCardIndexTemp[i] <= 5);
  741. }
  742. for (BYTE i = 0; i < 5; i++)
  743. {
  744. cbTempHuaCardIndex[i] += HuaCardInex_Tong[i];
  745. ASSERT(cbTempHuaCardIndex[i] <= 2);
  746. }
  747. return true;
  748. }
  749. //bool CGameLogicZhiPai::AnalyseTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE *cbTingPaiData, BYTE subMit)
  750. //{
  751. // //复制数据
  752. // BYTE cbCardIndexTemp[MAX_INDEX];
  753. // CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  754. // BYTE cbCardCount = GetCardCount(cbCardIndexTemp);
  755. // if (cbCardCount > 1 && (cbCardCount - 1) % 3 != 0)
  756. // {
  757. // ASSERT(false);
  758. // return false;
  759. // }
  760. // bool IsHu = false;
  761. // CChiHuRight chr;
  762. // for (BYTE i = 0; i < MAX_INDEX; i++)
  763. // {
  764. // BYTE cbCurrentCard = SwitchToCardData(i);
  765. // if (AnalyseHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, chr, cbCurrentCard, subMit))
  766. // {
  767. // cbTingPaiData[i] = 1;//保存番数
  768. // IsHu = true;
  769. // }
  770. // else
  771. // {
  772. // cbTingPaiData[i] = 0;
  773. // }
  774. // }
  775. // return IsHu;
  776. //}
  777. //是否听牌
  778. //bool CGameLogicZhiPai::IsTingCard(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], BYTE cbWeaveCount, BYTE subMit)
  779. //{
  780. // //复制数据
  781. // BYTE cbCardIndexTemp[MAX_INDEX];
  782. // CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  783. //
  784. // for (BYTE i = 0; i < MAX_INDEX; i++)
  785. // {
  786. // BYTE cbCurrentCard = SwitchToCardData(i);
  787. // if (IsHuCard(cbCardIndexTemp, WeaveItem, cbWeaveCount, cbCurrentCard))
  788. // return true;
  789. // }
  790. // return false;
  791. //}
  792. //花牌索引转换成数据
  793. BYTE CGameLogicZhiPai::SwitchToCardData(BYTE cbCardIndex)
  794. {
  795. ASSERT((cbCardIndex >= 0) && (cbCardIndex<23));
  796. if ((cbCardIndex >= 0) && (cbCardIndex<10))
  797. {
  798. return 0x00 | (cbCardIndex + 1);
  799. }
  800. else
  801. {
  802. return 0x20 | (cbCardIndex - 9);
  803. }
  804. }
  805. //花牌数据转换成索引
  806. BYTE CGameLogicZhiPai::SwitchToCardIndex(BYTE cbCardData)
  807. {
  808. ASSERT(IsValidCard(cbCardData));
  809. BYTE cbValue = (cbCardData&MASK_VALUE);
  810. BYTE cbColor = (cbCardData&MASK_COLOR) >> 4;
  811. //如果是数字,直接得到最后一位值
  812. if (cbColor == 0 || cbColor == 1) return cbValue - 1;
  813. else return cbValue + 9;
  814. }
  815. //扑克转换
  816. BYTE CGameLogicZhiPai::SwitchToCardData(BYTE cbCardIndex[MAX_INDEX_HUA], BYTE cbCardData[MAX_COUNT_HUA], BYTE cbHuaCardIndex[])
  817. {
  818. //转换扑克
  819. BYTE cbPosition = 0;
  820. for (BYTE i = 0; i<MAX_INDEX_HUA; i++)
  821. {
  822. if (cbCardIndex[i] != 0)
  823. {
  824. ASSERT(cbPosition<=MAX_COUNT_HUA);
  825. //如果是经牌,特殊处理
  826. if (i == 0 || i == 2 || i == 4 || i == 6 || i == 8)
  827. {
  828. //将花牌数组中花牌个数保存到牌数据中
  829. for (BYTE k = 0; k<cbHuaCardIndex[i / 2]; k++)
  830. {
  831. cbCardData[cbPosition++] = 0x10 | (i + 1);
  832. }
  833. //将剩下的画白皮的
  834. for (BYTE j = 0; j<(cbCardIndex[i] - cbHuaCardIndex[i / 2]); j++)
  835. {
  836. cbCardData[cbPosition++] = 0x00 | (i + 1);
  837. }
  838. }
  839. //普通牌处理
  840. else
  841. {
  842. for (BYTE j = 0; j<cbCardIndex[i]; j++)
  843. {
  844. cbCardData[cbPosition++] = SwitchToCardData(i);
  845. }
  846. }
  847. }
  848. }
  849. return cbPosition;
  850. }
  851. //花牌数据转换
  852. BYTE CGameLogicZhiPai::SwitchToCardIndex(const BYTE cbCardData[], BYTE cbCardCount, BYTE cbCardIndex[MAX_INDEX_HUA])
  853. {
  854. //设置变量
  855. ZeroMemory(cbCardIndex, sizeof(BYTE)*MAX_INDEX_HUA);
  856. //转换扑克
  857. for (BYTE i = 0; i < cbCardCount; i++)
  858. {
  859. ASSERT(IsValidCard(cbCardData[i]));
  860. cbCardIndex[SwitchToCardIndex(cbCardData[i])]++;
  861. }
  862. return cbCardCount;
  863. }
  864. //根据扑克牌数据得到花牌保存到索引中,返回花牌的个数
  865. BYTE CGameLogicZhiPai::GetHuaCard(BYTE cbCardData[], BYTE bCardCount, BYTE cbHuaCardIndex[])
  866. {
  867. BYTE bHuaCardCount = 0;
  868. //循环从牌数据数组中得到花牌
  869. for (BYTE i = 0; i<bCardCount; i++)
  870. {
  871. //参数效验
  872. ASSERT(IsValidCard(cbCardData[i]));
  873. //如果是花牌,将花牌转换成索引存放到花牌索引数组中
  874. if ((cbCardData[i] & MASK_COLOR) == 0x10)
  875. {
  876. BYTE TempIndex = SwitchToCardIndex(cbCardData[i]);
  877. cbHuaCardIndex[TempIndex / 2]++;
  878. ASSERT(cbHuaCardIndex[TempIndex / 2] <= 2);
  879. bHuaCardCount++;
  880. }
  881. }
  882. return bHuaCardCount;
  883. }
  884. int CGameLogicZhiPai::AnalyseGangCard(const BYTE cbCardIndex[MAX_INDEX_HUA], const BYTE HuaCardInex[5], const tagWeaveItem_Hua WeaveItem[], BYTE cbWeaveCount,
  885. tagGangCardResult_Hua & GangCardResult, bool bFlag)
  886. {
  887. //设置变量
  888. int cbActionMask = WIK_NULL;
  889. ZeroMemory(&GangCardResult, sizeof(GangCardResult));
  890. BYTE cbCardIndexTemp[MAX_INDEX_HUA];
  891. CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  892. BYTE cbHuaCardIndexTemp[5];
  893. CopyMemory(cbHuaCardIndexTemp, HuaCardInex, sizeof(cbHuaCardIndexTemp));
  894. tagWeaveItem_Hua WeaveItemTemp[8];
  895. if (cbWeaveCount > 0)
  896. CopyMemory(WeaveItemTemp, WeaveItem, sizeof(WeaveItemTemp));
  897. else
  898. {
  899. ZeroMemory(&WeaveItemTemp, sizeof(WeaveItemTemp));
  900. }
  901. //手上杠牌
  902. for (BYTE i = 0; i < MAX_INDEX_HUA; i++)
  903. {
  904. if (i == 2 || i == 4 || i == 6)
  905. {
  906. if (cbCardIndex[i] + cbCardIndex[22] >= 4)
  907. {
  908. BYTE cbCardData = SwitchToCardData(i);
  909. if ((cbHuaCardIndexTemp[i / 2] + cbCardIndexTemp[22]) == 4 && cbCardIndex[i] == 0)
  910. {
  911. cbActionMask |= WIK_SI_TONG;
  912. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = (cbCardData | 0x10);
  913. }
  914. else
  915. {
  916. cbActionMask |= WIK_SI_TONG;
  917. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = cbCardData;
  918. }
  919. }
  920. }
  921. else if (cbCardIndex[i] >= 4)
  922. {
  923. BYTE cbCardData = SwitchToCardData(i);
  924. cbActionMask |= WIK_SI_TONG;
  925. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = cbCardData;
  926. }
  927. }
  928. //组合杠牌
  929. for (BYTE i = 0; i < cbWeaveCount; i++)
  930. {
  931. if (WeaveItem[i].cbWeaveKind == WIK_SAN_ZHAO)
  932. {
  933. BYTE TempIndex = SwitchToCardIndex(WeaveItem[i].cbCenterCard);
  934. if (cbCardIndex[TempIndex] == 1)
  935. {
  936. if (TempIndex == 0 || TempIndex == 2 || TempIndex == 4 || TempIndex == 6 || TempIndex == 8)
  937. {
  938. if (HuaCardInex[TempIndex / 2] == 1)
  939. {
  940. cbActionMask |= WIK_SI_ZHAO;
  941. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = (WeaveItemTemp[i].cbCenterCard | 0x80 | 0x10);
  942. }
  943. else
  944. {
  945. cbActionMask |= WIK_SI_ZHAO;
  946. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = ((WeaveItemTemp[i].cbCenterCard & 0xEF) | 0x80);
  947. }
  948. }
  949. else
  950. {
  951. cbActionMask |= WIK_SI_ZHAO;
  952. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = (WeaveItemTemp[i].cbCenterCard | 0x80);
  953. }
  954. }
  955. }
  956. if (WeaveItem[i].cbWeaveKind == WIK_SI_TONG)
  957. {
  958. BYTE TempIndex = SwitchToCardIndex(WeaveItem[i].cbCenterCard);
  959. if (TempIndex == 2 || TempIndex == 4 || TempIndex == 6)
  960. {
  961. if (cbCardIndex[TempIndex] >= 1 || cbCardIndex[22] >= 1)
  962. {
  963. if (cbCardIndex[TempIndex] - HuaCardInex[TempIndex / 2] >= 1)
  964. {
  965. cbActionMask |= WIK_WU_TONG;
  966. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = ((WeaveItemTemp[i].cbCenterCard & 0xEF) | 0x40);
  967. }
  968. else if (HuaCardInex[TempIndex / 2] >= 1)
  969. {
  970. cbActionMask |= WIK_WU_TONG;
  971. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = (WeaveItemTemp[i].cbCenterCard | 0x10 | 0x40);
  972. }
  973. else
  974. {
  975. cbActionMask |= WIK_WU_TONG;
  976. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = ((WeaveItemTemp[i].cbCenterCard & 0xEF) | 0x40);
  977. }
  978. }
  979. }
  980. else if (cbCardIndex[TempIndex] == 1)
  981. {
  982. if (TempIndex == 0 || TempIndex == 8)
  983. {
  984. if (HuaCardInex[TempIndex / 2] == 1)
  985. {
  986. cbActionMask |= WIK_WU_TONG;
  987. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = (WeaveItemTemp[i].cbCenterCard | 0x40 | 0x10);
  988. }
  989. else
  990. {
  991. cbActionMask |= WIK_WU_TONG;
  992. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = ((WeaveItemTemp[i].cbCenterCard & 0xEF) | 0x40);
  993. }
  994. }
  995. else
  996. {
  997. cbActionMask |= WIK_WU_TONG;
  998. GangCardResult.cbCardData[GangCardResult.cbCardCount++] = (WeaveItemTemp[i].cbCenterCard | 0x40);
  999. }
  1000. }
  1001. }
  1002. }
  1003. return cbActionMask;
  1004. }
  1005. //分析用户手中的牌,得到可能胡牌的组合信息//用户手中牌的索引数组 //组合牌的数组 //组合个数 //胡牌组合数组
  1006. bool CGameLogicZhiPai::AnalyseCard(const BYTE cbCardIndex[MAX_INDEX_HUA], const tagWeaveItem_Hua WeaveItem[], BYTE cbWeaveCount, CAnalyseItemArray_hua & AnalyseItemArray)
  1007. {
  1008. //统计索引数组中的所有牌数
  1009. BYTE cbCardCount = 0;
  1010. for (BYTE i = 0; i<MAX_INDEX_HUA; i++) cbCardCount += cbCardIndex[i];
  1011. //效验数目,索引数组中牌的总数在最特殊的情况下,都会有一对丫口
  1012. ASSERT(cbCardCount >= 2);
  1013. if (cbCardCount<2) return false;
  1014. //变量定义
  1015. BYTE cbKindItemCount = 0;
  1016. tagKindItem_hua KindItem[2*MAX_COUNT_HUA - 2];
  1017. ZeroMemory(KindItem, sizeof(KindItem));
  1018. //需求判断--用户手中胡牌的正确组合数
  1019. BYTE cbLessKindItem = 8 - cbWeaveCount;
  1020. //单吊判断,cbCardCount=2的情况:原来手中牌只有一张牌,加入要分析的牌后正好构成两张,其他的牌都在组合牌中
  1021. if (cbCardCount == 2)
  1022. {
  1023. BYTE FirstIndex = -1, SecondeIndex = -1;
  1024. //如果剩下的两张是丫口,保存所有组合牌
  1025. if (IsYaKou(cbCardIndex, FirstIndex, SecondeIndex) == true)
  1026. {
  1027. tagAnalyseItem_hua AnalyseItem;
  1028. ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
  1029. //分析每一组组合牌,得到组合牌的组合牌型和中间牌索引,保存到分析子项中
  1030. for (BYTE j = 0; j<cbWeaveCount; j++)
  1031. {
  1032. AnalyseItem.cbWeaveKind[j] = WeaveItem[j].cbWeaveKind;
  1033. AnalyseItem.cbCenterCard[j] = SwitchToCardIndex(WeaveItem[j].cbCenterCard);
  1034. }
  1035. //保存丫口
  1036. AnalyseItem.cbCardEye[0] = FirstIndex;
  1037. AnalyseItem.cbCardEye[1] = SecondeIndex;
  1038. //将分析结果插入到分析数组中
  1039. AnalyseItemArray.Add(AnalyseItem);
  1040. return true;
  1041. }
  1042. return false;
  1043. }
  1044. //加入待分析的牌后,手中牌>=3的情况,对手中牌索引数组进行分析
  1045. if (cbCardCount >= 3)
  1046. {
  1047. for (BYTE i = 0; i<MAX_INDEX_HUA; i++)
  1048. {
  1049. //三个一样的牌
  1050. if (cbCardIndex[i] >= 3)
  1051. {
  1052. KindItem[cbKindItemCount].cbCenterCard = i;
  1053. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  1054. KindItem[cbKindItemCount].cbCardIndex[1] = i;
  1055. KindItem[cbKindItemCount].cbCardIndex[2] = i;
  1056. KindItem[cbKindItemCount].cbCardCount = 3;
  1057. KindItem[cbKindItemCount++].cbWeaveKind = WIK_DUI;
  1058. }
  1059. //四个一样
  1060. if (cbCardIndex[i] >= 4)
  1061. {
  1062. KindItem[cbKindItemCount].cbCenterCard = i;
  1063. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  1064. KindItem[cbKindItemCount].cbCardIndex[1] = i;
  1065. KindItem[cbKindItemCount].cbCardIndex[2] = i;
  1066. KindItem[cbKindItemCount].cbCardIndex[3] = i;
  1067. KindItem[cbKindItemCount].cbCardCount = 4;
  1068. KindItem[cbKindItemCount++].cbWeaveKind = WIK_SI_TONG;
  1069. }
  1070. //五个一样
  1071. if (cbCardIndex[i] >= 5)
  1072. {
  1073. KindItem[cbKindItemCount].cbCenterCard = i;
  1074. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  1075. KindItem[cbKindItemCount].cbCardIndex[1] = i;
  1076. KindItem[cbKindItemCount].cbCardIndex[2] = i;
  1077. KindItem[cbKindItemCount].cbCardIndex[3] = i;
  1078. KindItem[cbKindItemCount].cbCardIndex[4] = i;
  1079. KindItem[cbKindItemCount].cbCardCount = 5;
  1080. KindItem[cbKindItemCount++].cbWeaveKind = WIK_WU_TONG;
  1081. }
  1082. //2.连牌判断
  1083. //0--9之间的排序
  1084. if ((i<(10 - 2)) && (cbCardIndex[i]>0))
  1085. {
  1086. for (BYTE j = 1; j <= cbCardIndex[i]; j++)
  1087. {
  1088. if ((cbCardIndex[i + 1] >= j) && (cbCardIndex[i + 2] >= j))
  1089. {
  1090. KindItem[cbKindItemCount].cbCenterCard = i;
  1091. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  1092. KindItem[cbKindItemCount].cbCardIndex[1] = i + 1;
  1093. KindItem[cbKindItemCount].cbCardIndex[2] = i + 2;
  1094. KindItem[cbKindItemCount].cbCardCount = 3;
  1095. KindItem[cbKindItemCount++].cbWeaveKind = WIK_QI_TA;
  1096. }
  1097. }
  1098. }
  1099. //11-21
  1100. //孔乙已
  1101. else if ((i == 10) && (cbCardIndex[i]>0))
  1102. {
  1103. for (BYTE j = 1; j <= cbCardIndex[i]; j++)
  1104. {
  1105. if (cbCardIndex[0] >= j && cbCardIndex[11] >= j)
  1106. {
  1107. KindItem[cbKindItemCount].cbCenterCard = i;
  1108. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  1109. KindItem[cbKindItemCount].cbCardIndex[1] = 0;
  1110. KindItem[cbKindItemCount].cbCardIndex[2] = 11;
  1111. KindItem[cbKindItemCount].cbCardCount = 3;
  1112. KindItem[cbKindItemCount++].cbWeaveKind = WIK_QI_TA;
  1113. }
  1114. }
  1115. }
  1116. //上大人
  1117. else if ((i == 12) && (cbCardIndex[i]>0))
  1118. {
  1119. for (BYTE j = 1; j <= cbCardIndex[i]; j++)
  1120. {
  1121. if (cbCardIndex[13] >= j && cbCardIndex[14] >= j)
  1122. {
  1123. KindItem[cbKindItemCount].cbCenterCard = i;
  1124. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  1125. KindItem[cbKindItemCount].cbCardIndex[1] = i + 1;
  1126. KindItem[cbKindItemCount].cbCardIndex[2] = i + 2;
  1127. KindItem[cbKindItemCount].cbCardCount = 3;
  1128. KindItem[cbKindItemCount++].cbWeaveKind = WIK_QI_TA;
  1129. }
  1130. }
  1131. }
  1132. //七十土
  1133. else if ((i == 15) && (cbCardIndex[i]>0))
  1134. {
  1135. for (BYTE j = 1; j <= cbCardIndex[i]; j++)
  1136. {
  1137. if (cbCardIndex[6] >= j && cbCardIndex[9] >= j)
  1138. {
  1139. KindItem[cbKindItemCount].cbCenterCard = i;
  1140. KindItem[cbKindItemCount].cbCardIndex[0] = 6;
  1141. KindItem[cbKindItemCount].cbCardIndex[1] = 9;
  1142. KindItem[cbKindItemCount].cbCardIndex[2] = i;
  1143. KindItem[cbKindItemCount].cbCardCount = 3;
  1144. KindItem[cbKindItemCount++].cbWeaveKind = WIK_QI_TA;
  1145. }
  1146. }
  1147. }
  1148. //化三千
  1149. else if ((i == 16) && (cbCardIndex[i]>0))
  1150. {
  1151. for (BYTE j = 1; j <= cbCardIndex[i]; j++)
  1152. {
  1153. if (cbCardIndex[2] >= j && cbCardIndex[17] >= j)
  1154. {
  1155. KindItem[cbKindItemCount].cbCenterCard = i;
  1156. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  1157. KindItem[cbKindItemCount].cbCardIndex[1] = 2;
  1158. KindItem[cbKindItemCount].cbCardIndex[2] = 17;
  1159. KindItem[cbKindItemCount].cbCardCount = 3;
  1160. KindItem[cbKindItemCount++].cbWeaveKind = WIK_QI_TA;
  1161. }
  1162. }
  1163. }
  1164. //可知礼
  1165. else if ((i == 18) && (cbCardIndex[i]>0))
  1166. {
  1167. for (BYTE j = 1; j <= cbCardIndex[i]; j++)
  1168. {
  1169. if (cbCardIndex[19] >= j && cbCardIndex[20] >= j)
  1170. {
  1171. KindItem[cbKindItemCount].cbCenterCard = i;
  1172. KindItem[cbKindItemCount].cbCardIndex[0] = i;
  1173. KindItem[cbKindItemCount].cbCardIndex[1] = i + 1;
  1174. KindItem[cbKindItemCount].cbCardIndex[2] = i + 2;
  1175. KindItem[cbKindItemCount].cbCardCount = 3;
  1176. KindItem[cbKindItemCount++].cbWeaveKind = WIK_QI_TA;
  1177. }
  1178. }
  1179. }
  1180. //八九子
  1181. else if ((i == 21) && (cbCardIndex[i]>0))
  1182. {
  1183. for (BYTE j = 1; j <= cbCardIndex[i]; j++)
  1184. {
  1185. if (cbCardIndex[7] >= j && cbCardIndex[8] >= j)
  1186. {
  1187. KindItem[cbKindItemCount].cbCenterCard = i;
  1188. KindItem[cbKindItemCount].cbCardIndex[0] = 7;
  1189. KindItem[cbKindItemCount].cbCardIndex[1] = 8;
  1190. KindItem[cbKindItemCount].cbCardIndex[2] = i;
  1191. KindItem[cbKindItemCount].cbCardCount = 3;
  1192. KindItem[cbKindItemCount++].cbWeaveKind = WIK_QI_TA;
  1193. }
  1194. }
  1195. }
  1196. }
  1197. }
  1198. //打印用户手中牌的所有组合信息
  1199. #ifdef _DEBUG
  1200. //CString csTemp;
  1201. //csTemp.Format(L"时间:%d \r\n", KindItem[cbKindItemCount]);
  1202. //OutputDebugString(csTemp);
  1203. //m_Debug.PrintKindItemsMessage(KindItem, cbKindItemCount);
  1204. #endif
  1205. //分析所有的组合,从而得到可能胡牌的情况
  1206. if (cbKindItemCount >= cbLessKindItem)
  1207. {
  1208. //变量定义
  1209. BYTE cbCardIndexTemp[MAX_INDEX_HUA];
  1210. ZeroMemory(cbCardIndexTemp, sizeof(cbCardIndexTemp));
  1211. //变量定义
  1212. BYTE cbIndex[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
  1213. tagKindItem_hua * pKindItem[8];
  1214. ZeroMemory(&pKindItem, sizeof(pKindItem));
  1215. do
  1216. {
  1217. //每次循环将传进来的牌索引数组拷贝到临时数组中,进行分析
  1218. CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  1219. //每次从上面分析得出的分析子项中取cbLessKindItem个分析子项进行分析,
  1220. //注意:索引数组cbIndex[]在每次循环结束时都重新设置了
  1221. for (BYTE i = 0; i<cbLessKindItem; i++)
  1222. {
  1223. pKindItem[i] = &KindItem[cbIndex[i]];
  1224. }
  1225. //数量判断
  1226. bool bEnoughCard = true;
  1227. //修改临时数组的值,把临时数组中构成cbLessKindItem个分析子项里的每一张牌,牌数减1,
  1228. //以下是都是三个一组的
  1229. for (BYTE k = 0; k<cbLessKindItem; k++)
  1230. {
  1231. //对组合里的每一个牌索引进行分析
  1232. for (BYTE i = 0; i<pKindItem[k]->cbCardCount; i++)
  1233. {
  1234. //存在判断
  1235. BYTE cbCardIndex = pKindItem[k]->cbCardIndex[i];
  1236. if (cbCardIndexTemp[cbCardIndex] == 0)
  1237. {
  1238. bEnoughCard = false;
  1239. break;
  1240. }
  1241. else cbCardIndexTemp[cbCardIndex]--;
  1242. }
  1243. }
  1244. //胡牌判断,注意下面使用到的cbCardIndexTemp[]数组是经前面修改过后的
  1245. if (bEnoughCard == true)
  1246. {
  1247. //统计数组中的个数要为2
  1248. WORD cbCardCount = 0;
  1249. for (BYTE i = 0; i<MAX_INDEX_HUA; i++) cbCardCount += cbCardIndexTemp[i];
  1250. //丫口值
  1251. BYTE cbFirstIndex = -1, cbSecondIndex = -1;
  1252. //对剩下的牌进行分析,判断是否是丫口,
  1253. if (IsYaKou(cbCardIndexTemp, cbFirstIndex, cbSecondIndex) == true)
  1254. {
  1255. ASSERT((cbFirstIndex != -1) && (cbSecondIndex != -1));
  1256. tagAnalyseItem_hua AnalyseItem;
  1257. ZeroMemory(&AnalyseItem, sizeof(AnalyseItem));
  1258. //得到组合牌中的牌型,保存到分析子项中
  1259. for (BYTE i = 0; i<cbWeaveCount; i++)
  1260. {
  1261. AnalyseItem.cbWeaveKind[i] = WeaveItem[i].cbWeaveKind;
  1262. AnalyseItem.cbCenterCard[i] = SwitchToCardIndex(WeaveItem[i].cbCenterCard);
  1263. }
  1264. //得到手中牌的牌型,保存到分析子项中
  1265. for (BYTE i = 0; i<cbLessKindItem; i++)
  1266. {
  1267. AnalyseItem.cbWeaveKind[i + cbWeaveCount] = pKindItem[i]->cbWeaveKind;
  1268. AnalyseItem.cbCenterCard[i + cbWeaveCount] = pKindItem[i]->cbCenterCard;
  1269. }
  1270. //设置牌眼
  1271. AnalyseItem.cbCardEye[0] = cbFirstIndex;
  1272. AnalyseItem.cbCardEye[1] = cbSecondIndex;
  1273. //将分析子项插入到分析数组中
  1274. AnalyseItemArray.Add(AnalyseItem);
  1275. }
  1276. }
  1277. //设置索引,索引数组中存放的是分析子项数组的下标,每次取分析子项进行分析时,都是按照索引数组
  1278. //里面存放的下标值进行存取,当cbIndex[cbLessKindItem-1]的最后一位存放的值与得出的分析子项下标相同,
  1279. //重新调整索引数组,下一次取值就会取新的组合
  1280. if (cbIndex[cbLessKindItem - 1] == (cbKindItemCount - 1))
  1281. {
  1282. BYTE i = cbLessKindItem - 1;
  1283. for (; i>0; i--)
  1284. {
  1285. if ((cbIndex[i - 1] + 1) != cbIndex[i])
  1286. {
  1287. BYTE cbNewIndex = cbIndex[i - 1];
  1288. for (BYTE j = (i - 1); j<cbLessKindItem; j++)
  1289. {
  1290. cbIndex[j] = cbNewIndex + j - i + 2;
  1291. }
  1292. break;
  1293. }
  1294. }
  1295. //跳出整个while循环
  1296. if (i == 0) break;
  1297. }
  1298. else cbIndex[cbLessKindItem - 1]++;
  1299. } while (true);
  1300. }
  1301. //打印用户手中牌合法的组合信息
  1302. #ifdef _DEBUG
  1303. //CString csTemp;
  1304. //csTemp.Format(L"时间:%d \r\n", AnalyseItemArray);
  1305. //OutputDebugString(csTemp);
  1306. //m_Debug.PrintValidKindItemsMessage(AnalyseItemArray);
  1307. #endif
  1308. return (AnalyseItemArray.GetCount()>0);
  1309. }
  1310. BYTE CGameLogicZhiPai::AnalyseCardHuNum(const BYTE cbCardIndexTemp[MAX_INDEX_HUA], BYTE cbCurrentCard, BYTE cbHandGoldCard[3], BYTE LaiZi[3], BYTE cbTempHuaCardIndex[5], BYTE cbTempWeaveHuaIndex[5], const tagWeaveItem_Hua WeaveItem[], BYTE cbItemCount, BYTE TongCount, CAnalyseItemArray_hua & AnalyseItemArray, tagAnalyseItem_hua & BestAnalyseItem)
  1311. {
  1312. //用动态数组
  1313. ZeroMemory(&BestAnalyseItem, sizeof(BestAnalyseItem));
  1314. //逐一分析每一合法胡牌的组合
  1315. for (INT_PTR i = 0; i<AnalyseItemArray.GetCount(); i++)
  1316. {
  1317. //对某一种组合进行分析
  1318. tagAnalyseItem_hua *pAnalyseItem = &AnalyseItemArray[i];
  1319. BYTE pTempTongCount = 0;
  1320. for (BYTE j = 0; j < 8; j++)
  1321. {
  1322. if (pAnalyseItem->cbWeaveKind[j] == WIK_SI_TONG)
  1323. {
  1324. pTempTongCount++;
  1325. }
  1326. if (pAnalyseItem->cbWeaveKind[j] == WIK_WU_TONG)
  1327. {
  1328. pTempTongCount += 2;
  1329. }
  1330. }
  1331. if (pTempTongCount < TongCount)continue;
  1332. BYTE cbMaxPoint = 0;
  1333. BYTE cbMaxPointGoldCard = 255;
  1334. //对每一种组合分别讨论以1,3,5,7,9作为主金得出胡数最大的情况
  1335. for (BYTE j = 0; j<3; j++)
  1336. {
  1337. //得到主经的索引值
  1338. BYTE RealGold = (j * 2) + 2; //当前的假设主精
  1339. WORD WeavePoint = 0; //用户组合牌的总点数
  1340. WORD HandPoint = 0; //用户手中的总点数
  1341. //每次重新保存手中经牌和花牌的个数,
  1342. BYTE cbGoldCard[3]; //用户手中牌的各精牌个数
  1343. BYTE cbHuaCardIndex[5]; //用户手中牌的各花牌个数
  1344. CopyMemory(cbGoldCard, cbHandGoldCard, sizeof(cbGoldCard));
  1345. CopyMemory(cbHuaCardIndex, cbTempHuaCardIndex, sizeof(cbHuaCardIndex));
  1346. //1 分析用户组合牌中的分数
  1347. //////////////////////下面用到的花牌索引应该是组合牌中的花牌///////////////////
  1348. BYTE cbItemPoint; //测试时用,用于记录每一组成的点数
  1349. ZeroMemory(pAnalyseItem->cbKindPoint, sizeof(pAnalyseItem->cbKindPoint));
  1350. for (BYTE m = 0; m<cbItemCount; m++)
  1351. {
  1352. //得到组合牌的中心牌索引
  1353. cbItemPoint = 0;
  1354. BYTE index = pAnalyseItem->cbCenterCard[m];
  1355. if (pAnalyseItem->cbWeaveKind[m] == WIK_WU_TONG)
  1356. {
  1357. if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  1358. {
  1359. if (index == 0 || index == 8)
  1360. {
  1361. HandPoint += 6;
  1362. cbItemPoint = 6;
  1363. }
  1364. else
  1365. {
  1366. //1.是主金牌+56
  1367. if (index == RealGold)
  1368. {
  1369. if (cbTempWeaveHuaIndex[index / 2] == 4)
  1370. {
  1371. //对应位置的花牌数减为0
  1372. HandPoint += 96;
  1373. cbItemPoint = 96;
  1374. }
  1375. else if (cbTempWeaveHuaIndex[index / 2] == 3)
  1376. {
  1377. //对应位置的花牌数减为0
  1378. HandPoint += 72;
  1379. cbItemPoint = 72;
  1380. }
  1381. else if (cbTempWeaveHuaIndex[index / 2] == 2)
  1382. {
  1383. //对应位置的花牌数减为0
  1384. HandPoint += 56;
  1385. cbItemPoint = 56;
  1386. }
  1387. else
  1388. {
  1389. ASSERT(false);
  1390. cbItemPoint = 0;
  1391. WeavePoint += 0;
  1392. }
  1393. }
  1394. //不是主金+28
  1395. else
  1396. {
  1397. if (cbTempWeaveHuaIndex[index / 2] == 4)
  1398. {
  1399. //对应位置的花牌数减为0
  1400. HandPoint += 48;
  1401. cbItemPoint = 48;
  1402. }
  1403. else if (cbTempWeaveHuaIndex[index / 2] == 3)
  1404. {
  1405. //对应位置的花牌数减为0
  1406. HandPoint += 36;
  1407. cbItemPoint = 36;
  1408. }
  1409. else if (cbTempWeaveHuaIndex[index / 2] == 2)
  1410. {
  1411. //对应位置的花牌数减为0
  1412. HandPoint += 28;
  1413. cbItemPoint = 28;
  1414. }
  1415. else
  1416. {
  1417. ASSERT(false);
  1418. cbItemPoint = 0;
  1419. WeavePoint += 0;
  1420. }
  1421. }
  1422. }
  1423. }
  1424. //2.普通牌(手中牌):红牌算8胡,黑牌算4胡
  1425. else
  1426. {
  1427. //2.1红牌,只有上,大,人,可,知,礼六种情况+8
  1428. if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20)
  1429. {
  1430. HandPoint += 8;
  1431. cbItemPoint = 8;
  1432. }
  1433. //2.2黑牌+4
  1434. else
  1435. {
  1436. HandPoint += 4;
  1437. cbItemPoint = 4;
  1438. }
  1439. }
  1440. }
  1441. else if (pAnalyseItem->cbWeaveKind[m] == WIK_SI_TONG)
  1442. {
  1443. if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  1444. {
  1445. if (index == 0 || index == 8)
  1446. {
  1447. switch (cbTempWeaveHuaIndex[index / 2])
  1448. {
  1449. case 1: //一张花牌的情况
  1450. {
  1451. cbItemPoint = 3;
  1452. WeavePoint += 3;
  1453. break;
  1454. }
  1455. case 2: //二张花牌的情况
  1456. {
  1457. cbItemPoint = 4;
  1458. WeavePoint += 4;
  1459. break;
  1460. }
  1461. }
  1462. }
  1463. else
  1464. {
  1465. //1.是主金牌根据花牌个数进行算分
  1466. if (index == RealGold)
  1467. {
  1468. //根据花牌个数进行计算
  1469. switch (cbTempWeaveHuaIndex[index / 2])
  1470. {
  1471. case 1: //一张花牌的情况
  1472. {
  1473. cbItemPoint = 24;
  1474. WeavePoint += 24;
  1475. break;
  1476. }
  1477. case 2: //两张花牌情况
  1478. {
  1479. cbItemPoint = 28;
  1480. WeavePoint += 28;
  1481. break;
  1482. }
  1483. case 3: //一张花牌的情况
  1484. {
  1485. cbItemPoint = 36;
  1486. WeavePoint += 36;
  1487. break;
  1488. }
  1489. case 4: //一张花牌的情况
  1490. {
  1491. cbItemPoint = 48;
  1492. WeavePoint += 48;
  1493. break;
  1494. }
  1495. default:
  1496. {
  1497. ASSERT(false);
  1498. break;
  1499. }
  1500. }
  1501. }
  1502. //非主金的牌,根据花牌的个数进行算分
  1503. else
  1504. {
  1505. //根据花牌个数进行计算
  1506. switch (cbTempWeaveHuaIndex[index / 2])
  1507. {
  1508. case 1: //一张花牌的情况
  1509. {
  1510. cbItemPoint = 12;
  1511. WeavePoint += 12;
  1512. break;
  1513. }
  1514. case 2: //两张花牌情况
  1515. {
  1516. cbItemPoint = 14;
  1517. WeavePoint += 14;
  1518. break;
  1519. }
  1520. case 3: //一张花牌的情况
  1521. {
  1522. cbItemPoint = 18;
  1523. WeavePoint += 18;
  1524. break;
  1525. }
  1526. case 4: //一张花牌的情况
  1527. {
  1528. cbItemPoint = 24;
  1529. WeavePoint += 24;
  1530. break;
  1531. }
  1532. }
  1533. }
  1534. }
  1535. }
  1536. //普通牌2.1红牌算4胡,2.2黑牌算2胡
  1537. else
  1538. {
  1539. //2.1红牌,只有上,大,人,可,知,礼六种情况+4
  1540. if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20)
  1541. {
  1542. WeavePoint += 4;
  1543. cbItemPoint = 4;
  1544. }
  1545. //2.2黑牌+2
  1546. else
  1547. {
  1548. WeavePoint += 2;
  1549. cbItemPoint = 2;
  1550. }
  1551. }
  1552. }
  1553. //四招情况:1.是金牌,2.普通牌
  1554. else if (pAnalyseItem->cbWeaveKind[m] == WIK_SI_ZHAO)
  1555. {
  1556. //1.是经牌1,3,5,7,9,分为:1.1主经,1.2非主经
  1557. if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  1558. {
  1559. if (index == 0 || index == 8)
  1560. {
  1561. cbItemPoint = 6;
  1562. WeavePoint += 6;
  1563. }
  1564. else
  1565. {
  1566. //1.是主金牌+56
  1567. if (index == RealGold)
  1568. {
  1569. if (cbTempWeaveHuaIndex[index / 2] == 4)
  1570. {
  1571. cbItemPoint = 96;
  1572. WeavePoint += 96;
  1573. }
  1574. else if (cbTempWeaveHuaIndex[index / 2] == 3)
  1575. {
  1576. cbItemPoint = 72;
  1577. WeavePoint += 72;
  1578. }
  1579. else if (cbTempWeaveHuaIndex[index / 2] == 2)
  1580. {
  1581. cbItemPoint = 56;
  1582. WeavePoint += 56;
  1583. }
  1584. else
  1585. {
  1586. ASSERT(false);
  1587. cbItemPoint = 0;
  1588. WeavePoint += 0;
  1589. }
  1590. }
  1591. //不是主金+28
  1592. else
  1593. {
  1594. if (cbTempWeaveHuaIndex[index / 2] == 4)
  1595. {
  1596. cbItemPoint = 48;
  1597. WeavePoint += 48;
  1598. }
  1599. else if (cbTempWeaveHuaIndex[index / 2] == 3)
  1600. {
  1601. cbItemPoint = 36;
  1602. WeavePoint += 36;
  1603. }
  1604. else if (cbTempWeaveHuaIndex[index / 2] == 2)
  1605. {
  1606. cbItemPoint = 28;
  1607. WeavePoint += 28;
  1608. }
  1609. else
  1610. {
  1611. ASSERT(false);
  1612. cbItemPoint = 0;
  1613. WeavePoint += 0;
  1614. }
  1615. }
  1616. }
  1617. }
  1618. //2.不是经牌的普通牌分:2.1红牌,2.2黑牌
  1619. else
  1620. {
  1621. //2.1红牌,只有上,大,人,可,知,礼六种情况+8
  1622. if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20)
  1623. {
  1624. WeavePoint += 8;
  1625. cbItemPoint = 8;
  1626. }
  1627. //2.2黑牌+4
  1628. else
  1629. {
  1630. WeavePoint += 4;
  1631. cbItemPoint = 4;
  1632. }
  1633. }
  1634. }
  1635. //三招情况:1.是金牌,2.普通牌
  1636. else if (pAnalyseItem->cbWeaveKind[m] == WIK_SAN_ZHAO)
  1637. {
  1638. //1,3,5,7,9的情况
  1639. if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  1640. {
  1641. if (index == 0 || index == 8)
  1642. {
  1643. switch (cbTempWeaveHuaIndex[index / 2])
  1644. {
  1645. case 1: //一张花牌的情况
  1646. {
  1647. cbItemPoint = 3;
  1648. WeavePoint += 3;
  1649. break;
  1650. }
  1651. case 2: //二张花牌的情况
  1652. {
  1653. cbItemPoint = 4;
  1654. WeavePoint += 4;
  1655. break;
  1656. }
  1657. }
  1658. }
  1659. else
  1660. {
  1661. //1.是主金牌根据花牌个数进行算分
  1662. if (index == RealGold)
  1663. {
  1664. //根据花牌个数进行计算
  1665. switch (cbTempWeaveHuaIndex[index / 2])
  1666. {
  1667. case 1: //一张花牌的情况
  1668. {
  1669. cbItemPoint = 24;
  1670. WeavePoint += 24;
  1671. break;
  1672. }
  1673. case 2: //两张花牌情况
  1674. {
  1675. cbItemPoint = 28;
  1676. WeavePoint += 28;
  1677. break;
  1678. }
  1679. case 3: //一张花牌的情况
  1680. {
  1681. cbItemPoint = 36;
  1682. WeavePoint += 36;
  1683. break;
  1684. }
  1685. case 4: //一张花牌的情况
  1686. {
  1687. cbItemPoint = 48;
  1688. WeavePoint += 48;
  1689. break;
  1690. }
  1691. }
  1692. }
  1693. //非主金的牌,根据花牌的个数进行算分
  1694. else
  1695. {
  1696. //根据花牌个数进行计算
  1697. switch (cbTempWeaveHuaIndex[index / 2])
  1698. {
  1699. case 1: //一张花牌的情况
  1700. {
  1701. cbItemPoint = 12;
  1702. WeavePoint += 12;
  1703. break;
  1704. }
  1705. case 2: //两张花牌情况
  1706. {
  1707. cbItemPoint = 14;
  1708. WeavePoint += 14;
  1709. break;
  1710. }
  1711. case 3: //一张花牌的情况
  1712. {
  1713. cbItemPoint = 18;
  1714. WeavePoint += 18;
  1715. break;
  1716. }
  1717. case 4: //一张花牌的情况
  1718. {
  1719. cbItemPoint = 24;
  1720. WeavePoint += 24;
  1721. break;
  1722. }
  1723. }
  1724. }
  1725. }
  1726. }
  1727. //普通牌2.1红牌算4胡,2.2黑牌算2胡
  1728. else
  1729. {
  1730. //2.1红牌,只有上,大,人,可,知,礼六种情况+4
  1731. if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20)
  1732. {
  1733. WeavePoint += 4;
  1734. cbItemPoint = 4;
  1735. }
  1736. //2.2黑牌+2
  1737. else
  1738. {
  1739. WeavePoint += 2;
  1740. cbItemPoint = 2;
  1741. }
  1742. }
  1743. }
  1744. //对牌情况:1.是金牌,2.普通牌
  1745. else if (pAnalyseItem->cbWeaveKind[m] == WIK_DUI)
  1746. {
  1747. //1,3,5,7,9的情况
  1748. if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  1749. {
  1750. if (index == 0 || index == 8)
  1751. {
  1752. //根据花牌个数进行计算
  1753. switch (cbTempWeaveHuaIndex[index / 2])
  1754. {
  1755. case 0: //0张花牌的情况
  1756. {
  1757. cbItemPoint = 0;
  1758. WeavePoint += 0;
  1759. break;
  1760. }
  1761. case 1: //1张花牌情况
  1762. {
  1763. cbItemPoint = 1;
  1764. WeavePoint += 1;
  1765. break;
  1766. }
  1767. case 2: //2张花牌情况
  1768. {
  1769. cbItemPoint = 2;
  1770. WeavePoint += 2;
  1771. break;
  1772. }
  1773. }
  1774. }
  1775. else
  1776. {
  1777. //1.是主金牌根据花牌个数进行算分
  1778. if (index == RealGold)
  1779. {
  1780. //根据花牌个数进行计算
  1781. switch (cbTempWeaveHuaIndex[index / 2])
  1782. {
  1783. case 0: //0张花牌的情况
  1784. {
  1785. cbItemPoint = 6;
  1786. WeavePoint += 6;
  1787. break;
  1788. }
  1789. case 1: //1张花牌情况
  1790. {
  1791. cbItemPoint = 8;
  1792. WeavePoint += 8;
  1793. break;
  1794. }
  1795. case 2: //2张花牌情况
  1796. {
  1797. cbItemPoint = 10;
  1798. WeavePoint += 10;
  1799. break;
  1800. }
  1801. default:
  1802. {
  1803. ASSERT(false);
  1804. cbItemPoint = 0;
  1805. WeavePoint += 0;
  1806. break;
  1807. }
  1808. }
  1809. }
  1810. //////////////非主金的情况下算胡///////////////////
  1811. //2.非主金的牌
  1812. else
  1813. {
  1814. //根据花牌个数进行计算
  1815. switch (cbTempWeaveHuaIndex[index / 2])
  1816. {
  1817. case 0: //0张花牌的情况
  1818. {
  1819. cbItemPoint = 3;
  1820. WeavePoint += 3;
  1821. break;
  1822. }
  1823. case 1: //1张花牌情况
  1824. {
  1825. cbItemPoint = 4;
  1826. WeavePoint += 4;
  1827. break;
  1828. }
  1829. case 2: //2张花牌情况
  1830. {
  1831. cbItemPoint = 5;
  1832. WeavePoint += 5;
  1833. break;
  1834. }
  1835. default:
  1836. {
  1837. ASSERT(false);
  1838. cbItemPoint = 0;
  1839. WeavePoint += 0;
  1840. break;
  1841. }
  1842. }
  1843. }
  1844. }
  1845. }
  1846. //普通牌2.1红牌算1胡,2.2黑牌不算胡
  1847. else
  1848. {
  1849. //2.1红牌,只有上,大,人,可,知,礼六种情况+1
  1850. if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20)
  1851. {
  1852. WeavePoint += 1;
  1853. cbItemPoint = 1;
  1854. }
  1855. //2.2黑牌+0
  1856. else
  1857. {
  1858. WeavePoint += 0;
  1859. cbItemPoint = 0;
  1860. }
  1861. }
  1862. }
  1863. pAnalyseItem->cbKindPoint[m] = cbItemPoint;
  1864. }
  1865. //2 计算用户手中坎牌的所有点数
  1866. for (BYTE k = cbItemCount; k < 8; k++)
  1867. {
  1868. cbItemPoint = 0;
  1869. //取每种组合里面的每小组的中心牌索引
  1870. BYTE index = pAnalyseItem->cbCenterCard[k];
  1871. //五藏情况:1.1是金牌,1.2.普通牌
  1872. if (pAnalyseItem->cbWeaveKind[k] == WIK_WU_TONG)
  1873. {
  1874. //1.是金牌1,3,5,7,9,分为:1.1主金,1.2非主金
  1875. if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  1876. {
  1877. if (index == 0 || index == 8)
  1878. {
  1879. HandPoint += 6;
  1880. cbItemPoint = 6;
  1881. }
  1882. else
  1883. {
  1884. ASSERT(cbGoldCard[(index - 2) / 2] >= 5);
  1885. cbGoldCard[(index - 2) / 2] -= 5; //手中此精牌个数为0
  1886. //1.1主金
  1887. if (index == RealGold)
  1888. {
  1889. if (cbHuaCardIndex[index / 2] == 4)
  1890. {
  1891. //对应位置的花牌数减为0
  1892. HandPoint += 96;
  1893. cbItemPoint = 96;
  1894. cbHuaCardIndex[index / 2] -= 4;
  1895. }
  1896. else if (cbHuaCardIndex[index / 2] == 3)
  1897. {
  1898. //对应位置的花牌数减为0
  1899. HandPoint += 72;
  1900. cbItemPoint = 72;
  1901. cbHuaCardIndex[index / 2] -= 3;
  1902. }
  1903. else
  1904. {
  1905. //对应位置的花牌数减为0
  1906. HandPoint += 56;
  1907. cbItemPoint = 56;
  1908. cbHuaCardIndex[index / 2] -= 2;
  1909. }
  1910. }
  1911. //1.2非主金的金牌
  1912. else
  1913. {
  1914. if (cbHuaCardIndex[index / 2] == 4)
  1915. {
  1916. //对应位置的花牌数减为0
  1917. HandPoint += 48;
  1918. cbItemPoint = 48;
  1919. cbHuaCardIndex[index / 2] -= 4;
  1920. }
  1921. else if (cbHuaCardIndex[index / 2] == 3)
  1922. {
  1923. //对应位置的花牌数减为0
  1924. HandPoint += 36;
  1925. cbItemPoint = 36;
  1926. cbHuaCardIndex[index / 2] -= 3;
  1927. }
  1928. else
  1929. {
  1930. //对应位置的花牌数减为0
  1931. HandPoint += 28;
  1932. cbItemPoint = 28;
  1933. cbHuaCardIndex[index / 2] -= 2;
  1934. }
  1935. }
  1936. }
  1937. }
  1938. //2.普通牌(手中牌):红牌算8胡,黑牌算4胡
  1939. else
  1940. {
  1941. //2.1红牌,只有上,大,人,可,知,礼六种情况+8
  1942. if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20)
  1943. {
  1944. HandPoint += 8;
  1945. cbItemPoint = 8;
  1946. }
  1947. //2.2黑牌+4
  1948. else
  1949. {
  1950. HandPoint += 4;
  1951. cbItemPoint = 4;
  1952. }
  1953. }
  1954. }
  1955. //四藏情况:1.是金牌,2.普通牌
  1956. else if (pAnalyseItem->cbWeaveKind[k] == WIK_SI_TONG)
  1957. {
  1958. //1.是金牌1,3,5,7,9的情况
  1959. if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  1960. {
  1961. if (index == 0 || index == 8)
  1962. {
  1963. //根据花牌个数进行计算
  1964. switch (cbHuaCardIndex[index / 2])
  1965. {
  1966. case 1: //一张花牌的情况
  1967. {
  1968. cbItemPoint = 3;
  1969. HandPoint += 3;
  1970. cbHuaCardIndex[index / 2] -= 1;
  1971. break;
  1972. }
  1973. case 2: //两张花牌情况
  1974. {
  1975. cbItemPoint = 4;
  1976. HandPoint += 4;
  1977. cbHuaCardIndex[index / 2] -= 2;
  1978. break;
  1979. }
  1980. }
  1981. }
  1982. else
  1983. {
  1984. cbGoldCard[(index - 2) / 2] -= 4;
  1985. //1.是主金牌,根据花牌个数进行算分
  1986. if (index == RealGold)
  1987. {
  1988. //根据花牌个数进行计算
  1989. switch (cbHuaCardIndex[index / 2])
  1990. {
  1991. case 1: //一张花牌的情况
  1992. {
  1993. cbItemPoint = 24;
  1994. HandPoint += 24;
  1995. cbHuaCardIndex[index / 2] -= 1;
  1996. break;
  1997. }
  1998. case 2: //两张花牌情况
  1999. {
  2000. cbItemPoint = 28;
  2001. HandPoint += 28;
  2002. cbHuaCardIndex[index / 2] -= 2;
  2003. break;
  2004. }
  2005. case 3: //两张花牌情况
  2006. {
  2007. cbItemPoint = 36;
  2008. HandPoint += 36;
  2009. cbHuaCardIndex[index / 2] -= 3;
  2010. break;
  2011. }
  2012. case 4: //两张花牌情况
  2013. {
  2014. cbItemPoint = 48;
  2015. HandPoint += 48;
  2016. cbHuaCardIndex[index / 2] -= 4;
  2017. break;
  2018. }
  2019. }
  2020. }
  2021. //非主金的牌
  2022. else
  2023. {
  2024. //根据花牌个数进行计算
  2025. switch (cbHuaCardIndex[index / 2])
  2026. {
  2027. case 1: //一张花牌的情况
  2028. {
  2029. cbItemPoint = 12;
  2030. HandPoint += 12;
  2031. cbHuaCardIndex[index / 2] -= 1;
  2032. break;
  2033. }
  2034. case 2: //两张花牌情况
  2035. {
  2036. cbItemPoint = 14;
  2037. HandPoint += 14;
  2038. cbHuaCardIndex[index / 2] -= 2;
  2039. break;
  2040. }
  2041. case 3: //两张花牌情况
  2042. {
  2043. cbItemPoint = 18;
  2044. HandPoint += 18;
  2045. cbHuaCardIndex[index / 2] -= 3;
  2046. break;
  2047. }
  2048. case 4: //两张花牌情况
  2049. {
  2050. cbItemPoint = 24;
  2051. HandPoint += 24;
  2052. cbHuaCardIndex[index / 2] -= 4;
  2053. break;
  2054. }
  2055. }
  2056. }
  2057. }
  2058. }
  2059. //普通牌2.1红牌算4胡,2.2黑牌算2胡
  2060. else
  2061. {
  2062. //2.1红牌,只有上,大,人,可,知,礼六种情况+4
  2063. if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20)
  2064. {
  2065. cbItemPoint = 4;
  2066. HandPoint += 4;
  2067. }
  2068. //2.2黑牌+2
  2069. else
  2070. {
  2071. cbItemPoint = 2;
  2072. HandPoint += 2;
  2073. }
  2074. }
  2075. }
  2076. //三张相同的:1.是金牌,2.普通牌
  2077. else if (pAnalyseItem->cbWeaveKind[k] == WIK_DUI)
  2078. {
  2079. //是金牌:1,3,5,7,9的情况
  2080. if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  2081. {
  2082. if (index == 0 || index == 8)
  2083. {
  2084. //根据花牌个数进行计算
  2085. switch (cbHuaCardIndex[index / 2])
  2086. {
  2087. case 0: //0张花牌的情况
  2088. {
  2089. cbItemPoint = 1;
  2090. HandPoint += 1;
  2091. cbHuaCardIndex[index / 2] -= 0;
  2092. break;
  2093. }
  2094. case 1: //1张花牌情况
  2095. {
  2096. cbItemPoint = 2;
  2097. HandPoint += 2;
  2098. cbHuaCardIndex[index / 2] -= 1;
  2099. break;
  2100. }
  2101. case 2: //2张花牌情况
  2102. {
  2103. cbItemPoint = 3;
  2104. HandPoint += 3;
  2105. cbHuaCardIndex[index / 2] -= 2;
  2106. break;
  2107. }
  2108. }
  2109. }
  2110. else
  2111. {
  2112. cbGoldCard[(index - 2) / 2] -= 3;
  2113. //1.是主金牌,根据花牌个数进行算分
  2114. if (index == RealGold)
  2115. {
  2116. //根据花牌个数进行计算
  2117. switch (cbHuaCardIndex[index / 2])
  2118. {
  2119. case 0: //0张花牌的情况
  2120. {
  2121. cbItemPoint = 10;
  2122. HandPoint += 10;
  2123. cbHuaCardIndex[index / 2] -= 0;
  2124. break;
  2125. }
  2126. case 1: //1张花牌情况
  2127. {
  2128. cbItemPoint = 12;
  2129. HandPoint += 12;
  2130. cbHuaCardIndex[index / 2] -= 1;
  2131. break;
  2132. }
  2133. case 2: //2张花牌情况
  2134. {
  2135. cbItemPoint = 14;
  2136. HandPoint += 14;
  2137. cbHuaCardIndex[index / 2] -= 2;
  2138. break;
  2139. }
  2140. case 3: //2张花牌情况
  2141. {
  2142. if (LaiZi[(index - 2) / 2] == 2)
  2143. {
  2144. cbItemPoint = 24;
  2145. HandPoint += 24;
  2146. cbHuaCardIndex[index / 2] -= 3;
  2147. break;
  2148. }
  2149. else
  2150. {
  2151. cbItemPoint = 18;
  2152. HandPoint += 18;
  2153. cbHuaCardIndex[index / 2] -= 3;
  2154. break;
  2155. }
  2156. }
  2157. case 4: //2张花牌情况
  2158. {
  2159. if (LaiZi[(index - 2) / 2] == 2)
  2160. {
  2161. cbItemPoint = 24;
  2162. HandPoint += 24;
  2163. cbHuaCardIndex[index / 2] -= 3;
  2164. break;
  2165. }
  2166. else
  2167. {
  2168. cbItemPoint = 18;
  2169. HandPoint += 18;
  2170. cbHuaCardIndex[index / 2] -= 3;
  2171. break;
  2172. }
  2173. }
  2174. default:
  2175. {
  2176. ASSERT(false);
  2177. break;
  2178. }
  2179. }
  2180. }
  2181. //1.2非主金的花牌
  2182. else
  2183. {
  2184. //根据花牌个数进行计算
  2185. switch (cbHuaCardIndex[index / 2])
  2186. {
  2187. case 0: //0张花牌的情况
  2188. {
  2189. cbItemPoint = 5;
  2190. HandPoint += 5;
  2191. cbHuaCardIndex[index / 2] -= 0;
  2192. break;
  2193. }
  2194. case 1: //1张花牌情况
  2195. {
  2196. cbItemPoint = 6;
  2197. HandPoint += 6;
  2198. cbHuaCardIndex[index / 2] -= 1;
  2199. break;
  2200. }
  2201. case 2: //2张花牌情况
  2202. {
  2203. cbItemPoint = 7;
  2204. HandPoint += 7;
  2205. cbHuaCardIndex[index / 2] -= 2;
  2206. break;
  2207. }
  2208. case 3: //2张花牌情况
  2209. {
  2210. if (LaiZi[(index - 2) / 2] == 2)
  2211. {
  2212. cbItemPoint = 12;
  2213. HandPoint += 12;
  2214. cbHuaCardIndex[index / 2] -= 3;
  2215. break;
  2216. }
  2217. else
  2218. {
  2219. cbItemPoint = 9;
  2220. HandPoint += 9;
  2221. cbHuaCardIndex[index / 2] -= 3;
  2222. break;
  2223. }
  2224. }
  2225. case 4: //2张花牌情况
  2226. {
  2227. if (LaiZi[(index - 2) / 2] == 2)
  2228. {
  2229. cbItemPoint = 12;
  2230. HandPoint += 12;
  2231. cbHuaCardIndex[index / 2] -= 3;
  2232. break;
  2233. }
  2234. else
  2235. {
  2236. cbItemPoint = 9;
  2237. HandPoint += 9;
  2238. cbHuaCardIndex[index / 2] -= 3;
  2239. break;
  2240. }
  2241. }
  2242. }
  2243. }
  2244. }
  2245. }
  2246. //2.普通牌
  2247. else
  2248. {
  2249. //2.1红牌,只有上,大,人,可,知,礼六种情况+2
  2250. if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20)
  2251. {
  2252. HandPoint += 2;
  2253. cbItemPoint = 2;
  2254. }
  2255. //2.2黑牌+1
  2256. else
  2257. {
  2258. HandPoint += 1;
  2259. cbItemPoint = 1;
  2260. }
  2261. }
  2262. }
  2263. //句子判断,只统计上大人,可知礼的个数和剩下的经牌个数
  2264. else if (pAnalyseItem->cbWeaveKind[k] == WIK_QI_TA)
  2265. {
  2266. //上大人/可知礼组合 +1
  2267. if (index == 12 || index == 18)
  2268. {
  2269. HandPoint += 1;
  2270. cbItemPoint = 1;
  2271. }
  2272. }
  2273. pAnalyseItem->cbKindPoint[k] = cbItemPoint;
  2274. }
  2275. //3 数剩下的金牌的个数
  2276. for (BYTE t = 0; t < 3; t++)
  2277. {
  2278. //计算花牌的点数
  2279. if (cbHuaCardIndex[t + 1] > 0)
  2280. {
  2281. //除去经牌中花牌的个数
  2282. cbGoldCard[t] -= cbHuaCardIndex[t + 1];
  2283. //主金情况
  2284. if (((t * 2) + 2) == RealGold)
  2285. {
  2286. HandPoint += cbHuaCardIndex[t + 1] * 4;
  2287. }
  2288. else
  2289. {
  2290. HandPoint += cbHuaCardIndex[t + 1] * 2;
  2291. }
  2292. }
  2293. //计算白皮经牌的点数
  2294. if (cbGoldCard[t] > 0)
  2295. {
  2296. //主金情况白皮的*2
  2297. if (((t * 2) + 2) == RealGold)
  2298. {
  2299. HandPoint += cbGoldCard[t] * 2;
  2300. }
  2301. //非主金,白皮的*1
  2302. else
  2303. {
  2304. HandPoint += cbGoldCard[t] * 1;
  2305. }
  2306. }
  2307. }
  2308. //4 数剩下的花牌的个数
  2309. for (BYTE t = 0; t < 2; t++)
  2310. {
  2311. if (cbHuaCardIndex[t * 4] > 0)
  2312. {
  2313. HandPoint += cbHuaCardIndex[t * 4] * 1;
  2314. }
  2315. }
  2316. //#ifdef _DEBUG
  2317. // m_Debug.PrintValidKindItemPointBeforeMessage(pAnalyseItem,WeavePoint,HandPoint);
  2318. //#endif
  2319. //校正手中牌的胡点:如果胡牌组合中,别人打出的一张牌与自己手中牌形成三张一样的,只能将其当作倒下的牌算点数
  2320. //将手中牌每一种组合进行转换,判断所供牌是否在其中
  2321. bool bFalgContinue = false;//表示这个打出牌是否会换统,当换统不影响统的个数,还是可以胡的,否则不可以胡
  2322. if (cbCurrentCard != 0)
  2323. {
  2324. //得到所供的牌
  2325. BYTE cbCurrentCardIndex = SwitchToCardIndex(cbCurrentCard);
  2326. //首先是丫口判断,如果所供的牌在丫口中,不进行校正
  2327. if ((cbCurrentCardIndex != pAnalyseItem->cbCardEye[0]) && (cbCurrentCardIndex != pAnalyseItem->cbCardEye[1]))
  2328. {
  2329. bool Qi_Ta = false;
  2330. //分析别人出的牌是否在句牌中
  2331. for (BYTE l = cbItemCount; l < 8; l++)
  2332. {
  2333. //得到WIK_QI_TA组合类型的所有索引,判断是否有所供的牌
  2334. if (pAnalyseItem->cbWeaveKind[l] == WIK_QI_TA)
  2335. {
  2336. BYTE cbWeaveIndex[5] = { -1, -1, -1, -1, -1 };
  2337. BYTE cbWeaveCount = GetWeaveIndex(pAnalyseItem->cbWeaveKind[l], pAnalyseItem->cbCenterCard[l], cbWeaveIndex);
  2338. //判断所供的牌是否在WIK_QI_TA类型中,如果在,直接跳出不用校正
  2339. for (BYTE n = 0; n < cbWeaveCount; n++)
  2340. {
  2341. if (cbCurrentCardIndex == cbWeaveIndex[n])
  2342. {
  2343. Qi_Ta = true;
  2344. break;
  2345. }
  2346. }
  2347. //如果在句牌中找到了别人所打的牌跳出循环
  2348. if (Qi_Ta == true) break;
  2349. }
  2350. //得到WIK_SI_TONG组合类型中的所有索引,判断所供的牌是否是在其中,如果是,不能胡牌
  2351. else if (pAnalyseItem->cbWeaveKind[l] == WIK_SI_TONG || pAnalyseItem->cbWeaveKind[l] == WIK_WU_TONG)
  2352. {
  2353. if (pAnalyseItem->cbWeaveKind[l] == WIK_WU_TONG && cbCurrentCardIndex == pAnalyseItem->cbCenterCard[l])
  2354. {
  2355. //AfxMessageBox("对不起!最佳胡牌组合分析得出,别人打出的牌形成四张的不能胡牌!");
  2356. bFalgContinue = true;
  2357. //return WIK_NULL;
  2358. }
  2359. if (pAnalyseItem->cbWeaveKind[l] == WIK_SI_TONG && cbCurrentCardIndex == pAnalyseItem->cbCenterCard[l] && cbCardIndexTemp[cbCurrentCardIndex] == 4)
  2360. {
  2361. bFalgContinue = true;
  2362. }
  2363. }
  2364. }
  2365. //如果在句牌中没有找到别人打的牌,再到对牌中找
  2366. if (Qi_Ta == false)
  2367. {
  2368. for (BYTE i = cbItemCount; i < 8; i++)
  2369. {
  2370. //WIK_DUI
  2371. if (pAnalyseItem->cbWeaveKind[i] == WIK_DUI)
  2372. {
  2373. //如果手中对牌与所供牌相同,进行胡点校正
  2374. if (cbCurrentCardIndex == pAnalyseItem->cbCenterCard[i])
  2375. {
  2376. //如果所供牌是金牌分:1.主金,2.普通金牌
  2377. if (cbCurrentCardIndex == 2 || cbCurrentCardIndex == 4 || cbCurrentCardIndex == 6)
  2378. {
  2379. //1.主金减4胡
  2380. if (cbCurrentCardIndex == RealGold)
  2381. {
  2382. HandPoint -= 4; //HuPoint-=4;
  2383. pAnalyseItem->cbKindPoint[i] -= 4;
  2384. }
  2385. //2.普通金牌减2胡
  2386. else
  2387. {
  2388. HandPoint -= 2; //HuPoint -=2;
  2389. pAnalyseItem->cbKindPoint[i] -= 2;
  2390. }
  2391. }
  2392. //普通牌分,总胡数减1
  2393. else
  2394. {
  2395. HandPoint -= 1;
  2396. pAnalyseItem->cbKindPoint[i] -= 1;
  2397. //HuPoint -=1;
  2398. }
  2399. //处理完成后,结束循环
  2400. break;
  2401. }
  2402. }
  2403. }
  2404. }
  2405. }
  2406. }
  2407. if (bFalgContinue)
  2408. {
  2409. continue;
  2410. }
  2411. //以该经牌做为主经是否大于前面的点数
  2412. //保存本组合中最大的点数及其对应的主精牌
  2413. if ((WeavePoint + HandPoint) > cbMaxPoint)
  2414. {
  2415. cbMaxPoint = WeavePoint + HandPoint;
  2416. cbMaxPointGoldCard = RealGold;
  2417. }
  2418. //先设置本循环中计算的点数及主精
  2419. pAnalyseItem->cbPoint = WeavePoint + HandPoint;
  2420. pAnalyseItem->cbGoldCard = RealGold;
  2421. }
  2422. //修正:设置本组合中真正最大的点数及其对应的主精牌
  2423. pAnalyseItem->cbPoint = cbMaxPoint;
  2424. pAnalyseItem->cbGoldCard = cbMaxPointGoldCard;
  2425. }
  2426. //在此加上一项特殊的胡牌判断--7点胡牌
  2427. //分析胡牌是否是7点特殊胡牌
  2428. //1、就是用户手中所有的牌里,没有357的金,没有花乙和花九;
  2429. //2、就是用户桌面上的组合牌里,要对上三对黑色字的牌,这三对黑色字的牌算一个胡
  2430. //3、用户手中有三张及以上的组合牌,或桌面的组合牌中有四张及以上的招牌,要有一个红色字牌的一坎,比如三个上
  2431. //4、并且最后胡牌是手里刚好是7个胡.
  2432. //for (INT_PTR t = 0; t < AnalyseItemArray.GetCount(); t++)
  2433. //{
  2434. // tagAnalyseItem_hua *pAnalyseItem = &AnalyseItemArray[t];
  2435. // //if(pAnalyseItem->cbPoint<10)
  2436. // //{
  2437. // // CString str;
  2438. // // str.Format("现在的点数为:%d",pAnalyseItem->cbPoint);
  2439. // // AfxMessageBox(str);
  2440. // //}
  2441. // if (pAnalyseItem->cbPoint + 1 == 7)
  2442. // {
  2443. // bool bHaveHuGold = true; //用户整个牌中,是否没有357的金,没有花乙和花九,默认是有
  2444. // BYTE cbBlackDuiCount = 0; //用户桌面的组合牌中,是否有三对以上的黑对牌,默认为0
  2445. // BYTE cbReadDuiCount = 0; //用户手中三张相同的红牌或桌面上招的红牌
  2446. // //1、就是手里没有357的金,没有花乙和花九
  2447. // BYTE cbUserHuaCardIndex[5]; //保存用户牌中花精的个数
  2448. // BYTE cbUserGoldCardIndex[5]; //保存用户牌中精牌的个数
  2449. // ZeroMemory(cbUserHuaCardIndex, sizeof(cbUserHuaCardIndex));
  2450. // ZeroMemory(cbUserGoldCardIndex, sizeof(cbUserGoldCardIndex));
  2451. // //将用户手中牌中的数据统计到数组中
  2452. // for (BYTE i = 0; i < 5; i++)
  2453. // {
  2454. // cbUserGoldCardIndex[i] = cbCardIndexTemp[i * 2];
  2455. // cbUserHuaCardIndex[i] = cbTempHuaCardIndex[i];
  2456. // }
  2457. // //将用户组合牌中的数据统计到数组中
  2458. // for (BYTE i = 0; i < cbItemCount; i++)
  2459. // {
  2460. // BYTE index = pAnalyseItem->cbCenterCard[i];
  2461. // if (index == 0 || index == 2 || index == 4 || index == 6 || index == 8)
  2462. // {
  2463. // if (pAnalyseItem->cbWeaveKind[i] == WIK_SI_ZHAO)
  2464. // {
  2465. // cbUserGoldCardIndex[i] += 4;
  2466. // cbUserHuaCardIndex[i] += cbTempWeaveHuaIndex[i];
  2467. // }
  2468. // else if (pAnalyseItem->cbWeaveKind[i] == WIK_SAN_ZHAO)
  2469. // {
  2470. // cbUserGoldCardIndex[i] += 5;
  2471. // cbUserHuaCardIndex[i] += cbTempWeaveHuaIndex[i];
  2472. // }
  2473. // else if (pAnalyseItem->cbWeaveKind[i] == WIK_DUI)
  2474. // {
  2475. // cbUserGoldCardIndex[i] += 3;
  2476. // cbUserHuaCardIndex[i] += cbTempWeaveHuaIndex[i];
  2477. // }
  2478. // }
  2479. // }
  2480. // //用户没有357牌
  2481. // if (cbUserGoldCardIndex[1] == 0 && cbUserGoldCardIndex[2] == 0 && cbUserGoldCardIndex[3] == 0)
  2482. // {
  2483. // //用户没有花1和花9
  2484. // if (cbUserHuaCardIndex[0] == 0 && cbUserHuaCardIndex[4] == 0)
  2485. // {
  2486. // bHaveHuGold = false; //满足第一项:没有357的金,没有花乙和花九
  2487. // }
  2488. // }
  2489. // //统计用户组合牌中黑色的对牌数--用户桌面上的对牌中,黑对牌的数目
  2490. // for (BYTE i = 0; i < cbItemCount; i++)
  2491. // {
  2492. // if (pAnalyseItem->cbWeaveKind[i] == WIK_DUI)
  2493. // {
  2494. // BYTE index = pAnalyseItem->cbCenterCard[i];
  2495. // //红色的只有上大人[12,13,14],可知礼[18,19,20],三五七[2,4,6]
  2496. // if (index != 12 && index != 13 && index != 14 && index != 18 && index != 19 && index != 20 && index != 2 && index != 4 && index != 6)
  2497. // {
  2498. // cbBlackDuiCount++; //满足第二项:用户桌面的对牌中,黑队牌的数目
  2499. // }
  2500. // }
  2501. // }
  2502. // //统计用户手中的对、统型中的红组合数目,及桌面上红招组合的数目
  2503. // //用户桌面中的红三招或红四招数目
  2504. // for (BYTE i = 0; i < cbItemCount; i++)
  2505. // {
  2506. // BYTE cbWeaveKind = pAnalyseItem->cbWeaveKind[i];
  2507. // if (cbWeaveKind == WIK_SAN_ZHAO || cbWeaveKind == WIK_SI_ZHAO)
  2508. // {
  2509. // BYTE index = pAnalyseItem->cbCenterCard[i];
  2510. // //红色的只有上大人[12,13,14],可知礼[18,19,20],三五七[2,4,6]
  2511. // if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20 || index == 2 || index == 4 || index == 6)
  2512. // {
  2513. // cbReadDuiCount++;
  2514. // }
  2515. // }
  2516. // }
  2517. // //用户手中红对、红四统、红五统的数目
  2518. // for (BYTE i = cbItemCount; i < 9; i++)
  2519. // {
  2520. // BYTE cbWeaveKind = pAnalyseItem->cbWeaveKind[i];
  2521. // if (cbWeaveKind == WIK_DUI || cbWeaveKind == WIK_SI_TONG || cbWeaveKind == WIK_WU_TONG)
  2522. // {
  2523. // BYTE index = pAnalyseItem->cbCenterCard[i];
  2524. // //红色的只有上大人[12,13,14],可知礼[18,19,20],三五七[2,4,6]
  2525. // if (index == 12 || index == 13 || index == 14 || index == 18 || index == 19 || index == 20 || index == 2 || index == 4 || index == 6)
  2526. // {
  2527. // cbReadDuiCount++;
  2528. // }
  2529. // }
  2530. // }
  2531. // //当满足四条规则时,应该将其6点数修改为32点
  2532. // if (bHaveHuGold == false && cbBlackDuiCount >= 3 && cbReadDuiCount >= 1)
  2533. // {
  2534. // pAnalyseItem->cbPoint = 32;
  2535. // }
  2536. // }
  2537. //}
  2538. //从所有的胡牌组合中找出胡点最大的组合
  2539. INT_PTR BestIndex = 0;
  2540. //对每一个胡牌组合进行比较,找出最佳胡牌组合
  2541. for (INT_PTR i = 0; i < AnalyseItemArray.GetCount(); i++)
  2542. {
  2543. if (AnalyseItemArray[i].cbPoint > AnalyseItemArray[BestIndex].cbPoint)
  2544. {
  2545. BestIndex = i;
  2546. }
  2547. }
  2548. BestAnalyseItem.cbPoint = AnalyseItemArray[BestIndex].cbPoint;
  2549. BestAnalyseItem.cbGoldCard = AnalyseItemArray[BestIndex].cbGoldCard;
  2550. //最好保存该种情况下的胡牌组合,以便别人算分
  2551. CopyMemory(&BestAnalyseItem, &AnalyseItemArray[BestIndex], sizeof(tagAnalyseItem_hua));
  2552. return BestAnalyseItem.cbPoint;
  2553. // if (BestAnalyseItem.cbPoint < 17)
  2554. // {
  2555. // return WIK_NULL;
  2556. // }
  2557. //
  2558. // ChiHuResult.IsHu = true;
  2559. // ChiHuResult.HuScore = 2 + ((BestAnalyseItem.cbPoint - 17) / 5) * 2;
  2560. // ChiHuResult.bHuPoint = BestAnalyseItem.cbPoint; //胡牌点数
  2561. // ChiHuResult.bRealGold = BestAnalyseItem.cbGoldCard;
  2562. // CopyMemory(&ChiHuResult.AnalyseItem, &BestAnalyseItem, sizeof(tagAnalyseItem_hua));
  2563. //
  2564. //#ifdef _DEBUG
  2565. // //m_Debug.PrintHuCardMessage(&BestAnalyseItem);
  2566. // //CString csTemp;
  2567. // //csTemp.Format(L"分析:%s \r\n", BestAnalyseItem);
  2568. // //OutputDebugString(csTemp);
  2569. //#endif
  2570. // return WIK_CHI_HU;
  2571. }
  2572. //
  2573. bool CGameLogicZhiPai::IsYaKou(const BYTE cbCardIndex[], BYTE &FirstIndex, BYTE &SecondeIndex)
  2574. {
  2575. BYTE cbCardIndexTemp[MAX_INDEX_HUA];
  2576. ZeroMemory(cbCardIndexTemp, sizeof(cbCardIndexTemp));
  2577. for (BYTE i = 0; i<MAX_INDEX_HUA; i++)
  2578. {
  2579. cbCardIndexTemp[i] = cbCardIndex[i];
  2580. }
  2581. //CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  2582. //统计数组中的个数要为2
  2583. WORD cbCardCount = 0;
  2584. for (BYTE i = 0; i<MAX_INDEX_HUA; i++) cbCardCount += cbCardIndexTemp[i];
  2585. //CString sz;
  2586. //sz.Format("剩下的牌个数为:%d", cbCardCount);
  2587. //AfxMessageBox(sz);
  2588. if (cbCardCount != 2) return false;
  2589. //ASSERT(cbCardCount == 2);
  2590. //if (cbCardCount != 2) return false;
  2591. // BYTE FirstIndex = -1,SecondeIndex = -1;
  2592. //丫口为半句话
  2593. for (BYTE i = 0; i<MAX_INDEX_HUA; i++)
  2594. {
  2595. if (cbCardIndexTemp[i] != 0)
  2596. {
  2597. FirstIndex = i;
  2598. cbCardIndexTemp[i]--;
  2599. break;
  2600. }
  2601. }
  2602. //找下一张牌
  2603. for (BYTE i = 0; i<MAX_INDEX_HUA; i++)
  2604. {
  2605. if (cbCardIndexTemp[i] != 0)
  2606. {
  2607. SecondeIndex = i;
  2608. cbCardIndexTemp[i]--;
  2609. break;
  2610. }
  2611. }
  2612. //CString sz;
  2613. //sz.Format("第一个索引为:%d,第二个索引为:%d", FirstIndex, SecondeIndex);
  2614. //AfxMessageBox(sz);
  2615. //判断是不是丫口
  2616. //1.如果两张牌都是数字的情况下,相减绝对值必须<=2 单独考虑七,十,
  2617. if (FirstIndex < 10 && SecondeIndex <10)
  2618. {
  2619. //特例:七,十
  2620. if ((FirstIndex == 6 && SecondeIndex == 9) || (FirstIndex == 9 && SecondeIndex == 6)) return true;
  2621. //其他情况按数字组合算,相减绝对值必须<=2
  2622. if (Abs(FirstIndex, SecondeIndex) <= 2) return true;
  2623. }
  2624. else
  2625. {
  2626. //2.有数字和字的情况下
  2627. //孔,乙,己
  2628. if ((FirstIndex == 10) && (SecondeIndex == 10 || SecondeIndex == 0 || SecondeIndex == 11)) return true;
  2629. if ((FirstIndex == 0) && (SecondeIndex == 10 || SecondeIndex == 0 || SecondeIndex == 11)) return true;
  2630. if ((FirstIndex == 11) && (SecondeIndex == 10 || SecondeIndex == 0 || SecondeIndex == 11)) return true;
  2631. //上大人
  2632. if ((FirstIndex == 12) && (SecondeIndex == 12 || SecondeIndex == 13 || SecondeIndex == 14)) return true;
  2633. if ((FirstIndex == 13) && (SecondeIndex == 12 || SecondeIndex == 13 || SecondeIndex == 14)) return true;
  2634. if ((FirstIndex == 14) && (SecondeIndex == 12 || SecondeIndex == 13 || SecondeIndex == 14)) return true;
  2635. //化,三,千
  2636. if ((FirstIndex == 16) && (SecondeIndex == 16 || SecondeIndex == 2 || SecondeIndex == 17)) return true;
  2637. if ((FirstIndex == 2) && (SecondeIndex == 16 || SecondeIndex == 2 || SecondeIndex == 17)) return true;
  2638. if ((FirstIndex == 17) && (SecondeIndex == 16 || SecondeIndex == 2 || SecondeIndex == 17)) return true;
  2639. //七十土
  2640. if ((FirstIndex == 6) && (SecondeIndex == 6 || SecondeIndex == 9 || SecondeIndex == 15)) return true;
  2641. if ((FirstIndex == 9) && (SecondeIndex == 6 || SecondeIndex == 9 || SecondeIndex == 15)) return true;
  2642. if ((FirstIndex == 15) && (SecondeIndex == 6 || SecondeIndex == 9 || SecondeIndex == 15)) return true;
  2643. //八九子
  2644. if ((FirstIndex == 7) && (SecondeIndex == 7 || SecondeIndex == 8 || SecondeIndex == 21)) return true;
  2645. if ((FirstIndex == 8) && (SecondeIndex == 7 || SecondeIndex == 8 || SecondeIndex == 21)) return true;
  2646. if ((FirstIndex == 21) && (SecondeIndex == 7 || SecondeIndex == 8 || SecondeIndex == 21)) return true;
  2647. //可知礼
  2648. if ((FirstIndex == 18) && (SecondeIndex == 18 || SecondeIndex == 19 || SecondeIndex == 20)) return true;
  2649. if ((FirstIndex == 19) && (SecondeIndex == 18 || SecondeIndex == 19 || SecondeIndex == 20)) return true;
  2650. if ((FirstIndex == 20) && (SecondeIndex == 18 || SecondeIndex == 19 || SecondeIndex == 20)) return true;
  2651. }
  2652. return false;
  2653. }
  2654. BYTE CGameLogicZhiPai::Abs(BYTE cbFirst, BYTE cbSecond)
  2655. {
  2656. return (cbFirst > cbSecond) ? (cbFirst - cbSecond) : (cbSecond - cbFirst);
  2657. }
  2658. //编码
  2659. WORD CGameLogicZhiPai::GetValue(BYTE uNum, BYTE uFangShu, WORD PaiZhi)
  2660. {
  2661. WORD mcd = PaiZhi | (uFangShu << 6) | (uNum << 13);
  2662. return mcd;
  2663. }
  2664. //解码
  2665. BYTE CGameLogicZhiPai::DeCodeCard(const WORD cbCardData)
  2666. {
  2667. BYTE TempCardData = cbCardData & 0x003F;
  2668. return TempCardData;
  2669. }
  2670. //解码番薯
  2671. BYTE CGameLogicZhiPai::DeCodeFanshu(const WORD cbCardData)
  2672. {
  2673. BYTE fanshu = (cbCardData & 0x1FC0) >> 6;
  2674. return fanshu;
  2675. }
  2676. bool CGameLogicZhiPai::PeiPai(BYTE ParZhi[],BYTE nCount)
  2677. {
  2678. std::ifstream in;
  2679. std::string filename = "zuopai.dat";
  2680. in.open(filename);
  2681. if (!in.is_open())
  2682. {
  2683. return false;
  2684. }
  2685. switch (nCount)
  2686. {
  2687. case MAX_REPERTORY_HUA:
  2688. {
  2689. static BYTE TempCardData[MAX_REPERTORY_HUA];
  2690. ZeroMemory(TempCardData, sizeof(TempCardData));
  2691. BYTE tempCount = 0;
  2692. char ch[1];
  2693. while (!in.eof())
  2694. {
  2695. in.read(ch, 1);
  2696. TempCardData[tempCount++] = ch[0];
  2697. }
  2698. in.close();
  2699. if (tempCount < MAX_REPERTORY_HUA)
  2700. {
  2701. return false;
  2702. }
  2703. for (BYTE i = 0; i < MAX_REPERTORY_HUA; i++)
  2704. {
  2705. ASSERT(i < MAX_REPERTORY_HUA);
  2706. ParZhi[i] = TempCardData[MAX_REPERTORY_HUA - i - 1];
  2707. }
  2708. return true;
  2709. }
  2710. case MAX_REPERTORY_HUA_ONE:
  2711. {
  2712. static BYTE TempCardData[MAX_REPERTORY_HUA_ONE];
  2713. ZeroMemory(TempCardData, sizeof(TempCardData));
  2714. BYTE tempCount = 0;
  2715. char ch[1];
  2716. while (!in.eof())
  2717. {
  2718. in.read(ch, 1);
  2719. TempCardData[tempCount++] = ch[0];
  2720. }
  2721. in.close();
  2722. if (tempCount < MAX_REPERTORY_HUA_ONE)
  2723. {
  2724. return false;
  2725. }
  2726. for (BYTE i = 0; i < MAX_REPERTORY_HUA_ONE; i++)
  2727. {
  2728. ASSERT(i < MAX_REPERTORY_HUA_ONE);
  2729. ParZhi[i] = TempCardData[MAX_REPERTORY_HUA_ONE - i - 1];
  2730. }
  2731. return true;
  2732. }
  2733. case MAX_REPERTORY_HUA_TWO:
  2734. {
  2735. static BYTE TempCardData[MAX_REPERTORY_HUA_TWO];
  2736. ZeroMemory(TempCardData, sizeof(TempCardData));
  2737. BYTE tempCount = 0;
  2738. char ch[1];
  2739. while (!in.eof())
  2740. {
  2741. in.read(ch, 1);
  2742. TempCardData[tempCount++] = ch[0];
  2743. }
  2744. in.close();
  2745. if (tempCount < MAX_REPERTORY_HUA_TWO)
  2746. {
  2747. return false;
  2748. }
  2749. for (BYTE i = 0; i < MAX_REPERTORY_HUA_TWO; i++)
  2750. {
  2751. ASSERT(i < MAX_REPERTORY_HUA_TWO);
  2752. ParZhi[i] = TempCardData[MAX_REPERTORY_HUA_TWO - i - 1];
  2753. }
  2754. return true;
  2755. }
  2756. default:
  2757. break;
  2758. }
  2759. return false;
  2760. }
  2761. BYTE CGameLogicZhiPai::GetEndCard(BYTE cbCardIndex[MAX_INDEX_HUA])
  2762. {
  2763. for (BYTE i = MAX_INDEX_HUA - 1; i >= 0; i--)
  2764. {
  2765. if (cbCardIndex[i] > 0)
  2766. {
  2767. return SwitchToCardData(i);
  2768. }
  2769. }
  2770. ASSERT(false);
  2771. return 1;
  2772. }
  2773. /*
  2774. // 胡法分析函数
  2775. */
  2776. //将将胡
  2777. //bool CGameLogicZhiPai::IsJiangJiang(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount)
  2778. //{
  2779. // BYTE cbCardIndexTemp[MAX_INDEX];
  2780. // CopyMemory(cbCardIndexTemp, cbCardIndex, sizeof(cbCardIndexTemp));
  2781. // BYTE cbCardData[MAX_COUNT] = { 0 };
  2782. // BYTE Count = SwitchToCardData(cbCardIndexTemp, cbCardData);
  2783. // for (int i = Count - 1; i >= 0; i--)
  2784. // {
  2785. // if ((cbCardData[i] & MASK_VALUE) == 2)continue;
  2786. // else if ((cbCardData[i] & MASK_VALUE) == 5)continue;
  2787. // else if ((cbCardData[i] & MASK_VALUE) == 8)continue;
  2788. // else return false;
  2789. // }
  2790. // for (BYTE i = 0; i < cbWeaveCount; i++)
  2791. // {
  2792. // if (WeaveItem[i].cbWeaveKind == WIK_LIANG_PAI)continue;
  2793. // if (WeaveItem[i].cbWeaveKind&(WIK_LEFT | WIK_RIGHT | WIK_CENTER))
  2794. // return false;
  2795. // if ((WeaveItem[i].cbCenterCard&MASK_VALUE) == 2)continue;
  2796. // else if ((WeaveItem[i].cbCenterCard&MASK_VALUE) == 5)continue;
  2797. // else if ((WeaveItem[i].cbCenterCard&MASK_VALUE) == 8)continue;
  2798. // else return false;
  2799. // }
  2800. // return true;
  2801. //}
  2802. //全求人
  2803. //bool CGameLogicZhiPai::IsQuanQiuRen(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount)
  2804. //{
  2805. // BYTE cbCardCount = 0;
  2806. // BYTE cbCardData = 0;
  2807. // for (BYTE i = 0; i < MAX_INDEX; i++)
  2808. // {
  2809. // if (cbCardIndex[i] != 0)
  2810. // {
  2811. // cbCardCount += cbCardIndex[i];
  2812. // ++cbCardData;
  2813. // }
  2814. // }
  2815. // return (cbCardCount == 2 && cbCardData == 1);
  2816. //}
  2817. //七小对类型
  2818. //int CGameLogicZhiPai::TypeQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX])
  2819. //{
  2820. // int cbCount = 0;
  2821. // for (int i = 0; i < MAX_INDEX;i++)
  2822. // {
  2823. // if (cbCardIndex[i] == 4)
  2824. // ++cbCount;
  2825. // }
  2826. // int nHuType = CHR_QI_XIAO_DUI;
  2827. // return nHuType << cbCount;
  2828. //}
  2829. //大对子
  2830. //bool CGameLogicZhiPai::IsPengPeng(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount)
  2831. //{
  2832. // for (BYTE i = 0; i < cbItemCount; i++)
  2833. // {
  2834. // if (WeaveItem[i].cbWeaveKind&(WIK_LEFT | WIK_RIGHT | WIK_CENTER))
  2835. // return false;
  2836. // }
  2837. // BYTE cbCardCount = GetCardCount(cbCardIndex);
  2838. // BYTE DanCount = 0;
  2839. // BYTE DuiZiCount = 0;
  2840. // for (BYTE i = 0; i<MAX_INDEX; i++)
  2841. // {
  2842. // if (cbCardIndex[i] == 3)
  2843. // {
  2844. // DuiZiCount++;
  2845. // }
  2846. // if (cbCardIndex[i] == 2)
  2847. // {
  2848. // DanCount++;
  2849. // }
  2850. // }
  2851. // switch (cbCardCount)
  2852. // {
  2853. // case 2:
  2854. // if (DanCount == 1)
  2855. // return true;
  2856. // case 5:
  2857. // if (DuiZiCount == 1 && DanCount == 1)
  2858. // return true;
  2859. // case 8:
  2860. // if (DuiZiCount == 2 && DanCount == 1)
  2861. // return true;
  2862. // case 11:
  2863. // if (DuiZiCount == 3 && DanCount == 1)
  2864. // return true;
  2865. // case 14:
  2866. // if (DuiZiCount == 4 && DanCount == 1)
  2867. // return true;
  2868. // default:
  2869. // return false;
  2870. // }
  2871. // return false;
  2872. //}
  2873. //清一色牌
  2874. //bool CGameLogicZhiPai::IsQingYiSe(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbItemCount)
  2875. //{
  2876. // //胡牌判断
  2877. // BYTE cbCardColor = 0xFF;
  2878. // for (BYTE i = 0; i < MAX_INDEX; i++)
  2879. // {
  2880. // if (cbCardIndex[i] != 0)
  2881. // {
  2882. // //花色判断
  2883. // if (cbCardColor != 0xFF)
  2884. // return false;
  2885. // //设置花色
  2886. // cbCardColor = (SwitchToCardData(i)&MASK_COLOR);
  2887. // //设置索引
  2888. // i = (i / 9 + 1) * 9 - 1;
  2889. // }
  2890. // }
  2891. // //组合判断
  2892. // for (BYTE i = 0; i<cbItemCount; i++)
  2893. // {
  2894. // if (WeaveItem[i].cbWeaveKind == WIK_LIANG_PAI) continue;
  2895. // BYTE cbCenterCard = WeaveItem[i].cbCenterCard;
  2896. // if ((cbCenterCard&MASK_COLOR) != cbCardColor) return false;
  2897. // }
  2898. // return true;
  2899. //}
  2900. ////七小对牌
  2901. //bool CGameLogicZhiPai::IsQiXiaoDui(const BYTE cbCardIndex[MAX_INDEX], const tagWeaveItem WeaveItem[], const BYTE cbWeaveCount)
  2902. //{
  2903. // //组合判断
  2904. // for (BYTE i = 0; i < cbWeaveCount; i++)
  2905. // {
  2906. // return false;
  2907. // }
  2908. // //单牌数目
  2909. // BYTE cbReplaceCount = 0;
  2910. // //临时数据
  2911. // BYTE cbCardIndexTemp[MAX_INDEX];
  2912. // CopyMemory(cbCardIndexTemp,cbCardIndex,sizeof(cbCardIndexTemp));
  2913. // //计算单牌
  2914. // for (BYTE i=0;i<MAX_INDEX;i++)
  2915. // {
  2916. // //单牌统计
  2917. // if (cbCardIndexTemp[i] == 1 || cbCardIndexTemp[i] == 3) cbReplaceCount++;
  2918. // }
  2919. // if(cbReplaceCount > 0 )
  2920. // return false;
  2921. // return true;
  2922. //}
  2923. //////////////////////////////////////////////////////////////////////////