GameLogicController.js 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190
  1. // [[
  2. // 斗地主游戏逻辑
  3. // 2016.6
  4. // ]]
  5. // 扑克类型
  6. var CT_ERROR = 0; // 错误类型
  7. var CT_SINGLE = 1; // 单牌类型
  8. var CT_DOUBLE = 2; // 对牌类型
  9. var CT_THREE = 3; // 三条类型
  10. var CT_SINGLE_LINE = 4; // 单连类型
  11. var CT_DOUBLE_LINE = 5; // 对连类型
  12. var CT_THREE_LINE = 6; // 三连类型
  13. var CT_THREE_TAKE_ONE = 7; // 三带一单
  14. var CT_THREE_TAKE_TWO = 8; // 三带一对
  15. var CT_FOUR_TAKE_ONE = 9; // 四带两单
  16. var CT_FOUR_TAKE_TWO = 10; // 四带两对
  17. var CT_BOMB_CARD = 11; // 炸弹类型
  18. var CT_MISSILE_CARD = 12; // 火箭类型
  19. let GameLogicController = {
  20. _CardData: [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, // 方块
  21. 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, // 梅花
  22. 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, // 红桃
  23. 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, // 黑桃
  24. 0x4E, 0x4F], // 小王,大王
  25. // 创建空扑克数组
  26. emptyCardList: function (count) {
  27. var tmp = [];
  28. for (var i = 1; i < count; i++) {
  29. tmp[i] = 0;
  30. }
  31. return tmp
  32. },
  33. // 获取整数
  34. ceil: function (a, b) {
  35. return Math.ceil(a / b) - 1;
  36. },
  37. // 获取牌值(1-15)
  38. GetCardValue: function (nCardData) {
  39. return nCardData % 16;
  40. },
  41. // 获取花色(1-5)
  42. GetCardColor: function (nCardData) {
  43. return nCardData & 0XF0;
  44. },
  45. // 逻辑牌值(大小王、2、A、K、Q)
  46. GetCardLogicValue: function (nCardData) {
  47. var nCardValue = this.GetCardValue(nCardData);
  48. var nCardColor = this.GetCardColor(nCardData);
  49. if (nCardColor == 0x40) {
  50. return nCardValue + 2;
  51. }
  52. return (0 < nCardValue && nCardValue <= 2) ? (nCardValue + 13) : nCardValue;
  53. },
  54. // // 获取牌序 0x4F大王 0x4E小王 nil牌背
  55. // GetCardIndex: function(nCardData) {
  56. // if (nCardData == 0x4E) {
  57. // return 53;
  58. // } else if (nCardData == 0x4F) {
  59. // return 54;
  60. // } else if (nCardData == null) {
  61. // return 55;
  62. // }
  63. // var nCardValue = this.GetCardValue(nCardData);
  64. // var nCardColor = this.GetCardColor(nCardData);
  65. // nCardColor = nCardColor >> 4;
  66. // return nCardColor * 13 + nCardValue;
  67. // },
  68. //扑克排序
  69. SortCardList: function (cbCardData, cbCardCount, cbSortType) {
  70. var cbSortValue = [];
  71. for (var i = 0; i < cbCardCount; i++) {
  72. var value = this.GetCardLogicValue(cbCardData[i]);
  73. cbSortValue[i] = value;
  74. }
  75. if (cbSortType == 0) {//大小排序
  76. for (var i = 0; i < cbCardCount - 1; i++) {
  77. for (var j = 0; j < cbCardCount - 1; j++) {
  78. if ((cbSortValue[j] < cbSortValue[j + 1]) || (cbSortValue[j] == cbSortValue[j + 1] && cbCardData[j] < cbCardData[j + 1])) {
  79. var temp = cbSortValue[j];
  80. cbSortValue[j] = cbSortValue[j + 1];
  81. cbSortValue[j + 1] = temp;
  82. var temp2 = cbCardData[j];
  83. cbCardData[j] = cbCardData[j + 1];
  84. cbCardData[j + 1] = temp2;
  85. }
  86. }
  87. }
  88. }
  89. return cbCardData;
  90. },
  91. //分析有序扑克
  92. AnalysebCardData: function (cbCardData, cbCardCount) {
  93. //相同个数
  94. var cbBlockCount = [0, 0, 0, 0, 0];
  95. //相同的牌
  96. var cbCardDatas = [[], [], [], [], []];
  97. var i = 0;
  98. while (i < cbCardCount) {
  99. var cbSameCount = 1;
  100. var cbLogicValue = this.GetCardLogicValue(cbCardData[i]);
  101. var j = i + 1;
  102. while (j < cbCardCount) {
  103. var cbLogicValue2 = this.GetCardLogicValue(cbCardData[j]);
  104. if (cbLogicValue != cbLogicValue2) {
  105. break;
  106. }
  107. cbSameCount = cbSameCount + 1;
  108. j = j + 1;
  109. }
  110. if (cbSameCount > 4) {
  111. cc.log("这儿有错误");
  112. return;
  113. }
  114. cbBlockCount[cbSameCount] = cbBlockCount[cbSameCount] + 1;
  115. var index = cbBlockCount[cbSameCount] - 1;
  116. for (var k = 1; k <= cbSameCount; k++) {
  117. cbCardDatas[cbSameCount][index * cbSameCount + k] = cbCardData[i + k - 1];
  118. }
  119. i = i + cbSameCount;
  120. }
  121. //分析结构
  122. var tagAnalyseResult = [0, cbBlockCount, cbCardDatas];
  123. return tagAnalyseResult;
  124. },
  125. //获取类型
  126. GetCardType: function (cbCardData, cbCardCount) {
  127. cbCardData = this.SortCardList(cbCardData, cbCardCount, 0);
  128. //简单牌型
  129. if (cbCardCount == 0) { //空牌
  130. return CT_ERROR;
  131. } else if (cbCardCount == 1) { //单牌
  132. return CT_SINGLE;
  133. } else if (cbCardCount == 2) { //对牌火箭
  134. if (cbCardData[0] == 0x4F && cbCardData[1] == 0x4E) {
  135. return CT_MISSILE_CARD;
  136. }
  137. if (this.GetCardLogicValue(cbCardData[0]) == this.GetCardLogicValue(cbCardData[1])) {
  138. return CT_DOUBLE;
  139. }
  140. }
  141. var tagAnalyseResult = {};
  142. tagAnalyseResult = this.AnalysebCardData(cbCardData, cbCardCount);
  143. //四牌判断
  144. if (tagAnalyseResult[1][4] > 0) {
  145. if (tagAnalyseResult[1][4] == 1 && cbCardCount == 4) {
  146. return CT_BOMB_CARD;
  147. }
  148. if (tagAnalyseResult[1][4] == 1 && cbCardCount == 6) {
  149. return CT_FOUR_TAKE_ONE;
  150. }
  151. if ((tagAnalyseResult[1][4] == 1 && cbCardCount == 8) && tagAnalyseResult[1][2] == 2) {
  152. return CT_FOUR_TAKE_TWO;
  153. }
  154. return CT_ERROR;
  155. }
  156. //三牌判断
  157. if (tagAnalyseResult[1][3] > 0) {
  158. if (tagAnalyseResult[1][3] > 1) {
  159. var cbCard = tagAnalyseResult[2][3][1];
  160. var cbFirstLogicValue = this.GetCardLogicValue(cbCard);
  161. if (cbFirstLogicValue >= 15) {
  162. return CT_ERROR;
  163. }
  164. for (var i = 2; i <= tagAnalyseResult[1][3]; i++) {
  165. var cbCard = tagAnalyseResult[2][3][(i - 1) * 3 + 1];
  166. var cbNextLogicValue = this.GetCardLogicValue(cbCard);
  167. if (cbFirstLogicValue != cbNextLogicValue + i - 1) {
  168. return CT_ERROR;
  169. }
  170. }
  171. } else if (cbCardCount == 3) {
  172. return CT_THREE;
  173. }
  174. if (tagAnalyseResult[1][3] * 3 == cbCardCount) {
  175. return CT_THREE_LINE;
  176. }
  177. if (tagAnalyseResult[1][3] * 4 == cbCardCount) {
  178. return CT_THREE_TAKE_ONE;
  179. }
  180. if (tagAnalyseResult[1][3] * 5 == cbCardCount && tagAnalyseResult[1][2] == tagAnalyseResult[1][3]) {
  181. return CT_THREE_TAKE_TWO;
  182. }
  183. return CT_ERROR;
  184. }
  185. //两张判断
  186. if (tagAnalyseResult[1][2] >= 3) {
  187. var cbCard = tagAnalyseResult[2][2][1];
  188. var cbFirstLogicValue = this.GetCardLogicValue(cbCard);
  189. if (cbFirstLogicValue >= 15) {
  190. return CT_ERROR;
  191. }
  192. for (var i = 2; i <= tagAnalyseResult[1][2]; i++) {
  193. var cbCard = tagAnalyseResult[2][2][(i - 1) * 2 + 1];
  194. var cbNextLogicValue = this.GetCardLogicValue(cbCard);
  195. if (cbFirstLogicValue != cbNextLogicValue + i - 1) {
  196. return CT_ERROR;
  197. }
  198. }
  199. if (tagAnalyseResult[1][2] * 2 == cbCardCount) {
  200. return CT_DOUBLE_LINE;
  201. }
  202. return CT_ERROR;
  203. }
  204. //单张判断
  205. if (tagAnalyseResult[1][1] >= 5 && tagAnalyseResult[1][1] == cbCardCount) {
  206. var cbCard = tagAnalyseResult[2][1][1];
  207. var cbFirstLogicValue = this.GetCardLogicValue(cbCard);
  208. if (cbFirstLogicValue >= 15) {
  209. return CT_ERROR;
  210. }
  211. for (var i = 2; i <= tagAnalyseResult[1][1]; i++) {
  212. var cbCard = tagAnalyseResult[2][1][i];
  213. var cbNextLogicValue = this.GetCardLogicValue(cbCard);
  214. if (cbFirstLogicValue != cbNextLogicValue + i - 1) {
  215. return CT_ERROR;
  216. }
  217. }
  218. return CT_SINGLE_LINE;
  219. }
  220. return CT_ERROR;
  221. },
  222. //对比扑克
  223. CompareCard: function (cbFirstCard, cbNextCard) {
  224. var cbFirstCount = cbFirstCard.length;
  225. var cbNextCount = cbNextCard.length;
  226. var cbNextType = this.GetCardType(cbNextCard, cbNextCount);
  227. var cbFirstType = this.GetCardType(cbFirstCard, cbFirstCount);
  228. if (cbNextType == CT_ERROR) {
  229. return false;
  230. }
  231. if (cbFirstCount == 0 && cbNextType != CT_ERROR) {
  232. return true;
  233. }
  234. if (cbNextType == CT_MISSILE_CARD) {
  235. return true;
  236. }
  237. if (cbFirstType != CT_BOMB_CARD && cbNextType == CT_BOMB_CARD) {
  238. return true;
  239. }
  240. if (cbFirstType == CT_BOMB_CARD && cbNextType != CT_BOMB_CARD) {
  241. return false;
  242. }
  243. if (cbFirstType != cbNextType || cbFirstCount != cbNextCount) {
  244. return false;
  245. }
  246. //开始对比
  247. if ((cbNextType == CT_SINGLE) || (cbNextType == CT_DOUBLE) || (cbNextType == CT_THREE) || (cbNextType == CT_SINGLE_LINE) || (cbNextType == CT_DOUBLE_LINE) || (cbNextType == CT_THREE_LINE) || (cbNextType == CT_BOMB_CARD)) {
  248. var cbNextLogicValue = this.GetCardLogicValue(cbNextCard[0]);
  249. var cbFirstLogicValue = this.GetCardLogicValue(cbFirstCard[0]);
  250. return cbNextLogicValue > cbFirstLogicValue;
  251. } else if ((cbNextType == CT_THREE_TAKE_ONE) || (cbNextType == CT_THREE_TAKE_TWO)) {
  252. var nextResult = this.AnalysebCardData(cbNextCard, cbNextCount);
  253. var firstResult = this.AnalysebCardData(cbFirstCard, cbFirstCount);
  254. var cbNextLogicValue = this.GetCardLogicValue(nextResult[2][3][1]);
  255. var cbFirstLogicValue = this.GetCardLogicValue(firstResult[2][3][1]);
  256. return cbNextLogicValue > cbFirstLogicValue;
  257. } else if ((cbNextType == CT_FOUR_TAKE_ONE) || (cbNextType == CT_FOUR_TAKE_TWO)) {
  258. var nextResult = this.AnalysebCardData(cbNextCard, cbNextCount);
  259. var firstResult = this.AnalysebCardData(cbFirstCard, cbFirstCount);
  260. var cbNextLogicValue = this.GetCardLogicValue(nextResult[2][4][1]);
  261. var cbFirstLogicValue = this.GetCardLogicValue(firstResult[2][4][1]);
  262. return cbNextLogicValue > cbFirstLogicValue;
  263. }
  264. return false;
  265. },
  266. //出牌搜索
  267. SearchOutCard: function (cbHandCardData, cbTurnCardData) {
  268. var cbHandCardCount = cbHandCardData.length;
  269. var cbTurnCardCount = cbTurnCardData.length ? cbTurnCardData.length : 0;
  270. //结果数目
  271. var cbResultCount = 1;
  272. //扑克数目
  273. var cbResultCardCount = [];
  274. //结果扑克
  275. var cbResultCard = [];
  276. //搜索结果
  277. var tagSearchCardResult = [null, cbResultCount - 1, cbResultCardCount, cbResultCard];
  278. //排序扑克
  279. var cbCardData = this.SortCardList(cbHandCardData, cbHandCardCount, 0);
  280. var cbCardCount = cbHandCardCount;
  281. //出牌分析
  282. var cbTurnOutType = this.GetCardType(cbTurnCardData, cbTurnCardCount);
  283. if (cbTurnOutType == CT_ERROR) {//错误类型
  284. //cc.log("上家为空");
  285. //是否一手出完
  286. if (this.GetCardType(cbCardData, cbCardCount) != CT_ERROR) {
  287. cbResultCardCount[cbResultCount] = cbCardCount;
  288. cbResultCard[cbResultCount] = [];
  289. cbResultCard[cbResultCount] = [null].concat(cbCardData);
  290. cbResultCount = cbResultCount + 1;
  291. tagSearchCardResult[2] = cbResultCardCount;
  292. tagSearchCardResult[3] = cbResultCard;
  293. }
  294. //如果最小牌不是单牌,则提取
  295. var cbSameCount = 1;
  296. if (cbCardCount > 1 && (this.GetCardLogicValue(cbCardData[cbCardCount]) == this.GetCardLogicValue(cbCardData[cbCardCount - 1]))) {
  297. cbSameCount = 2;
  298. cbResultCard[cbResultCount] = [];
  299. cbResultCard[cbResultCount][1] = cbCardData[cbCardCount];
  300. var cbCardValue = this.GetCardLogicValue(cbCardData[cbCardCount]);
  301. var i = cbCardCount - 1;
  302. while (i >= 1) {
  303. if (this.GetCardLogicValue(cbCardData[i]) == cbCardValue) {
  304. cbResultCard[cbResultCount][cbSameCount] = cbCardData[i];
  305. cbSameCount = cbSameCount + 1;
  306. }
  307. i = i - 1;
  308. }
  309. cbResultCardCount[cbResultCount] = cbSameCount - 1;
  310. cbResultCount = cbResultCount + 1;
  311. tagSearchCardResult[2] = cbResultCardCount;
  312. tagSearchCardResult[3] = cbResultCard;
  313. }
  314. // //单牌
  315. var cbTmpCount = 1;
  316. if (cbSameCount != 2) {
  317. //cc.log("单牌Pan");
  318. var tagSearchCardResult1 = this.SearchSameCard(cbCardData, cbCardCount, 0, 1);
  319. cbTmpCount = tagSearchCardResult1[1];
  320. if (cbTmpCount > 0) {
  321. cbResultCardCount[cbResultCount] = tagSearchCardResult1[2][1];
  322. cbResultCard[cbResultCount] = [];
  323. cbResultCard[cbResultCount] = tagSearchCardResult1[3][1];
  324. cbResultCount = cbResultCount + 1;
  325. tagSearchCardResult[2] = cbResultCardCount;
  326. tagSearchCardResult[3] = cbResultCard;
  327. }
  328. }
  329. //对牌
  330. if (cbSameCount != 3) {
  331. var tagSearchCardResult1 = this.SearchSameCard(cbCardData, cbCardCount, 0, 2);
  332. cbTmpCount = tagSearchCardResult1[1];
  333. if (cbTmpCount > 0) {
  334. cbResultCardCount[cbResultCount] = tagSearchCardResult1[2][1];
  335. cbResultCard[cbResultCount] = [];
  336. cbResultCard[cbResultCount] = tagSearchCardResult1[3][1];
  337. cbResultCount = cbResultCount + 1;
  338. tagSearchCardResult[2] = cbResultCardCount;
  339. tagSearchCardResult[3] = cbResultCard;
  340. }
  341. }
  342. //三条
  343. if (cbSameCount != 4) {
  344. var tagSearchCardResult1 = this.SearchSameCard(cbCardData, cbCardCount, 0, 3);
  345. cbTmpCount = tagSearchCardResult1[1];
  346. if (cbTmpCount > 0) {
  347. cbResultCardCount[cbResultCount] = tagSearchCardResult1[2][1];
  348. cbResultCard[cbResultCount] = [];
  349. cbResultCard[cbResultCount] = tagSearchCardResult1[3][1];
  350. cbResultCount = cbResultCount + 1;
  351. tagSearchCardResult[2] = cbResultCardCount;
  352. tagSearchCardResult[3] = cbResultCard;
  353. }
  354. }
  355. //三带一单
  356. var tagSearchCardResult2 = this.SearchTakeCardType(cbCardData, cbCardCount, 0, 3, 1);
  357. cbTmpCount = tagSearchCardResult2[1];
  358. if (cbTmpCount > 0) {
  359. cbResultCardCount[cbResultCount] = tagSearchCardResult2[2][1];
  360. cbResultCard[cbResultCount] = [];
  361. cbResultCard[cbResultCount] = tagSearchCardResult2[3][1];
  362. cbResultCount = cbResultCount + 1;
  363. tagSearchCardResult[2] = cbResultCardCount;
  364. tagSearchCardResult[3] = cbResultCard;
  365. }
  366. //三带一对
  367. var tagSearchCardResult3 = this.SearchTakeCardType(cbCardData, cbCardCount, 0, 3, 2);
  368. cbTmpCount = tagSearchCardResult3[1];
  369. if (cbTmpCount > 0) {
  370. cbResultCardCount[cbResultCount] = tagSearchCardResult3[2][1];
  371. cbResultCard[cbResultCount] = [];
  372. cbResultCard[cbResultCount] = tagSearchCardResult3[3][1];
  373. cbResultCount = cbResultCount + 1;
  374. tagSearchCardResult[2] = cbResultCardCount;
  375. tagSearchCardResult[3] = cbResultCard;
  376. }
  377. //单连
  378. var tagSearchCardResult4 = this.SearchLineCardType(cbCardData, cbCardCount, 0, 1, 0);
  379. cbTmpCount = tagSearchCardResult4[1];
  380. if (cbTmpCount > 0) {
  381. cbResultCardCount[cbResultCount] = tagSearchCardResult4[2][1];
  382. cbResultCard[cbResultCount] = [];
  383. cbResultCard[cbResultCount] = tagSearchCardResult4[3][1];
  384. cbResultCount = cbResultCount + 1;
  385. tagSearchCardResult[2] = cbResultCardCount;
  386. tagSearchCardResult[3] = cbResultCard;
  387. }
  388. //连对
  389. var tagSearchCardResult5 = this.SearchLineCardType(cbCardData, cbCardCount, 0, 2, 0);
  390. cbTmpCount = tagSearchCardResult5[1];
  391. if (cbTmpCount > 0) {
  392. cbResultCardCount[cbResultCount] = tagSearchCardResult5[2][1];
  393. cbResultCard[cbResultCount] = [];
  394. cbResultCard[cbResultCount] = tagSearchCardResult5[3][1];
  395. cbResultCount = cbResultCount + 1;
  396. tagSearchCardResult[2] = cbResultCardCount;
  397. tagSearchCardResult[3] = cbResultCard;
  398. }
  399. //三连
  400. var tagSearchCardResult6 = this.SearchLineCardType(cbCardData, cbCardCount, 0, 3, 0);
  401. cbTmpCount = tagSearchCardResult6[1];
  402. if (cbTmpCount > 0) {
  403. cbResultCardCount[cbResultCount] = tagSearchCardResult6[2][1];
  404. cbResultCard[cbResultCount] = [];
  405. cbResultCard[cbResultCount] = tagSearchCardResult6[3][1];
  406. cbResultCount = cbResultCount + 1;
  407. tagSearchCardResult[2] = cbResultCardCount;
  408. tagSearchCardResult[3] = cbResultCard;
  409. }
  410. //飞机
  411. var tagSearchCardResult7 = this.SearchThreeTwoLine(cbCardData, cbCardCount);
  412. cbTmpCount = tagSearchCardResult7[1];
  413. if (cbTmpCount > 0) {
  414. cbResultCardCount[cbResultCount] = tagSearchCardResult7[2][1];
  415. cbResultCard[cbResultCount] = [];
  416. cbResultCard[cbResultCount] = tagSearchCardResult7[3][1];
  417. cbResultCount = cbResultCount + 1;
  418. tagSearchCardResult[2] = cbResultCardCount;
  419. tagSearchCardResult[3] = cbResultCard;
  420. }
  421. //炸弹
  422. if (cbSameCount != 5) {
  423. var tagSearchCardResult1 = this.SearchSameCard(cbCardData, cbCardCount, 0, 4);
  424. cbTmpCount = tagSearchCardResult1[1];
  425. if (cbTmpCount > 0) {
  426. cbResultCardCount[cbResultCount] = tagSearchCardResult1[2][1];
  427. cbResultCard[cbResultCount] = [];
  428. cbResultCard[cbResultCount] = tagSearchCardResult1[3][1];
  429. cbResultCount = cbResultCount + 1;
  430. tagSearchCardResult[2] = cbResultCardCount;
  431. tagSearchCardResult[3] = cbResultCard;
  432. }
  433. }
  434. //火箭
  435. if ((cbCardCount == 2) && (cbCardData[0] == 0x4F && cbCardData[1] == 0x4E)) {
  436. cbResultCardCount[cbResultCount] = 2;
  437. cbResultCard[cbResultCount] = [];
  438. cbResultCard[cbResultCount] = [0, cbCardData[0], cbCardData[1]];
  439. cbResultCount = cbResultCount + 1;
  440. tagSearchCardResult[2] = cbResultCardCount;
  441. tagSearchCardResult[3] = cbResultCard;
  442. }
  443. tagSearchCardResult[1] = cbResultCount - 1;
  444. return tagSearchCardResult;
  445. } else if (cbTurnOutType == CT_SINGLE || cbTurnOutType == CT_DOUBLE || cbTurnOutType == CT_THREE) {
  446. //单牌、对牌、三条
  447. var cbReferCard = cbTurnCardData[0];
  448. var cbSameCount = 1;
  449. if (cbTurnOutType == CT_DOUBLE) {
  450. cbSameCount = 2;
  451. } else if (cbTurnOutType == CT_THREE) {
  452. cbSameCount = 3;
  453. }
  454. var tagSearchCardResult21 = this.SearchSameCard(cbCardData, cbCardCount, cbReferCard, cbSameCount);
  455. cbResultCount = tagSearchCardResult21[1];
  456. cbResultCount = cbResultCount + 1;
  457. cbResultCardCount = tagSearchCardResult21[2];
  458. tagSearchCardResult[2] = cbResultCardCount;
  459. cbResultCard = tagSearchCardResult21[3];
  460. tagSearchCardResult[3] = cbResultCard;
  461. tagSearchCardResult[1] = cbResultCount - 1;
  462. } else if (cbTurnOutType == CT_SINGLE_LINE || cbTurnOutType == CT_DOUBLE_LINE || cbTurnOutType == CT_THREE_LINE) {
  463. //单连、对连、三连
  464. var cbBlockCount = 1;
  465. if (cbTurnOutType == CT_DOUBLE_LINE) {
  466. cbBlockCount = 2;
  467. } else if (cbTurnOutType == CT_THREE_LINE) {
  468. cbBlockCount = 3;
  469. }
  470. var cbLineCount = cbTurnCardCount / cbBlockCount;
  471. var tagSearchCardResult31 = this.SearchLineCardType(cbCardData, cbCardCount, cbTurnCardData[0], cbBlockCount, cbLineCount);
  472. cbResultCount = tagSearchCardResult31[1];
  473. cbResultCount = cbResultCount + 1;
  474. cbResultCardCount = tagSearchCardResult31[2];
  475. tagSearchCardResult[2] = cbResultCardCount;
  476. cbResultCard = tagSearchCardResult31[3];
  477. tagSearchCardResult[3] = cbResultCard;
  478. tagSearchCardResult[1] = cbResultCount - 1;
  479. } else if (cbTurnOutType == CT_THREE_TAKE_ONE || cbTurnOutType == CT_THREE_TAKE_TWO) {
  480. //三带一单、三带一对
  481. if (cbCardCount >= cbTurnCardCount) {
  482. if (cbTurnCardCount == 4 || cbTurnCardCount == 5) {
  483. var cbTakeCardCount = (cbTurnOutType == CT_THREE_TAKE_ONE) && 1 || 2;
  484. var tagSearchCardResult41 = this.SearchTakeCardType(cbCardData, cbCardCount, cbTurnCardData[2], 3, cbTakeCardCount);
  485. cbResultCount = tagSearchCardResult41[1];
  486. cbResultCount = cbResultCount + 1;
  487. cbResultCardCount = tagSearchCardResult41[2];
  488. tagSearchCardResult[2] = cbResultCardCount;
  489. cbResultCard = tagSearchCardResult41[3];
  490. tagSearchCardResult[3] = cbResultCard;
  491. tagSearchCardResult[1] = cbResultCount - 1;
  492. } else {
  493. var cbBlockCount = 3;
  494. var cbLineCount = cbTurnCardCount / (cbTurnOutType == CT_THREE_TAKE_ONE && 4 || 5);
  495. var cbTakeCardCount = cbTurnOutType == CT_THREE_TAKE_ONE && 1 || 2;
  496. //搜索连牌
  497. var cbTmpTurnCard = cbTurnCardData;
  498. cbTmpTurnCard = this.SortOutCardList(cbTmpTurnCard, cbTurnCardCount);
  499. var tmpSearchResult = this.SearchLineCardType(cbCardData, cbCardCount, cbTmpTurnCard[1], cbBlockCount, cbLineCount);
  500. var cbResultCount2 = tmpSearchResult[1];
  501. //提取带牌
  502. for (var i = 1; i <= cbResultCount2; i++) {
  503. var cbResultIndex = cbResultCount2 - i + 1;
  504. var cbTmpCardData = [];
  505. for (var j = 1; j <= cbCardData.length; j++) {
  506. cbTmpCardData[j] = cbCardData[j];
  507. }
  508. var cbTmpCardCount = cbCardCount;
  509. //删除连牌
  510. var removeResult = this.RemoveCard(tmpSearchResult[3][cbResultIndex], tmpSearchResult[2][cbResultIndex], cbTmpCardData, cbTmpCardCount);
  511. cbTmpCardData = removeResult[2];
  512. cbTmpCardCount = cbTmpCardCount - tmpSearchResult[2][cbResultIndex];
  513. //分析牌
  514. var TmpResult = this.AnalysebCardData(cbTmpCardData, cbTmpCardCount);
  515. //提取牌
  516. var cbDistillCard = [];
  517. var cbDistillCount = 0;
  518. var j = cbTakeCardCount;
  519. while (j <= 4) {
  520. if (TmpResult[1][j] > 0) {
  521. if (j == cbTakeCardCount && TmpResult[1][j] >= cbLineCount) {
  522. var cbTmpBlockCount = TmpResult[1][j];
  523. for (var k = 1; k <= j * cbLineCount; k++) {
  524. cbDistillCard[k] = TmpResult[2][j][(cbTmpBlockCount - cbLineCount) * j + k];
  525. }
  526. cbDistillCount = j * cbLineCount;
  527. break;
  528. } else {
  529. var k = 1;
  530. while (k <= TmpResult[1][j]) {
  531. var cbTmpBlockCount = TmpResult[1][j];
  532. for (var l = 1; l <= cbTakeCardCount; l++) {
  533. cbDistillCard[cbDistillCount + l] = TmpResult[2][j][(cbTmpBlockCount - k) * j + l];
  534. }
  535. cbDistillCount = cbDistillCount + cbTakeCardCount;
  536. //提取完成
  537. if (cbDistillCount == cbTakeCardCount * cbLineCount) {
  538. break;
  539. }
  540. k = k + 1;
  541. }
  542. }
  543. }
  544. //提取完成
  545. if (cbDistillCount == cbTakeCardCount * cbLineCount) {
  546. break;
  547. }
  548. j = j + 1;
  549. }
  550. //提取完成
  551. if (cbDistillCount == cbTakeCardCount * cbLineCount) {//复制带牌
  552. var cbCount = tmpSearchResult[2][cbResultIndex];
  553. for (var n = 1; n <= cbDistillCount; n++) {
  554. tmpSearchResult[3][cbResultIndex][cbCount + n] = cbDistillCard[n];
  555. }
  556. tmpSearchResult[2][cbResultIndex] = tmpSearchResult[2][cbResultIndex] + cbDistillCount;
  557. } else {//否则删除连牌
  558. tmpSearchResult[2][cbResultIndex] = 0;
  559. }
  560. }
  561. //整理组合
  562. tmpSearchResult[1] = cbResultCount2;
  563. for (var i = 1; i <= tmpSearchResult[1]; i++) {
  564. if (tmpSearchResult[2][i] != 0) {
  565. tagSearchCardResult[2][cbResultCount] = tmpSearchResult[2][i];
  566. tagSearchCardResult[3][cbResultCount] = tmpSearchResult[3][i];
  567. cbResultCount = cbResultCount + 1;
  568. }
  569. }
  570. tagSearchCardResult[1] = cbResultCount - 1;
  571. }
  572. }
  573. } else if (cbTurnOutType == CT_FOUR_TAKE_ONE || cbTurnOutType == CT_FOUR_TAKE_TWO) {
  574. //四带两单、四带两双
  575. var cbTakeCardCount = (cbTurnOutType == CT_FOUR_TAKE_ONE) && 1 || 2;
  576. var cbTmpTurnCard = this.SortOutCardList(cbTurnCardData, cbTurnCardCount);
  577. var tagSearchCardResult51 = this.SearchTakeCardType(cbCardData, cbCardCount, cbTmpTurnCard[1], 4, cbTakeCardCount);
  578. cbResultCount = tagSearchCardResult51[1];
  579. cbResultCount = cbResultCount + 1;
  580. cbResultCardCount = tagSearchCardResult51[2];
  581. tagSearchCardResult[2] = cbResultCardCount;
  582. cbResultCard = tagSearchCardResult51[3];
  583. tagSearchCardResult[3] = cbResultCard;
  584. tagSearchCardResult[1] = cbResultCount - 1;
  585. }
  586. //搜索炸弹
  587. if (cbCardCount >= 4 && cbTurnOutType != CT_MISSILE_CARD) {
  588. var cbReferCard = 0;
  589. if (cbTurnOutType == CT_BOMB_CARD) {
  590. cbReferCard = cbTurnCardData[0];
  591. }
  592. //搜索炸弹
  593. var tagSearchCardResult61 = this.SearchSameCard(cbCardData, cbCardCount, cbReferCard, 4);
  594. var cbTmpResultCount = tagSearchCardResult61[1];
  595. for (var i = 1; i <= cbTmpResultCount; i++) {
  596. cbResultCardCount[cbResultCount] = tagSearchCardResult61[2][i];
  597. tagSearchCardResult[2] = cbResultCardCount;
  598. cbResultCard[cbResultCount] = tagSearchCardResult61[3][i];
  599. tagSearchCardResult[3] = cbResultCard;
  600. cbResultCount = cbResultCount + 1;
  601. }
  602. tagSearchCardResult[1] = cbResultCount - 1;
  603. }
  604. //搜索火箭
  605. if ((cbTurnOutType != CT_MISSILE_CARD) && (cbCardCount >= 2) && (cbCardData[0] == 0x4F && cbCardData[1] == 0x4E)) {
  606. cbResultCardCount[cbResultCount] = 2;
  607. cbResultCard[cbResultCount] = [0, cbCardData[0], cbCardData[1]];
  608. cbResultCount = cbResultCount + 1;
  609. tagSearchCardResult[2] = cbResultCardCount;
  610. tagSearchCardResult[3] = cbResultCard;
  611. tagSearchCardResult[1] = cbResultCount - 1;
  612. }
  613. return tagSearchCardResult;
  614. },
  615. //同牌搜索
  616. SearchSameCard: function (cbHandCardData, cbHandCardCount, cbReferCard, cbSameCardCount) {
  617. //结果数目
  618. var cbResultCount = 1;
  619. //扑克数目
  620. var cbResultCardCount = [];
  621. //结果扑克
  622. var cbResultCard = [];
  623. //搜索结果
  624. var tagSearchCardResult = [null, cbResultCount - 1, cbResultCardCount, cbResultCard];
  625. //排序扑克
  626. var cbCardData = this.SortCardList(cbHandCardData, cbHandCardCount, 0);
  627. var cbCardCount = cbHandCardCount;
  628. //分析结构
  629. var tagAnalyseResult = this.AnalysebCardData(cbCardData, cbCardCount);
  630. var cbReferLogicValue = (cbReferCard == 0 && 0 || this.GetCardLogicValue(cbReferCard));
  631. var cbBlockIndex = cbSameCardCount;
  632. while (cbBlockIndex <= 4) {
  633. for (var i = 1; i <= tagAnalyseResult[1][cbBlockIndex]; i++) {
  634. var cbIndex = (tagAnalyseResult[1][cbBlockIndex] - i) * cbBlockIndex + 1;
  635. var cbNowLogicValue = this.GetCardLogicValue(tagAnalyseResult[2][cbBlockIndex][cbIndex]);
  636. if (cbNowLogicValue > cbReferLogicValue) {
  637. cbResultCardCount[cbResultCount] = cbSameCardCount;
  638. tagSearchCardResult[2] = cbResultCardCount;
  639. cbResultCard[cbResultCount] = [];
  640. cbResultCard[cbResultCount][1] = tagAnalyseResult[2][cbBlockIndex][cbIndex];
  641. for (var j = 2; j <= cbBlockIndex; j++) {
  642. cbResultCard[cbResultCount][j] = tagAnalyseResult[2][cbBlockIndex][cbIndex + j - 1];
  643. } //此处修改
  644. tagSearchCardResult[3] = cbResultCard;
  645. cbResultCount = cbResultCount + 1;
  646. }
  647. }
  648. cbBlockIndex = cbBlockIndex + 1;
  649. }
  650. tagSearchCardResult[1] = cbResultCount - 1;
  651. return tagSearchCardResult;
  652. },
  653. //带牌类型搜索(三带一,四带一等)
  654. SearchTakeCardType: function (cbHandCardData, cbHandCardCount, cbReferCard, cbSameCount, cbTakeCardCount) {
  655. //结果数目
  656. var cbResultCount = 1;
  657. //扑克数目
  658. var cbResultCardCount = [];
  659. //结果扑克
  660. var cbResultCard = [];
  661. //搜索结果
  662. var tagSearchCardResult = [null, cbResultCount - 1, cbResultCardCount, cbResultCard];
  663. if (cbSameCount != 3 && cbSameCount != 4) {
  664. return tagSearchCardResult;
  665. }
  666. if (cbTakeCardCount != 1 && cbTakeCardCount != 2) {
  667. return tagSearchCardResult;
  668. }
  669. if ((cbSameCount == 4) && (cbHandCardCount < cbSameCount + cbTakeCardCount * 2 || cbHandCardCount < cbSameCount + cbTakeCardCount)) {
  670. return tagSearchCardResult;
  671. }
  672. //排序扑克
  673. var cbCardData = this.SortCardList(cbHandCardData, cbHandCardCount, 0);
  674. var cbCardCount = cbHandCardCount;
  675. var sameCardResult = [];
  676. sameCardResult = this.SearchSameCard(cbCardData, cbCardCount, cbReferCard, cbSameCount);
  677. var cbSameCardResultCount = sameCardResult[1];
  678. if (cbSameCardResultCount > 0) {
  679. //分析结构
  680. var tagAnalyseResult = this.AnalysebCardData(cbCardData, cbCardCount);
  681. //需要牌数
  682. var cbNeedCount = cbSameCount + cbTakeCardCount;
  683. if (cbSameCount == 4) {
  684. cbNeedCount = cbNeedCount + cbTakeCardCount;
  685. }
  686. //提取带牌
  687. for (var i = 1; i <= cbSameCardResultCount; i++) {
  688. var bMere = false;
  689. var j = cbTakeCardCount;
  690. while (j <= 4) {
  691. var k = 1;
  692. while (k <= tagAnalyseResult[1][j]) {
  693. //从小到大
  694. var cbIndex = (tagAnalyseResult[1][j] - k) * j + 1;
  695. if (this.GetCardLogicValue(sameCardResult[3][i][1]) != this.GetCardLogicValue(tagAnalyseResult[2][j][cbIndex])) {
  696. //复制带牌
  697. var cbCount = sameCardResult[2][i];
  698. for (var l = 1; l <= cbTakeCardCount; l++) {
  699. sameCardResult[3][i][cbCount + l] = tagAnalyseResult[2][j][cbIndex + l - 1];
  700. }
  701. sameCardResult[2][i] = sameCardResult[2][i] + cbTakeCardCount;
  702. if (sameCardResult[2][i] >= cbNeedCount) {
  703. //复制结果
  704. cbResultCardCount[cbResultCount] = sameCardResult[2][i];
  705. tagSearchCardResult[2] = cbResultCardCount;
  706. cbResultCard[cbResultCount] = [];
  707. cbResultCard[cbResultCount] = sameCardResult[3][i];
  708. tagSearchCardResult[3] = cbResultCard;
  709. cbResultCount = cbResultCount + 1;
  710. tagSearchCardResult[1] = cbResultCount - 1;
  711. bMere = true;
  712. //下一组合
  713. break;
  714. }
  715. }
  716. k = k + 1;
  717. }
  718. if (bMere == true) {
  719. break;
  720. }
  721. j = j + 1;
  722. }
  723. }
  724. }
  725. tagSearchCardResult[1] = cbResultCount - 1;
  726. return tagSearchCardResult;
  727. },
  728. //连牌搜索
  729. SearchLineCardType: function (cbHandCardData, cbHandCardCount, cbReferCard, cbBlockCount, cbLineCount) {
  730. //结果数目
  731. var cbResultCount = 1;
  732. //扑克数目
  733. var cbResultCardCount = [];
  734. //结果扑克
  735. var cbResultCard = [];
  736. //搜索结果
  737. var tagSearchCardResult = [null, cbResultCount - 1, cbResultCardCount, cbResultCard];
  738. //排序扑克
  739. var cbCardData = this.SortCardList(cbHandCardData, cbHandCardCount, 0);
  740. var cbCardCount = cbHandCardCount;
  741. //连牌最少数
  742. var cbLessLineCount = 0;
  743. if (cbLineCount == 0) {
  744. if (cbBlockCount == 1) {
  745. cbLessLineCount = 5;
  746. } else if (cbBlockCount == 2) {
  747. cbLessLineCount = 3;
  748. } else {
  749. cbLessLineCount = 2;
  750. }
  751. } else {
  752. cbLessLineCount = cbLineCount;
  753. }
  754. //cc.log("连牌最少数 " .. cbLessLineCount)
  755. var cbReferIndex = 3;
  756. if (cbReferCard != 0) {
  757. if ((this.GetCardLogicValue(cbReferCard) - cbLessLineCount) >= 2) {
  758. cbReferIndex = this.GetCardLogicValue(cbReferCard) - cbLessLineCount + 1 + 1;
  759. }
  760. }
  761. //超过A
  762. if (cbReferIndex + cbLessLineCount > 15) {
  763. return tagSearchCardResult;
  764. }
  765. //长度判断
  766. if (cbHandCardCount < cbLessLineCount * cbBlockCount) {
  767. return tagSearchCardResult;
  768. }
  769. //cc.log("搜索顺子开始点 " .. cbReferIndex);
  770. var Distributing = this.AnalysebDistributing(cbCardData, cbCardCount);
  771. //搜索顺子
  772. var cbTmpLinkCount = 0;
  773. var cbValueIndex = cbReferIndex;
  774. var flag = false;
  775. while (cbValueIndex <= 13) {
  776. if (cbResultCard[cbResultCount] == null) {
  777. cbResultCard[cbResultCount] = [];
  778. }
  779. if (Distributing[2][cbValueIndex][6] < cbBlockCount) {
  780. if (cbTmpLinkCount < cbLessLineCount) {
  781. cbTmpLinkCount = 0;
  782. flag = false;
  783. } else {
  784. cbValueIndex = cbValueIndex - 1;
  785. flag = true;
  786. }
  787. } else {
  788. cbTmpLinkCount = cbTmpLinkCount + 1;
  789. if (cbLineCount == 0) {
  790. flag = false;
  791. } else {
  792. flag = true;
  793. }
  794. }
  795. if (flag == true) {
  796. flag = false;
  797. if (cbTmpLinkCount >= cbLessLineCount) {
  798. //复制扑克
  799. var cbCount = 0;
  800. var cbIndex = (cbValueIndex - cbTmpLinkCount + 1);
  801. while (cbIndex <= cbValueIndex) {
  802. var cbTmpCount = 0;
  803. var cbColorIndex = 1;
  804. while (cbColorIndex <= 4) {//在四色中取一个
  805. var cbColorCount = 1;
  806. while (cbColorCount <= Distributing[2][cbIndex][5 - cbColorIndex]) {
  807. cbCount = cbCount + 1;
  808. cbResultCard[cbResultCount][cbCount] = this.MakeCardData(cbIndex, 5 - cbColorIndex - 1);
  809. tagSearchCardResult[3][cbResultCount] = cbResultCard[cbResultCount];
  810. cbTmpCount = cbTmpCount + 1;
  811. if (cbTmpCount == cbBlockCount) {
  812. break;
  813. }
  814. cbColorCount = cbColorCount + 1;
  815. }
  816. if (cbTmpCount == cbBlockCount) {
  817. break;
  818. }
  819. cbColorIndex = cbColorIndex + 1;
  820. }
  821. cbIndex = cbIndex + 1;
  822. }
  823. tagSearchCardResult[2][cbResultCount] = cbCount;
  824. cbResultCount = cbResultCount + 1;
  825. if (cbLineCount != 0) {
  826. cbTmpLinkCount = cbTmpLinkCount - 1;
  827. } else {
  828. cbTmpLinkCount = 0;
  829. }
  830. }
  831. }
  832. cbValueIndex = cbValueIndex + 1;
  833. }
  834. //特殊顺子(寻找A)
  835. if (cbTmpLinkCount >= cbLessLineCount - 1 && cbValueIndex == 14) {
  836. //cc.log("特殊顺子(寻找A)");
  837. if ((Distributing[2][1][6] >= cbBlockCount) || (cbTmpLinkCount >= cbLessLineCount)) {
  838. if (cbResultCard[cbResultCount] == null) {
  839. cbResultCard[cbResultCount] = {};
  840. }
  841. //复制扑克
  842. var cbCount = 0;
  843. var cbIndex = (cbValueIndex - cbTmpLinkCount);
  844. while (cbIndex <= 13) {
  845. var cbTmpCount = 0;
  846. var cbColorIndex = 1;
  847. while (cbColorIndex <= 4) {//在四色中取一个
  848. var cbColorCount = 1;
  849. while (cbColorCount <= Distributing[2][cbIndex][5 - cbColorIndex]) {
  850. cbCount = cbCount + 1;
  851. cbResultCard[cbResultCount][cbCount] = this.MakeCardData(cbIndex, 5 - cbColorIndex - 1);
  852. tagSearchCardResult[3][cbResultCount] = cbResultCard[cbResultCount];
  853. cbTmpCount = cbTmpCount + 1;
  854. if (cbTmpCount == cbBlockCount) {
  855. break;
  856. }
  857. cbColorCount = cbColorCount + 1;
  858. }
  859. if (cbTmpCount == cbBlockCount) {
  860. break;
  861. }
  862. cbColorIndex = cbColorIndex + 1;
  863. }
  864. cbIndex = cbIndex + 1;
  865. }
  866. //复制A
  867. if (Distributing[2][1][6] >= cbBlockCount) {
  868. var cbTmpCount = 0;
  869. var cbColorIndex = 1;
  870. while (cbColorIndex <= 4) {//在四色中取一个
  871. var cbColorCount = 1;
  872. while (cbColorCount <= Distributing[2][1][5 - cbColorIndex]) {
  873. cbCount = cbCount + 1;
  874. cbResultCard[cbResultCount][cbCount] = this.MakeCardData(1, 5 - cbColorIndex - 1);
  875. tagSearchCardResult[3][cbResultCount] = cbResultCard[cbResultCount];
  876. cbTmpCount = cbTmpCount + 1;
  877. if (cbTmpCount == cbBlockCount) {
  878. break;
  879. }
  880. cbColorCount = cbColorCount + 1;
  881. }
  882. if (cbTmpCount == cbBlockCount) {
  883. break;
  884. }
  885. cbColorIndex = cbColorIndex + 1;
  886. }
  887. }
  888. tagSearchCardResult[2][cbResultCount] = cbCount;
  889. cbResultCount = cbResultCount + 1;
  890. }
  891. }
  892. tagSearchCardResult[1] = cbResultCount - 1;
  893. return tagSearchCardResult;
  894. },
  895. //飞机搜索
  896. SearchThreeTwoLine: function (cbHandCardData, cbHandCardCount) {
  897. //cc.log("飞机搜索");
  898. //结果数目
  899. var cbSearchCount = 0;
  900. //扑克数目
  901. var cbResultCardCount = [];
  902. //结果扑克
  903. var cbResultCard = [];
  904. //搜索结果
  905. var tagSearchCardResult = [null, cbSearchCount, cbResultCardCount, cbResultCard];
  906. var tmpSingleWing = [null, cbSearchCount, cbResultCardCount, cbResultCard];
  907. var tmpDoubleWing = [null, cbSearchCount, cbResultCardCount, cbResultCard];
  908. var cbTmpResultCount = 0;
  909. //搜索连牌
  910. var tmpSearchResult = this.SearchLineCardType(cbHandCardData, cbHandCardCount, 0, 3, 0);
  911. cbTmpResultCount = tmpSearchResult[1];
  912. if (cbTmpResultCount > 0) {
  913. //提取带牌
  914. var i = 1;
  915. while (i <= cbTmpResultCount) {
  916. var flag = true;
  917. var cbTmpCardData = [];
  918. var cbTmpCardCount = cbHandCardCount;
  919. //不够牌
  920. if (cbHandCardCount - tmpSearchResult[2][i] < tmpSearchResult[2][i] / 3) {
  921. var cbNeedDelCount = 3;
  922. while ((cbHandCardCount + cbNeedDelCount - tmpSearchResult[2][i]) < (tmpSearchResult[2][i] - cbNeedDelCount) / 3) {
  923. cbNeedDelCount = cbNeedDelCount + 3;
  924. }
  925. //不够连牌
  926. if ((tmpSearchResult[2][i] - cbNeedDelCount) / 3 < 2) {
  927. flag = false;
  928. } else {
  929. flag = true;
  930. }
  931. if (flag == true) {
  932. //拆分连牌
  933. var removeResult = this.RemoveCard(tmpSearchResult[3][i], cbNeedDelCount, tmpSearchResult[3][i], tmpSearchResult[2][i]);
  934. tmpSearchResult[3][i] = removeResult[2];
  935. tmpSearchResult[2][i] = tmpSearchResult[2][i] - cbNeedDelCount;
  936. }
  937. }
  938. if (flag == true) {
  939. flag = false;
  940. //删除连牌
  941. for (var temp = 1; temp <= cbHandCardData.length; temp++) {
  942. cbTmpCardData[temp] = cbHandCardData[temp - 1];
  943. }
  944. var removeResult1 = this.RemoveCard(tmpSearchResult[3][i], tmpSearchResult[2][i], cbTmpCardData, cbTmpCardCount);
  945. cbTmpCardData = removeResult1[2];
  946. cbTmpCardCount = cbTmpCardCount - tmpSearchResult[2][i];
  947. //组合飞机
  948. var cbNeedCount = tmpSearchResult[2][i] / 3;
  949. var cbResultCount = tmpSingleWing[1] + 1;
  950. tmpSingleWing[3][cbResultCount] = tmpSearchResult[3][i];
  951. for (var j = 1; j <= cbNeedCount; j++) {
  952. tmpSingleWing[3][cbResultCount][tmpSearchResult[2][i] + j] = cbTmpCardData[cbTmpCardCount - cbNeedCount + j];
  953. }
  954. tmpSingleWing[2][i] = tmpSearchResult[2][i] + cbNeedCount;
  955. tmpSingleWing[1] = tmpSingleWing[1] + 1;
  956. var flag2 = true;
  957. //不够带翅膀
  958. if (cbTmpCardCount < tmpSearchResult[2][i] / 3 * 2) {
  959. var cbNeedDelCount = 3;
  960. while ((cbTmpCardCount + cbNeedDelCount - tmpSearchResult[2][i]) < (tmpSearchResult[2][i] - cbNeedDelCount) / 3 * 2) {
  961. cbNeedDelCount = cbNeedDelCount + 3;
  962. }
  963. //不够连牌
  964. if ((tmpSearchResult[2][i] - cbNeedDelCount) / 3 < 2) {
  965. flag2 = false;
  966. } else {
  967. flag2 = true;
  968. }
  969. if (flag2 == true) {
  970. //拆分连牌
  971. var removeResult = this.RemoveCard(tmpSearchResult[3][i], cbNeedDelCount, tmpSearchResult[3][i], tmpSearchResult[2][i]);
  972. tmpSearchResult[3][i] = removeResult[2];
  973. tmpSearchResult[2][i] = tmpSearchResult[2][i] - cbNeedDelCount;
  974. //重新删除连牌
  975. for (var temp = 1; temp <= cbHandCardData.length; temp++) {
  976. cbTmpCardData[temp] = cbHandCardData[temp];
  977. }
  978. var removeResult2 = this.RemoveCard(tmpSearchResult[3][i], tmpSearchResult[2][i], cbTmpCardData, cbTmpCardCount);
  979. cbTmpCardData = removeResult2[2];
  980. cbTmpCardCount = cbTmpCardCount - tmpSearchResult[2][i];
  981. }
  982. }
  983. if (flag2 == true) {
  984. flag2 = false;
  985. //分析牌
  986. var TmpResult = [];
  987. TmpResult = this.AnalysebCardData(cbTmpCardData, cbTmpCardCount);
  988. //提取翅膀
  989. var cbDistillCard = [];
  990. var cbDistillCount = 0;
  991. var cbLineCount = tmpSearchResult[2][i] / 3;
  992. var j = 2;
  993. while (j <= 4) {
  994. if (TmpResult[1][j] > 0) {
  995. if ((j + 1 == 3) && TmpResult[1][j] >= cbLineCount) {
  996. var cbTmpBlockCount = TmpResult[1][j];
  997. for (var k = 1; k <= j * cbLineCount; k++) {
  998. cbDistillCard[k] = TmpResult[2][j][(cbTmpBlockCount - cbLineCount) * j + k];
  999. }
  1000. cbDistillCount = j * cbLineCount;
  1001. } else {
  1002. var k = 1;
  1003. while (k <= TmpResult[1][j]) {
  1004. var cbTmpBlockCount = TmpResult[1][j];
  1005. for (var l = 1; l <= 2; l++) {
  1006. cbDistillCard[cbDistillCount + l] = TmpResult[2][j][(cbTmpBlockCount - k) * j + l];
  1007. }
  1008. cbDistillCount = cbDistillCount + 2;
  1009. //提取完成
  1010. if (cbDistillCount == 2 * cbLineCount) {
  1011. break;
  1012. }
  1013. k = k + 1;
  1014. }
  1015. }
  1016. }
  1017. //提取完成
  1018. if (cbDistillCount == 2 * cbLineCount) {
  1019. break;
  1020. }
  1021. j = j + 1;
  1022. }
  1023. //提取完成
  1024. if (cbDistillCount == 2 * cbLineCount) {
  1025. //cc.log("复制两对");
  1026. //复制翅膀
  1027. tmpDoubleWing[1] = tmpDoubleWing[1] + 1;
  1028. cbResultCount = tmpDoubleWing[1];
  1029. tmpDoubleWing[3][cbResultCount] = tmpSearchResult[3][i];
  1030. for (var n = 1; n <= cbDistillCount; n++) {
  1031. tmpDoubleWing[3][cbResultCount][tmpSearchResult[2][i] + n] = cbDistillCard[n];
  1032. }
  1033. tmpDoubleWing[2][cbResultCount] = tmpSearchResult[2][i] + cbDistillCount;
  1034. }
  1035. }
  1036. }
  1037. i = i + 1;
  1038. }
  1039. //复制结果
  1040. for (var m = 1; m <= tmpDoubleWing[1]; m++) {
  1041. tagSearchCardResult[1] = tagSearchCardResult[1] + 1;
  1042. var cbResultCount = tagSearchCardResult[1];
  1043. tagSearchCardResult[3][cbResultCount] = tmpDoubleWing[3][m];
  1044. tagSearchCardResult[2][cbResultCount] = tmpDoubleWing[2][m];
  1045. }
  1046. for (var m = 1; m <= tmpSingleWing[1]; m++) {
  1047. tagSearchCardResult[1] = tagSearchCardResult[1] + 1;
  1048. var cbResultCount = tagSearchCardResult[1];
  1049. tagSearchCardResult[3][cbResultCount] = tmpSingleWing[3][m];
  1050. tagSearchCardResult[2][cbResultCount] = tmpSingleWing[2][m];
  1051. }
  1052. }
  1053. return tagSearchCardResult;
  1054. },
  1055. //分析分布
  1056. AnalysebDistributing: function (cbCardData, cbCardCount) {
  1057. var cbCardCount1 = 0;
  1058. var cbDistributing = [];
  1059. for (var i = 1; i <= 15; i++) {
  1060. var distributing = [];
  1061. for (var j = 1; j <= 6; j++) {
  1062. distributing[j] = 0;
  1063. }
  1064. cbDistributing[i] = distributing;
  1065. }
  1066. var Distributing = [cbCardCount1, cbDistributing];
  1067. for (var i = 1; i <= cbCardCount; i++) {
  1068. if (cbCardData[i - 1] != 0) {
  1069. var cbCardColor = this.GetCardColor(cbCardData[i - 1]);
  1070. var cbCardValue = this.GetCardValue(cbCardData[i - 1]);
  1071. //分布信息
  1072. cbCardCount1 = cbCardCount1 + 1;
  1073. cbDistributing[cbCardValue][5 + 1] = cbDistributing[cbCardValue][6] + 1;
  1074. var color = (cbCardColor >> 4) + 1;
  1075. cbDistributing[cbCardValue][color] = cbDistributing[cbCardValue][color] + 1;
  1076. }
  1077. }
  1078. Distributing[1] = cbCardCount1;
  1079. Distributing[2] = cbDistributing;
  1080. return Distributing;
  1081. },
  1082. //构造扑克
  1083. MakeCardData: function (cbValueIndex, cbColorIndex) {
  1084. //print("构造扑克 " ..bit:_or(bit:_lshift(cbColorIndex,4),cbValueIndex)..",".. GetCardLogicValue(bit:_or(bit:_lshift(cbColorIndex,4),cbValueIndex)))
  1085. return (cbColorIndex << 4) | cbValueIndex;
  1086. },
  1087. //-删除扑克
  1088. RemoveCard: function (cbRemoveCard, cbRemoveCount, cbCardData, cbCardCount) {
  1089. var cbDeleteCount = 0;
  1090. var cbTempCardData = [];
  1091. for (var i = 1; i <= cbCardData.length; i++) {
  1092. cbTempCardData[i] = cbCardData[i - 1];
  1093. }
  1094. var result = [null, false, cbCardData];
  1095. //置零扑克
  1096. var i = 1;
  1097. while (i <= cbRemoveCount) {
  1098. var j = 1;
  1099. while (j < cbCardCount) {
  1100. if (cbRemoveCard[i] == cbTempCardData[j]) {
  1101. cbDeleteCount = cbDeleteCount + 1;
  1102. cbTempCardData[j] = 0;
  1103. break;
  1104. }
  1105. j = j + 1;
  1106. }
  1107. i = i + 1;
  1108. }
  1109. if (cbDeleteCount != cbRemoveCount) {
  1110. return result;
  1111. }
  1112. //清理扑克
  1113. var cbCardPos = 1;
  1114. var datas = [];
  1115. for (var i = 1; i <= cbCardCount; i++) {
  1116. if (cbTempCardData[i] != 0) {
  1117. datas[cbCardPos] = cbTempCardData[i];
  1118. cbCardPos = cbCardPos + 1;
  1119. }
  1120. }
  1121. result = [null, true, datas];
  1122. return result;
  1123. },
  1124. //排列扑克
  1125. SortOutCardList: function (cbCardData, cbCardCount) {
  1126. var resultCardData = [];
  1127. var resultCardCount = 0;
  1128. //获取牌型
  1129. var cbCardType = this.GetCardType(cbCardData, cbCardCount);
  1130. if (cbCardType == CT_THREE_TAKE_ONE || cbCardType == CT_THREE_TAKE_TWO) {
  1131. //分析牌
  1132. var AnalyseResult = [];
  1133. AnalyseResult = this.AnalysebCardData(cbCardData, cbCardCount);
  1134. resultCardCount = AnalyseResult[1][3] * 3;
  1135. resultCardData = AnalyseResult[2][3];
  1136. for (var i = 4; i <= 1; i--) {
  1137. if (i != 3) {
  1138. if (AnalyseResult[1][i] > 0) {
  1139. for (var j = 1; j <= AnalyseResult[1][i] * i; j++) {
  1140. resultCardData[resultCardCount + j] = AnalyseResult[2][i][j];
  1141. }
  1142. resultCardCount = resultCardCount + AnalyseResult[1][i] * i;
  1143. }
  1144. }
  1145. }
  1146. } else if (cbCardType == CT_FOUR_TAKE_ONE || cbCardType == CT_FOUR_TAKE_TWO) {
  1147. //分析牌
  1148. var AnalyseResult = {};
  1149. AnalyseResult = this.AnalysebCardData(cbCardData, cbCardCount);
  1150. resultCardCount = AnalyseResult[1][4] * 4;
  1151. resultCardData = AnalyseResult[2][4];
  1152. for (var i = 4; i <= 1; i--) {
  1153. if (i != 3) {
  1154. if (AnalyseResult[1][i] > 0) {
  1155. for (var j = 1; j <= AnalyseResult[1][i] * i; j++) {
  1156. resultCardData[resultCardCount + j] = AnalyseResult[2][i][j];
  1157. }
  1158. resultCardCount = resultCardCount + AnalyseResult[1][i] * i;
  1159. }
  1160. }
  1161. }
  1162. }
  1163. return resultCardData;
  1164. },
  1165. };
  1166. export default GameLogicController;