25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

760 lines
20 KiB

  1. --[[
  2. (1)压单张
  3. a.默认弹最小单张,若单张中含有对子、顺子、三张组合,则优先不拆,最后再拆;
  4. b.若能压牌中含炸弹,则永不拆炸弹,直接弹炸弹。
  5. (2)压对子
  6. a.默认弹最小对子,若对子可组合成连对,则优先不拆,最后再拆;
  7. b.若能压牌中含对子+三张/炸弹,则永不拆三张、炸弹;
  8. c.若能压牌中只有三张(+炸弹),则拆三张;
  9. d.若能压牌中只有炸弹,则直接弹炸弹。
  10. 如,上家55,本家有667788JJJ,则点“提示”,牌弹起的顺序为66、88、77。
  11. (3)压三张
  12. a.默认弹最小三张,若只有2单张,则最小三张和2单张弹起,点“提示”,三张轮换;
  13. b.默认弹最小三张,若三张中含有飞机,则优先不拆,最后再拆;
  14. c.若能压牌中含三张、飞机、炸弹,则永远不拆炸弹;
  15. d.若能压牌只有炸弹,则直接弹炸弹。
  16. 如,上家555,本家有666777888349J,则点“提示”,牌弹起的顺序为666、888、777。
  17. (4)压顺子:直接弹最小顺子,点击轮换。
  18. (5)压连对:直接弹最小连对,点击轮换。
  19. (6)压飞机:直接弹最小飞机,点击轮换。
  20. (7)压炸弹:直接弹最小炸弹,点击轮换。
  21. 5、压牌时,手动滑牌,则滑什么牌相应的弹起什么牌。
  22. 6、主动出牌时,手动滑牌:飞机-连对-顺子
  23. (1)如果有飞机,则只显示最小飞机主牌;
  24. (2)如果没有飞机,有连对,则弹起最小连对;
  25. (3)如果没有飞机、连对,则弹起最小顺子;
  26. (4)如果都没有,则全部弹起。
  27. ]]
  28. local PokerUtil = require('pk_doudizhu.luaScript.Views.Room.PokerUtil') -- 基类文件
  29. local newPokerUtil = class("newPokerUtil", PokerUtil)
  30. local isResetSelectCard = true -- 是否启动滑动手牌并返回特殊的牌型
  31. local Value_2 = 0x0d -- 2的标准值
  32. local Value_Joker_Little = 0x0e -- 小鬼的标准值
  33. local Value_Joker_Big = 0x0f -- 大鬼的标准值
  34. function newPokerUtil:ctor(param)
  35. newPokerUtil.super.ctor(self, param)
  36. end
  37. -- 重写单张提示
  38. function newPokerUtil:getSingleTip(cards, lastData)
  39. local lastCardInfo = self:getCardsType(lastData)
  40. local result = {}
  41. -- 将非王牌,带2的牌,炸弹牌,组合在一起(用于判断连续值)
  42. -- 移除手牌中的炸弹
  43. local cards = clone(cards)
  44. local t = self:parseCardEx(cards)
  45. local temp = {}
  46. for _, v in ipairs(t) do
  47. if #v < 4 then -- 插入大于1张,非炸弹的牌
  48. for _, val in ipairs(v) do
  49. table.insert(temp, val)
  50. end
  51. end
  52. end
  53. -- 移除手牌中的王牌和2
  54. local nt = self:removeValue_Joker_And_2(temp)
  55. local lineTable = self:getSubLineEx(nt) -- 所有可以连在一起的集合(扩展版)
  56. for i = #lineTable, 1, -1 do -- 移除顺子集合中小于最小长度的顺子
  57. if #lineTable[i] < PokerUtil.Less_Line then
  58. table.remove(lineTable, i)
  59. end
  60. end
  61. -- 将顺子所有牌整到同一个表
  62. local szCard = {}
  63. for _, v in ipairs(lineTable or {}) do
  64. for _, card in ipairs(v) do
  65. table.insert(szCard, card)
  66. end
  67. end
  68. -- 同顺表,非顺表,异顺表
  69. local cbsCard, cnbsCard, lcbsCard = {}, {}, {}
  70. cbsCard, cnbsCard, lcbsCard = self:parseShunZi(cards, szCard)
  71. local p_tc = self:parseCardEx(cnbsCard)
  72. local p_tl = self:parseCardEx(lcbsCard)
  73. table.sort(p_tc, function(a, b)
  74. return self:getCardValue(a[1]) < self:getCardValue(b[1])
  75. end)
  76. table.sort(p_tl, function(a, b)
  77. return self:getCardValue(a[1]) < self:getCardValue(b[1])
  78. end)
  79. local temp_two = {}
  80. local temp_three = {}
  81. -- 插入非顺表中单个值,2,3备用
  82. for i, v in pairs(p_tc) do
  83. if #v == 1 then
  84. table.insert(result, v)
  85. elseif #v == 2 then
  86. table.insert(temp_two, v)
  87. elseif #v == 3 then
  88. table.insert(temp_three, v)
  89. end
  90. end
  91. -- 插入异顺表中单个值,2,3备用
  92. for i, v in pairs(p_tl) do
  93. if #v == 1 then
  94. table.insert(result, v)
  95. elseif #v == 2 then
  96. table.insert(temp_two, v)
  97. elseif #v == 3 then
  98. table.insert(temp_three, v)
  99. end
  100. end
  101. -- 排序后,插入异顺表和非顺表中两个的值
  102. table.sort(temp_two, function(a, b)
  103. return self:getCardValue(a[1]) < self:getCardValue(b[1])
  104. end)
  105. for i, v in ipairs(temp_two) do
  106. table.insert(result, {v[1]}) -- 插入单个表,表里只有1个值
  107. end
  108. -- 排序后,插入异顺表和非顺表中三个的值
  109. table.sort(temp_three, function(a, b)
  110. return self:getCardValue(a[1]) < self:getCardValue(b[1])
  111. end)
  112. for i, v in ipairs(temp_three) do
  113. table.insert(result, {v[1]}) -- 插入单个表,表里只有1个值
  114. end
  115. -- 插入顺子
  116. local temp_shunzi = clone(lineTable)
  117. for i, v in ipairs(temp_shunzi) do
  118. table.sort(v, PokerUtil.sortOrder_By_PokerValue)
  119. end
  120. for _, sz in ipairs(temp_shunzi) do
  121. for _, v in ipairs(sz) do
  122. table.insert(result, {v}) -- 因为是v是标准值,所以外面要带个{}
  123. end
  124. end
  125. -- 遍历result,把低于target值得移除
  126. for i = #result, 1, -1 do
  127. if self:getCardValue(result[i][1]) <= lastCardInfo.min then
  128. table.remove(result, i)
  129. end
  130. end
  131. return result
  132. end
  133. -- 重写对子提示
  134. function newPokerUtil:getDuiZiTip(cards, lastData)
  135. local cards = clone(cards)
  136. local valueList, valueCard = self:parseCard(cards)
  137. local lastCardInfo = self:getCardsType(lastData)
  138. local result = {}
  139. -- 将非王牌,带2的牌,炸弹牌,组合在一起(用于判断连续值)
  140. -- 移除手牌中的炸弹
  141. local temp = {}
  142. for _, v in pairs(valueCard) do
  143. if #v > 1 and #v < 4 then -- 插入大于1张,非炸弹的牌
  144. table.insert(temp, v[1]) -- 插入一个值即可,用于检测连对
  145. end
  146. end
  147. -- 移除手牌中的王牌和2
  148. local nt = self:removeValue_Joker_And_2(temp)
  149. local lineTable = self:getSubLine(nt) -- 所有可以连在一起的集合(扩展版)
  150. for i = #lineTable, 1, -1 do -- 移除顺子集合中小于长度2的顺子
  151. if #lineTable[i] < PokerUtil.Less_Lian_Dui / 2 then
  152. table.remove(lineTable, i)
  153. end
  154. end
  155. -- 将顺子所有牌整到同一个表
  156. local szCard = {}
  157. for _, v in ipairs(lineTable or {}) do
  158. for _, card in ipairs(v) do
  159. table.insert(szCard, card)
  160. end
  161. end
  162. -- 同顺表,非顺表
  163. local cbsCard, cnbsCard = {}, {}
  164. cbsCard, cnbsCard = self:parseShunZi(cards, szCard)
  165. local p_tcb = self:parseCardEx(cbsCard)
  166. local p_tcn = self:parseCardEx(cnbsCard)
  167. table.sort(p_tcb, function(a, b)
  168. return self:getCardValue(a[1]) < self:getCardValue(b[1])
  169. end)
  170. table.sort(p_tcn, function(a, b)
  171. return self:getCardValue(a[1]) < self:getCardValue(b[1])
  172. end)
  173. -- 插入非顺表中2个值
  174. for i, v in ipairs(p_tcn) do
  175. if #v == 2 then
  176. table.insert(result, v)
  177. end
  178. end
  179. -- 插入同顺表中2个值
  180. for i, v in ipairs(p_tcb) do
  181. if #v == 2 then
  182. table.insert(result, v)
  183. end
  184. end
  185. -- 遍历result,把低于target值得移除
  186. for i = #result, 1, -1 do
  187. if self:getCardValue(result[i][1]) <= lastCardInfo.min then
  188. table.remove(result, i)
  189. end
  190. end
  191. -- 如果没有对子可压,则从三张里面查找
  192. -- 原来来是只在2张里面做筛选,提示是不包含3张的,但是如果没有2张,即result结果为空,则需要从3张里面去插入
  193. if not next(result) then
  194. local temp = self:reParseCard(cards)
  195. local three = temp[3]
  196. local t = {}
  197. for i, v in pairs(three) do
  198. table.insert(t, valueCard[v])
  199. end
  200. for i, v in ipairs(t) do
  201. table.sort(v, PokerUtil.sortOrder)
  202. end
  203. table.sort(t, function(a, b)
  204. return self:getCardValue(a[1]) < self:getCardValue(b[1])
  205. end)
  206. for i, v in ipairs(t) do
  207. if self:getCardValue(v[1]) > lastCardInfo.min then
  208. local temp = {}
  209. table.insert(temp, v[1])
  210. table.insert(temp, v[2])
  211. table.insert(result, temp)
  212. end
  213. end
  214. end
  215. return result
  216. end
  217. -- 重写三张提示
  218. function newPokerUtil:getSanZhangTip(cards, lastData)
  219. local cards = clone(cards)
  220. local valueList, valueCard = self:parseCard(cards)
  221. local lastCardInfo = self:getCardsType(lastData)
  222. local result = {}
  223. -- 将非王牌,带2的牌,炸弹牌,组合在一起(用于判断连续值)
  224. -- 移除手牌中的炸弹
  225. local temp = {}
  226. for _, v in pairs(valueCard) do
  227. if #v == 3 then -- 插入刚好等于3张的牌
  228. table.insert(temp, v[1]) -- 插入一个值即可,用于检测飞机
  229. end
  230. end
  231. -- 移除手牌中的王牌和2
  232. local nt = self:removeValue_Joker_And_2(temp)
  233. local lineTable = self:getSubLine(nt) -- 所有可以连在一起的集合(扩展版)
  234. for i = #lineTable, 1, -1 do -- 移除顺子集合中小于长度2的顺子
  235. if #lineTable[i] < PokerUtil.Less_Plane / 3 then
  236. table.remove(lineTable, i)
  237. end
  238. end
  239. -- 将顺子所有牌整到同一个表
  240. local szCard = {}
  241. for _, v in ipairs(lineTable or {}) do
  242. for _, card in ipairs(v) do
  243. table.insert(szCard, card)
  244. end
  245. end
  246. -- 同顺表,非顺表
  247. local cbsCard, cnbsCard = {}, {}
  248. cbsCard, cnbsCard = self:parseShunZi(cards, szCard)
  249. local p_tcb = self:parseCardEx(cbsCard)
  250. local p_tcn = self:parseCardEx(cnbsCard)
  251. table.sort(p_tcb, function(a, b)
  252. return self:getCardValue(a[1]) < self:getCardValue(b[1])
  253. end)
  254. table.sort(p_tcn, function(a, b)
  255. return self:getCardValue(a[1]) < self:getCardValue(b[1])
  256. end)
  257. -- 插入非顺表中3个值
  258. for i, v in ipairs(p_tcn) do
  259. if #v == 3 then
  260. table.insert(result, v)
  261. end
  262. end
  263. -- 插入同顺表中3个值
  264. for i, v in ipairs(p_tcb) do
  265. if #v == 3 then
  266. table.insert(result, v)
  267. end
  268. end
  269. -- 遍历result,把低于target值得移除
  270. for i = #result, 1, -1 do
  271. if self:getCardValue(result[i][1]) <= lastCardInfo.min then
  272. table.remove(result, i)
  273. end
  274. end
  275. return result
  276. end
  277. -- 重写三带一提示
  278. function newPokerUtil:getSanDaiYiTip(cards, lastData)
  279. local nowCardsLen = table.nums(cards)
  280. local valueList, valueCard = self:parseCard(cards)
  281. local reValueList = self:reParseCard(cards)
  282. if nowCardsLen < 4 then -- 手牌数不够
  283. return {}
  284. end
  285. local threeTips = self:getSanZhangTip(cards, lastData)
  286. if not next(threeTips) then
  287. return {}
  288. end
  289. -- 压牌点提示时,若压三带一/二,则除了弹最小三张外,还需要弹起一/二单张(斗地主2.0更新)
  290. local result = {}
  291. local ovt = clone(reValueList[1])
  292. if #ovt <= 0 then
  293. return threeTips
  294. end
  295. table.sort(ovt, PokerUtil.sortOrder)
  296. for _, v in ipairs(threeTips) do
  297. for i = 1, 2 do
  298. local temp = clone(v)
  299. if ovt[i] then
  300. table.insert(temp, valueCard[ovt[i]][1])
  301. table.insert(result, temp)
  302. end
  303. end
  304. end
  305. return result
  306. end
  307. -- 重写三带二
  308. function newPokerUtil:getSanDaiYiDuiTip(cards, lastData)
  309. local nowCardsLen = table.nums(cards)
  310. local valueList, valueCard = self:parseCard(cards)
  311. local reValueList = self:reParseCard(cards)
  312. if nowCardsLen < 5 then -- 手牌数不够
  313. return {}
  314. end
  315. if table.nums(reValueList[2]) <= 0 and table.nums(reValueList[3]) <= 0 then -- 如果没有可以组成对子的(这里不加入炸弹,因为炸弹不拆,外部会添加炸弹处理)
  316. return {}
  317. end
  318. local threeTips = self:getSanZhangTip(cards, lastData)
  319. if not next(threeTips) then
  320. return {}
  321. end
  322. -- 压牌点提示时,若压三带一/二,则除了弹最小三张外,还需要弹起一/二单张(斗地主2.0更新)
  323. local result = {}
  324. local tvt = clone(reValueList[2])
  325. if #tvt <= 0 then
  326. return threeTips
  327. end
  328. table.sort(tvt, PokerUtil.sortOrder)
  329. for _, v in ipairs(threeTips) do
  330. for i = 1, 2 do
  331. local temp = clone(v)
  332. if tvt[i] then
  333. table.insert(temp, valueCard[tvt[i]][1])
  334. table.insert(temp, valueCard[tvt[i]][2])
  335. table.insert(result, temp)
  336. end
  337. end
  338. end
  339. return result
  340. end
  341. -- 重写顺子(把顺子中带炸弹的牌全部移除)
  342. function newPokerUtil:getShunZiTip(cards, lastData)
  343. local result = newPokerUtil.super.getShunZiTip(self, cards, lastData)
  344. local reValueList = self:reParseCard(cards)
  345. local bombCard = reValueList[4] -- 保存的是具体牌值
  346. local isHaveBomb = false
  347. for i = #result, 1, -1 do
  348. isHaveBomb = false
  349. for _, val in ipairs(result[i]) do
  350. for _, bv in ipairs(bombCard) do
  351. if self:getCardValue(val) == bv then
  352. isHaveBomb = true
  353. break
  354. end
  355. end
  356. if isHaveBomb then
  357. break
  358. end
  359. end
  360. if isHaveBomb then
  361. table.remove(result, i)
  362. end
  363. end
  364. return result
  365. end
  366. -- 重写连对(把连对中带炸弹的牌全部移除)
  367. function newPokerUtil:getLianDuiTip(cards, lastData)
  368. local result = newPokerUtil.super.getLianDuiTip(self, cards, lastData)
  369. local reValueList = self:reParseCard(cards)
  370. local bombCard = reValueList[4] -- 保存的是具体牌值
  371. local isHaveBomb = false
  372. for i = #result, 1, -1 do
  373. isHaveBomb = false
  374. for _, val in ipairs(result[i]) do
  375. for _, bv in ipairs(bombCard) do
  376. if self:getCardValue(val) == bv then
  377. isHaveBomb = true
  378. break
  379. end
  380. end
  381. if isHaveBomb then
  382. break
  383. end
  384. end
  385. if isHaveBomb then
  386. table.remove(result, i)
  387. end
  388. end
  389. return result
  390. end
  391. -- 检测牌组是否是连续的(返回连续的表值 cards每个值里面有且只有1个)
  392. function newPokerUtil:getSubLine(cards)
  393. local sub = {}
  394. local parseCards = self:changeCardValue_Standard_To_Specific(cards)
  395. for i=#parseCards,1,-1 do
  396. if parseCards[i] and parseCards[i-1] then
  397. if parseCards[i]-1~=parseCards[i-1] then
  398. --断开了
  399. local tmp = {}
  400. for j=#parseCards,i,-1 do
  401. table.insert(tmp, parseCards[j])
  402. end
  403. table.insert(sub, clone(tmp))
  404. for j=#parseCards,i,-1 do
  405. table.remove(parseCards, j)
  406. end
  407. else
  408. if i == 2 then
  409. table.insert(sub, clone(parseCards))
  410. end
  411. end
  412. end
  413. end
  414. -- 内部数据从小到大排序
  415. for i, v in ipairs(sub) do
  416. table.sort(v, PokerUtil.sortOrder)
  417. end
  418. -- 外部数据从小到大排序
  419. table.sort(sub, function(a, b)
  420. return a[1] < b[1]
  421. end)
  422. return sub
  423. end
  424. -- 获取顺子(返回可以组成顺子牌)(返回的是最多的顺子useLong = fasle)
  425. function newPokerUtil:getSubLineEx(cards)
  426. if not cards then
  427. return {}
  428. end
  429. -- 是否长度优先
  430. --[[
  431. 长度优先:123455667890 先提示5
  432. 多个顺子优先:123455667890 先提示1
  433. ]]
  434. local useLong = false -- 长度优先,关闭则是多个顺子优先
  435. -- 先移除手牌中为2的值
  436. local temp = clone(cards)
  437. local sub = {}
  438. for i = #temp, 1, -1 do
  439. local value = self:getCardValue(temp[i])
  440. local tag = false
  441. for _, v in ipairs(sub) do
  442. local v1 = self:getCardValue(v[#v] - 1)
  443. local v2 = value
  444. if v1 == v2 then
  445. table.insert(v, temp[i])
  446. tag = true
  447. if not useLong then
  448. break
  449. end
  450. end
  451. end
  452. if not tag then
  453. table.insert(sub, 1, {})
  454. table.insert(sub[1], temp[i])
  455. end
  456. end
  457. -- 将所有顺子判断,如果有其中一条顺子包含另一条顺子,则删除短的哪条
  458. local t = clone(sub)
  459. table.sort(t, function(a, b)
  460. return #a < #b
  461. end)
  462. if useLong then
  463. local temp = {}
  464. local tag = true
  465. for i = 1, #t do
  466. tag = true
  467. for j = i + 1, #t do
  468. local str1 = table.concat(t[i]) -- 短的
  469. local str2 = table.concat(t[j]) -- 长的
  470. if string.find(str2, str1) then -- 因为是有序的顺子,所以可以这么判断,不然只能双循环一个值一个值判断
  471. tag = false
  472. break
  473. end
  474. end
  475. if tag then
  476. table.insert(temp, t[i])
  477. end
  478. end
  479. sub = temp
  480. end
  481. for i, v in ipairs(sub) do
  482. table.sort(v, PokerUtil.sortOrder_By_PokerValue)
  483. end
  484. return sub
  485. end
  486. --[[
  487. 参数:手牌(标准值),顺子牌(标准值)
  488. 返回:
  489. 1.手牌中与顺子相同的值, (有序的key,value对应一个牌值)
  490. 2.手牌中与顺子不相同的值, (有序的key,value对应个数表)
  491. 3.表1中移除顺子,剩下的值, (有序的key,value对应个数表)
  492. ]]
  493. function newPokerUtil:parseShunZi(handCards, szCards)
  494. local cbsCard_Sinlge = {} -- 同顺表(单个)
  495. local cbsCard_Value = {} -- 同顺表(根据数值分类)
  496. local cnbsCard = {} -- 非顺表
  497. local lcbsCard = {} -- 移除同顺表顺子的剩下值
  498. local wi = false -- 一个标记,表示是否要插入到同顺表里面 willInsert
  499. for i, val in ipairs(handCards) do
  500. wi = false
  501. for _, v in ipairs(szCards) do
  502. if self:getCardValue(v) == self:getCardValue(val) then -- 判断值相同
  503. wi = true
  504. table.insert(cbsCard_Sinlge, val)
  505. break -- 跳出循环,轮到下一个手牌
  506. end
  507. end
  508. if not wi then
  509. table.insert(cnbsCard, handCards[i])
  510. end
  511. end
  512. local t = clone(cbsCard_Sinlge)
  513. for _, v in ipairs(szCards) do
  514. for i, val in ipairs(t) do
  515. if val == v then
  516. table.remove(t, i)
  517. break
  518. end
  519. end
  520. end
  521. -- 把相同的值合在一起
  522. lcbsCard = t
  523. cbsCard_Value = cbsCard_Sinlge
  524. table.sort(cbsCard_Value, PokerUtil.sortOrder_By_PokerValue)
  525. table.sort(cnbsCard, PokerUtil.sortOrder_By_PokerValue)
  526. table.sort(lcbsCard, PokerUtil.sortOrder_By_PokerValue)
  527. return cbsCard_Value, cnbsCard, lcbsCard
  528. end
  529. -- 选择的牌的处理(飞机,连对,顺子)
  530. function newPokerUtil:getCardInSelectCard(selectCards)
  531. if not isResetSelectCard then
  532. return selectCards
  533. end
  534. local selectCards = clone(selectCards)
  535. local valueList, valueCard = self:parseCard(selectCards)
  536. -----------------------------------------------------------------------------
  537. -- <<飞机>>
  538. -- 将非王牌,带2的牌,炸弹牌,组合在一起(用于判断连续值)
  539. -- 移除手牌中的炸弹
  540. local temp = {}
  541. for _, v in pairs(valueCard) do
  542. if #v == 3 then -- 插入刚好等于3张的牌
  543. table.insert(temp, v[1]) -- 插入一个值即可,用于检测飞机
  544. end
  545. end
  546. -- 移除手牌中的王牌和2
  547. local nt = self:removeValue_Joker_And_2(temp)
  548. local t = self:getMinInLine(nt, PokerUtil.Less_Plane / 3)
  549. local sameTable = self:getSameValueByVal(selectCards, t, 3)
  550. if #sameTable > 0 then
  551. print('jxjx 滑牌选牌,返回飞机')
  552. -- 滑动飞机牌时,若带了其他两张牌,则一起弹起(斗地主2.0更新)
  553. local totalCardCount = #sameTable + #sameTable/3
  554. if #selectCards == totalCardCount then
  555. return selectCards
  556. end
  557. return sameTable
  558. end
  559. -----------------------------------------------------------------------------
  560. -- <<连对>>
  561. local temp = {}
  562. for _, v in pairs(valueCard) do
  563. if #v > 1 and #v < 4 then -- 插入大于1张,非炸弹的牌
  564. table.insert(temp, v[1]) -- 插入一个值即可,用于检测连对
  565. end
  566. end
  567. -- 移除手牌中的王牌和2
  568. local nt = self:removeValue_Joker_And_2(temp)
  569. local t = self:getMinInLine(nt, PokerUtil.Less_Lian_Dui / 2)
  570. local sameTable = self:getSameValueByVal(selectCards, t, 2)
  571. if #sameTable > 0 then
  572. print('jxjx 滑牌选牌,返回连对')
  573. return sameTable
  574. end
  575. -----------------------------------------------------------------------------
  576. -- <<顺子>>
  577. local temp = {}
  578. for _, v in pairs(valueCard) do
  579. if #v ~= 4 then -- 插入非炸弹的牌
  580. table.insert(temp, v[1]) -- 插入一个值即可,用于检测顺子
  581. end
  582. end
  583. -- 移除手牌中的王牌和2
  584. local nt = self:removeValue_Joker_And_2(temp)
  585. local t = self:getMinInLine(nt, PokerUtil.Less_Line)
  586. local sameTable = self:getSameValueByVal(selectCards, t, 1)
  587. if #sameTable > 0 then
  588. print('jxjx 滑牌选牌,返回顺子')
  589. return sameTable
  590. end
  591. return selectCards
  592. end
  593. -- 获取最大长度的连续值表,长度最低是lessLength
  594. function newPokerUtil:getMaxLengthInLine(pCards, lessLength)
  595. local subLines = self:getSubLine(pCards)
  596. local lessLength = lessLength or 1
  597. local maxLengthIndex = 0 -- 最大长度的index
  598. local maxLength = 0 -- 最大长度
  599. for i, v in ipairs(subLines) do
  600. if #v > maxLength and #v >= lessLength then
  601. maxLength = #v
  602. maxLengthIndex = i
  603. end
  604. end
  605. if maxLengthIndex > 0 then
  606. return subLines[maxLengthIndex]
  607. else
  608. return {}
  609. end
  610. end
  611. -- 获取包含最小值的连续值表,长度最低是lessLength
  612. function newPokerUtil:getMinInLine(pCards, lessLength)
  613. local subLines = self:getSubLine(pCards)
  614. for i = #subLines, 1, -1 do
  615. if #subLines[i] < lessLength then
  616. table.remove(subLines, i)
  617. end
  618. end
  619. if next(subLines) then
  620. return subLines[1]
  621. else
  622. return {}
  623. end
  624. end
  625. -- sCards中,取tCards获得同样具体牌值的数值表 maxCount 单个数值最大个数
  626. function newPokerUtil:getSameValueByVal( sCards, tCards, maxCount)
  627. local temp = {}
  628. for _, t in ipairs(tCards) do
  629. local count = 0
  630. for _, s in ipairs(sCards) do
  631. local tVal = self:getCardValue(t)
  632. local sVal = self:getCardValue(s)
  633. if tVal == sVal and count < maxCount then
  634. table.insert(temp, s)
  635. count = count + 1
  636. end
  637. end
  638. end
  639. return temp
  640. end
  641. -- 移除王牌和2
  642. function newPokerUtil:removeValue_Joker_And_2(cards)
  643. if not cards then
  644. return {}
  645. end
  646. local t = self:changeCardValue_Standard_To_Specific(cards) -- 返回的是与cards顺序一致的具体牌值表
  647. local nt = {}
  648. for i, value in ipairs(t) do
  649. if value ~= Value_2 and value ~= Value_Joker_Little and value ~= Value_Joker_Big then
  650. table.insert(nt, cards[i])
  651. end
  652. end
  653. table.sort(nt, PokerUtil.sortOrder_By_PokerValue)
  654. return nt
  655. end
  656. return newPokerUtil