295 lines
5.8 KiB
Lua
295 lines
5.8 KiB
Lua
|
|
-- 检测牌是否存在
|
||
|
|
local function checkCard(eventCard,cardList,num)
|
||
|
|
num = num == nil and 1 or num
|
||
|
|
local result = 0
|
||
|
|
for i = 1,#cardList do
|
||
|
|
if (cardList[i] == eventCard) then
|
||
|
|
result = result + 1
|
||
|
|
if(result ==num) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
-- 移除指定数量的牌
|
||
|
|
local function removeCard(cardList, card,count)
|
||
|
|
for i=1,count do
|
||
|
|
list_remove(cardList,card)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function checkCardAndRomve(eventCard,cardList,num)
|
||
|
|
if(checkCard(eventCard,cardList,num)) then
|
||
|
|
removeCard(cardList,eventCard,num)
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
-- 获取列表中牌数量
|
||
|
|
local function cardNum(eventCard,cardList)
|
||
|
|
local result = 0
|
||
|
|
for i=1,#cardList do
|
||
|
|
local card = cardList[i]
|
||
|
|
if (card == eventCard) then
|
||
|
|
result = result + 1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return result
|
||
|
|
end
|
||
|
|
|
||
|
|
local zhongid = 412
|
||
|
|
|
||
|
|
|
||
|
|
local M = {
|
||
|
|
pair_count = 0,
|
||
|
|
cardList = nil,
|
||
|
|
stack = nil,
|
||
|
|
jiang = true
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function M:push(cardGroup)
|
||
|
|
self.stack[#self.stack+1] = cardGroup
|
||
|
|
end
|
||
|
|
|
||
|
|
function M:rollBack()
|
||
|
|
local cardGroup = self.stack[#self.stack]
|
||
|
|
table.remove(self.stack,#self.stack)
|
||
|
|
for _,card in ipairs(cardGroup) do
|
||
|
|
self.cardList[#self.cardList + 1] = card
|
||
|
|
end
|
||
|
|
table.sort(self.cardList)
|
||
|
|
end
|
||
|
|
|
||
|
|
function M:tryShunzi(card)
|
||
|
|
if (card < 400 and card % 100 > 7) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
if (checkCard(card + 1, self.cardList) and checkCard(card + 2, self.cardList)) then
|
||
|
|
removeCard(self.cardList, card, 1)
|
||
|
|
removeCard(self.cardList, card + 1, 1)
|
||
|
|
removeCard(self.cardList, card + 2, 1)
|
||
|
|
local cardGroup = {card,card+1,card+2}
|
||
|
|
self:push(cardGroup)
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function M:tryKezi(card)
|
||
|
|
if (checkCardAndRomve(card, self.cardList, 3)) then
|
||
|
|
local cardGroup = {card,card,card}
|
||
|
|
self:push(cardGroup)
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function M:tryPair(card)
|
||
|
|
if (self.pair_count > 0) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
if (self.jiang) then
|
||
|
|
if (not (card % 100 == 2 or card % 100 == 5 or card % 100 == 8)) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if (checkCardAndRomve(card, self.cardList, 2)) then
|
||
|
|
local cardGroup = {card,card}
|
||
|
|
self:push(cardGroup)
|
||
|
|
self.pair_count = 1
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function M:tryWin()
|
||
|
|
if (#self.cardList == 0 and self.pair_count == 1) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
if (#self.cardList == 0) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
local activeCard = self.cardList[1]
|
||
|
|
if (self:tryPair(activeCard)) then
|
||
|
|
if (self:tryWin()) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
self.pair_count = 0
|
||
|
|
self:rollBack()
|
||
|
|
end
|
||
|
|
|
||
|
|
if (self:tryKezi(activeCard)) then
|
||
|
|
if (self:tryWin()) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
self:rollBack()
|
||
|
|
end
|
||
|
|
|
||
|
|
if (self:tryShunzi(activeCard)) then
|
||
|
|
if (self:tryWin()) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
self:rollBack()
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
local function init(self,cardInhand,addCard,jiang)
|
||
|
|
self.stack = {}
|
||
|
|
self.pair_count = 0
|
||
|
|
self.jiang = jiang
|
||
|
|
self.cardList = membe_clone(cardInhand)
|
||
|
|
self.cardList[#self.cardList+1] = addCard
|
||
|
|
table.sort(self.cardList)
|
||
|
|
return self:tryWin()
|
||
|
|
end
|
||
|
|
|
||
|
|
local function quanqiuren(cardInhand,drawCard)
|
||
|
|
if (#cardInhand > 1) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
if (cardInhand[1] ~= drawCard) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
local function qingyise(fzList, cardInhand, drawCard)
|
||
|
|
local se = math.floor(cardInhand[1] / 100)
|
||
|
|
if (math.floor(drawCard / 100) ~= se) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
for i=1,#fzList do
|
||
|
|
local fz = fzList[i]
|
||
|
|
if (se ~= math.floor(fz.card / 100)) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
for i=1,#cardInhand do
|
||
|
|
if (se ~= math.floor(cardInhand[i] / 100)) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
local function jiangjiang(fzList, cardInhand,drawCard)
|
||
|
|
if (drawCard % 100 ~= 2 and drawCard % 100 ~= 5 and drawCard % 100 ~= 8) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
for i=1,#fzList do
|
||
|
|
local fz = fzList[i]
|
||
|
|
if (fz.type == FZType.Chi) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
if (fz.card % 100 ~= 2 and fz.card % 100 ~= 5 and fz.card % 100 ~= 8) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
for i=1,#cardInhand do
|
||
|
|
local card = cardInhand[i]
|
||
|
|
if (card % 100 ~= 2 and card % 100 ~= 5 and card % 100 ~= 8) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
local function checkQidui(cardList)
|
||
|
|
if (#cardList== 0) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
local card = cardList[1]
|
||
|
|
if (cardNum(card, cardList) >= 2) then
|
||
|
|
removeCard(cardList, card, 2)
|
||
|
|
if checkQidui(cardList) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function qixiaodui(cardInhand, drawCard)
|
||
|
|
if (#cardInhand ~= 13) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
local cardlist = membe_clone(cardInhand)
|
||
|
|
cardlist[#cardlist+1] = drawCard
|
||
|
|
return checkQidui(cardlist)
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
local function CheckPengPeng(cardList, jiang)
|
||
|
|
if (#cardList== 0) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
local card = cardList[1]
|
||
|
|
if (cardNum(card, cardList) >= 3) then
|
||
|
|
removeCard(cardList, card, 3)
|
||
|
|
return CheckPengPeng(cardList, jiang)
|
||
|
|
elseif (cardNum(card, cardList) == 2) and not jiang then
|
||
|
|
removeCard(cardList, card, 3)
|
||
|
|
jiang = true
|
||
|
|
return CheckPengPeng(cardList, jiang)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
local function pengpenghu(cardInhand, fzList, drawCard)
|
||
|
|
for i = 1, #fzList do
|
||
|
|
local tem = fzList[i]
|
||
|
|
if tem.type == FZType.Chi then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
local cardlist = membe_clone(cardInhand)
|
||
|
|
cardlist[#cardlist+1] = drawCard
|
||
|
|
return CheckPengPeng(cardlist, false)
|
||
|
|
end
|
||
|
|
|
||
|
|
function M.tingPai(cardInhand,fzList)
|
||
|
|
local self = setmetatable({}, {__index = M})
|
||
|
|
local tingList = {}
|
||
|
|
if not cardInhand or #cardInhand == 0 then
|
||
|
|
return tingList
|
||
|
|
end
|
||
|
|
for k=100,300,100 do
|
||
|
|
for i=1,9 do
|
||
|
|
local tem = k + i
|
||
|
|
local result = false
|
||
|
|
result = qixiaodui(cardInhand,tem)
|
||
|
|
if not result then
|
||
|
|
result = quanqiuren(cardInhand,tem)
|
||
|
|
end
|
||
|
|
if not result then
|
||
|
|
result = jiangjiang(fzList,cardInhand,tem)
|
||
|
|
end
|
||
|
|
if not result then
|
||
|
|
if qingyise(fzList,cardInhand,tem) then
|
||
|
|
result = init(self,cardInhand,tem,false)
|
||
|
|
else
|
||
|
|
result = init(self,cardInhand,tem,true)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if not result then
|
||
|
|
result = pengpenghu(cardInhand, fzList, tem)
|
||
|
|
end
|
||
|
|
if(result) then
|
||
|
|
tingList[#tingList + 1] = tem
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return tingList
|
||
|
|
end
|
||
|
|
|
||
|
|
return M
|