没有看到别人怎么写的,这个是上家公司老板写的,当时服务器用的js写的,我搬到了客户端上,换成了lua。然后现在工作要用到,一时还想不起来。所以说造过的轮子要记录下来,方便自己,也方便他人。

主要的思路就是根据上家的出牌,先判断出type(单,对,顺子,炸弹等),然后根据type去寻找该类型的所有牌组合。所以每个类型都要有个对应的方法。可以在找的时候直接传入参数,直接找大于该牌的组合。也可以找出该类型的所有组合后再对比剔除小于它的组合。最后加上炸弹,基本就是所有能出的牌型了。

找每个牌型的组合时,这里用的方法是:先根据牌等级(或者牌数字)将所有手牌合并成一个哈希表,然后根据这个哈希表来算。这里的牌的数据结构是1-13,17-29,33-45,49-61,78,79。1-13(A,2,3,4....J,Q,K)后面依次类推。

--扑克管理类
-- PokerManager = class("PokerManager")
PokerManager = {}
local PokerAB = nil
local Pokers = {}CardType = {}--空牌 1, // 非法牌型
CardType.CT_ERROR = 1
--单张 1张牌
CardType.CT_SINGLE = 2
--对子 2张牌
CardType.CT_DOUBLE =3
--顺子
CardType.CT_SINGLE_LINE = 4
--连对
CardType.CT_DOUBLE_LINE = 5
--三条 3张牌
CardType.CT_THREE =6
--3带1 4张牌
CardType.CT_THREE_TAKE_ONE  = 7
--3带2 5张牌
CardType.CT_THREE_TAKE_TWO  = 8
--4带2单 6张牌
CardType.CT_FOUR_TAKE_ONE = 9
--4带2对 8张牌
CardType.CT_FOUR_TAKE_TWO  = 10
--飞机 3顺
CardType.CT_THREE_LINE = 11
--飞机带小翼 3顺+ 同数量单牌
CardType.CT_THREE_LINE_S = 12
--飞机带大翼 3顺+ 同数量双牌
CardType.CT_THREE_LINE_B = 13
--4张同号的炸弹 4张牌
CardType.CT_BOMB_CARD = 14
--双王火箭
CardType.CT_MISSILE_CARD = 15function PokerManager:ctor()PokerAB = nilself.PokerABName = "poker"ABManager.getBundle(self.PokerABName,function(ab)PokerAB = abprint(PokerAB.name)end)self.Joker = {"black_joker", "red_joker"}self.PokersName = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13"}--黑桃、红心、梅花、方块self.PokersType = {"spade_", "heart_", "club_", "diamond_"}
end--设置贴图
function PokerManager:setPoker(target, serverIndex, fuc)local index = tonumber(serverIndex)if PokerAB thenif index == 78 then --如果id编号在扑克资源表中target.sprite = PokerAB:LoadAsset(self.Joker[1], typeof(U3D.Sprite))elseif index == 79 thentarget.sprite = PokerAB:LoadAsset(self.Joker[2], typeof(U3D.Sprite))elsetarget.sprite = PokerAB:LoadAsset(self.PokersType[self:GetColor(index)] .. self.PokersName[self:GetNumber(index)], typeof(U3D.Sprite))endfuc()end
end
--设置扑克牌背景
function PokerManager:setPokerBG(target, name, fuc)if PokerAB thenif target thentarget.sprite = PokerAB:LoadAsset(name, typeof(U3D.Sprite))endfuc()end
end
--获取花色名称 lua的table从1开始,因此除值后需要加1
function PokerManager:GetColor(serverIndex)if serverIndex ~= 79 and serverIndex ~= 78 thenreturn math.modf(serverIndex / 16) + 1elsereturn serverIndexend
end
--获取数字
function PokerManager:GetNumber(serverIndex)if serverIndex ~= 79 and serverIndex ~= 78 thenreturn serverIndex % 16elsereturn serverIndexend
end
--获取卡牌优先级 15 ~ 1(王、2、1、K、Q、J、10 ~ 3)
function PokerManager:GetGrad(serverIndex)-- bodylocal num = serverIndex % 16if num == 1 thenreturn 12elseif num == 2 thenreturn 13elseif num > 2 and num < 14 thenreturn num - 2elsereturn numend
end--排序
function PokerManager:SortCards(cardsData)-- body--卡牌排序(先优先级,后花色)local cachePos = #cardsData - 1while cachePos > 0 dolocal pos = 0for i = 1, cachePos doif self:GetGrad(cardsData[i]) < self:GetGrad(cardsData[i + 1]) then --判断优先级pos = ilocal tmp = cardsData[i] --缓存小值cardsData[i] = cardsData[i + 1]cardsData[i + 1] = tmpendif self:GetGrad(cardsData[i]) == self:GetGrad(cardsData[i + 1]) then --判断花色if self:GetColor(cardsData[i]) > self:GetColor(cardsData[i + 1]) thenpos = ilocal tmp = cardsData[i]cardsData[i] = cardsData[i + 1]cardsData[i + 1] = tmpendendcachePos = posendendreturn cardsData
end--排序 从小到大
function PokerManager:SortCardsSmallToBig(cardsData)-- body--卡牌排序(先优先级,后花色)local cachePos = #cardsData - 1while cachePos > 0 dolocal pos = 0for i = 1, cachePos doif self:GetGrad(cardsData[i]) > self:GetGrad(cardsData[i + 1]) then --判断优先级pos = icardsData[i],cardsData[i+1] = cardsData[i+1],cardsData[i]endif self:GetGrad(cardsData[i]) == self:GetGrad(cardsData[i + 1]) then --判断花色if self:GetColor(cardsData[i]) > self:GetColor(cardsData[i + 1]) thenpos = icardsData[i],cardsData[i+1] = cardsData[i+1],cardsData[i]endendcachePos = posendendreturn cardsData
end--获取牌型
function PokerManager:GetCardType(cardsData)cardsData = self:SortCards(cardsData)-- bodylocal cardsCount = #cardsData --卡牌数量if cardsCount == 0 then --空牌return CardType.CT_ERRORelseif cardsCount == 1 then --单张return CardType.CT_SINGLEelseif cardsCount == 2 then --对子、火箭if self:IsMissile(cardsData) thenreturn CardType.CT_MISSILE_CARDendif self:IsDouble(cardsData) thenreturn CardType.CT_DOUBLEendreturn CardType.CT_ERRORelseif cardsCount == 3 then --三条if self:IsThree(cardsData) thenreturn CardType.CT_THREEendelseif cardsCount == 4 then --炸弹、三带一if self:IsBomb(cardsData) thenreturn CardType.CT_BOMB_CARDendif self:IsThreeTakeOne(cardsData) thenreturn CardType.CT_THREE_TAKE_ONEendelseif cardsCount >= 5 then --三带二,连对,飞机,顺子if cardsCount == 5 then --三带二if self:IsThreeTakeTwo(cardsData) thenreturn CardType.CT_THREE_TAKE_TWOendelseif cardsCount == 6 then --四带两单if self:IsFourTakeTwo(cardsData) thenreturn CardType.CT_FOUR_TAKE_ONEendelseif cardsCount == 8 then --四带两对if self:IsFourTakeTwoDouble(cardsData) thenreturn CardType.CT_FOUR_TAKE_TWOendendif cardsCount >= 8 then --飞机if self:IsThreeLine(cardsData) thenreturn CardType.CT_THREE_LINEelseif self:IsThreeLineAndSWing(cardsData) thenreturn CardType.CT_THREE_LINE_Selseif self:IsThreeLineAndBWing(cardsData) thenreturn CardType.CT_THREE_LINE_Bendendif cardsCount > 5 and cardsCount % 2 == 0 then --连对if self:IsDoubleLine(cardsData) thenreturn CardType.CT_DOUBLE_LINEendendif self:IsSingleLine(cardsData) then --顺子return CardType.CT_SINGLE_LINEendendreturn CardType.CT_ERROR
end
--能出牌与否
function PokerManager:CanShow(selfPokers, showPokers)if #selfPokers < #showPokers thenreturn nilendlocal type = self:GetCardType(showPokers)print("type=============>" .. type)local show = {}if #show > 0 thenreturn showelsereturn nilend
end
--对子
function PokerManager:IsDouble(cardsData)-- bodyif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) thenreturn trueendreturn false
end--火箭(王炸)
function PokerManager:IsMissile(cardsData)-- bodyif (cardsData[1] == 78 or cardsData[1] == 79) and (cardsData[2] == 78 or cardsData[2] == 79) thenreturn trueendreturn false
end--三条
function PokerManager:IsThree(cardsData)-- bodyif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) and self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[3]) thenreturn trueendreturn false
end--炸弹
function PokerManager:IsBomb(cardsData)-- bodyif #cardsData == 4 thenif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) and self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[3]) and self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[4]) thenreturn trueendendreturn false
end--三带一
function PokerManager:IsThreeTakeOne(cardsData)-- bodyif self:IsBomb(cardsData) thenreturn falseendif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) and self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[3]) thenreturn trueendif self:GetGrad(cardsData[2]) == self:GetGrad(cardsData[3]) and self:GetGrad(cardsData[2]) == self:GetGrad(cardsData[4]) thenreturn trueendreturn false
end--三带二
function PokerManager:IsThreeTakeTwo(cardsData)-- bodyif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) and self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[3]) thenif self:GetGrad(cardsData[4]) == self:GetGrad(cardsData[5]) thenreturn trueendendif self:GetGrad(cardsData[3]) == self:GetGrad(cardsData[4]) and self:GetGrad(cardsData[3]) == self:GetGrad(cardsData[5]) thenif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) thenreturn trueendendreturn false
end--四带二
function PokerManager:IsFourTakeTwo(cardsData)-- bodyif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) and self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[3]) and self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[4]) thenreturn trueendif self:GetGrad(cardsData[3]) == self:GetGrad(cardsData[4]) and self:GetGrad(cardsData[3]) == self:GetGrad(cardsData[5]) and self:GetGrad(cardsData[3]) == self:GetGrad(cardsData[6]) thenreturn trueendreturn false
end--四带两对
function PokerManager:IsFourTakeTwoDouble(cardsData)-- bodyif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) and self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[3]) and self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[4]) thenif self:GetGrad(cardsData[5]) == self:GetGrad(cardsData[6]) and self:GetGrad(cardsData[7]) == self:GetGrad(cardsData[8]) thenreturn trueendendif self:GetGrad(cardsData[3]) == self:GetGrad(cardsData[4]) and self:GetGrad(cardsData[3]) == self:GetGrad(cardsData[5]) and self:GetGrad(cardsData[3]) == self:GetGrad(cardsData[6]) thenif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) and self:GetGrad(cardsData[7]) == self:GetGrad(cardsData[8]) thenreturn trueendendif self:GetGrad(cardsData[5]) == self:GetGrad(cardsData[6]) and self:GetGrad(cardsData[5]) == self:GetGrad(cardsData[7]) and self:GetGrad(cardsData[5]) == self:GetGrad(cardsData[8]) thenif self:GetGrad(cardsData[1]) == self:GetGrad(cardsData[2]) and self:GetGrad(cardsData[3]) == self:GetGrad(cardsData[4]) thenreturn trueendendreturn false
end--顺子
function PokerManager:IsSingleLine(cardsData)-- bodylocal length = #cardsDatafor i = 1, length doif cardsData[i] == 78 or cardsData[i] == 79 or self:GetGrad(cardsData[i]) == 13 then --顺子不包括大小王 and 2return falseendif i + 1 < length thenif self:GetGrad(cardsData[i]) - self:GetGrad(cardsData[i + 1]) ~= 1 thenreturn falseendendendreturn true
end--连对
function PokerManager:IsDoubleLine(cardsData)-- bodylocal length = #cardsDatafor i = 1, length doif cardsData[i] == 78 or cardsData[i] == 79 or self:GetGrad(cardsData[i]) == 13 then --连对不包括大小王 and 2return falseendendfor i = 1, length, 2 doif self:GetGrad(cardsData[i]) ~= self:GetGrad(cardsData[i + 1]) thenreturn falseendif i + 2 < length thenif self:GetGrad(cardsData[i]) - self:GetGrad(cardsData[i + 2]) ~= 1 thenreturn falseendendendreturn true
end
--飞机 (3顺)
function PokerManager:IsThreeLine(cardsData)local length = #cardsData--找出连续三张,并且连续三张不能是 2local threeCache = {}for i = 1, length doif i + 2 <= length thenif self:GetGrad(cardsData[i]) == self:GetGrad(cardsData[i + 1]) and self:GetGrad(cardsData[i]) == self:GetGrad(cardsData[i + 2]) thenif self:IsContainGrad(threeCache, cardsData[i]) == false thenthreeCache[#threeCache + 1] = cardsData[i]endendelsebreakendendif #threeCache * 3 == length thenreturn trueelsereturn falseend
end--飞机带小翅膀
function PokerManager:IsThreeLineAndSWing(cardsData)-- bodylocal length = #cardsData--找出连续三张,并且连续三张不能是 2local threeCache = {}for i = 1, length doif i + 2 <= length thenif self:GetGrad(cardsData[i]) == self:GetGrad(cardsData[i + 1]) and self:GetGrad(cardsData[i]) == self:GetGrad(cardsData[i + 2]) thenif self:IsContainGrad(threeCache, cardsData[i]) == false thenthreeCache[#threeCache + 1] = cardsData[i]endendelsebreakendend--查找三张是否连续local threeCacheLength = #threeCacheif threeCacheLength > 1 thenfor i = 1, threeCacheLength doif i + 1 < threeCacheLength thenif self:GetGrad(threeCache[i]) - self:GetGrad(threeCache[i + 1]) ~= 1 thenreturn falseendendendelsereturn falseend--只能是带一个或是带一对--计算带牌数量if threeCacheLength * (3 + 1) == length thenreturn trueelsereturn falseend
end--飞机带大翅膀
function PokerManager:IsThreeLineAndBWing(cardsData)-- bodylocal length = #cardsData--找出连续三张,并且连续三张不能是 2local threeCache = {}for i = 1, length doif i + 2 <= length thenif self:GetGrad(cardsData[i]) == self:GetGrad(cardsData[i + 1]) and self:GetGrad(cardsData[i]) == self:GetGrad(cardsData[i + 2]) thenif self:IsContainGrad(threeCache, cardsData[i]) == false thenthreeCache[#threeCache + 1] = cardsData[i]endendelsebreakendend--查找三张是否连续local threeCacheLength = #threeCacheif threeCacheLength > 1 thenfor i = 1, threeCacheLength doif i + 1 < threeCacheLength thenif self:GetGrad(threeCache[i]) - self:GetGrad(threeCache[i + 1]) ~= 1 thenreturn falseendendendelsereturn falseendlocal doubleCache = {}if threeCacheLength * (3 + 2) == length then--找对子,对子数量 = 三条的数量for i = 1, length, 2 doif i + 2 < length thenif self:GetGrad(cardsData[i]) == self:GetGrad(cardsData[i + 1]) thenfor j = 1, threeCacheLength doif self:IsContainGrad(threeCache, cardsData[i]) == false and self:IsContainGrad(doubleCache, cardsData[i]) == false thendoubleCache[#doubleCache + 1] = cardsData[i]endendendendendif #doubleCache == threeCacheLength thenreturn trueendendreturn false
end
--是否包含同级牌
function PokerManager:IsContainGrad(data, value)-- bodylocal length = #dataif length == 0 thenreturn falseendfor i = 1, length doif self:GetGrad(data[i]) == self:GetGrad(value) thenreturn trueendendreturn false
end
--比较牌型和大小
function PokerManager:ComparePokers(type, _pokes, _targetpokers)_pokes = self:SortCards(_pokes)_targetpokers = self:SortCards(_targetpokers)--判断对手牌型是否是王炸if type == CardType.CT_MISSILE_CARD thenreturn falseend--如果自己出的牌是王炸if self:IsMissile(_pokes) thenprint("自己出的牌是王炸")return trueend--如果对手牌型是炸弹if type == CardType.CT_BOMB_CARD thenif self:IsBomb(_pokes) thenif self:GetGrad(_pokes[1]) > self:GetGrad(_targetpokers[1]) thenreturn trueelseprint("Bomb is low")return falseendelse--自己出的不是炸弹return falseendelse--对手出的牌型非炸弹--如果自己出的是炸弹if self:IsBomb(_pokes) thenreturn trueendif #_pokes == #_targetpokers thenif type == self:GetCardType(_pokes) thenif self:GetGrad(_pokes[1]) > self:GetGrad(_targetpokers[1]) thenreturn trueelse--首张牌优先级不够对手高print("first is low")return falseendelse--牌型不一致print("type is not the same")return falseendelse--出的牌数量不一致print("count is not the same")return falseendend
end
--提示出牌
function PokerManager:TipsSendPokers(prepokers, selfpokers)--获取牌的牌型local t = PokerManager:GetCardType(prepokers)if t == CardType.CT_ERROR then--如果不成牌型return {}elseif  t == CardType.CT_BOMB_CARD then--如果是炸弹local minNum = self:SortCardsSmallToBig(prepokers)[1]local resultArr = self:FindAllBombAndMissile(selfpokers,self:GetGrad(minNum))if resultArr and #resultArr > 0 thenreturn resultArrelsereturn {}endelse--其他所有牌型local resultArr = {}local minNum = self:SortCardsSmallToBig(prepokers)[1]--获取当前牌型的牌if t == CardType.CT_SINGLE thenresultArr = self:FindAllSingle(selfpokers,minNum)elseif t == CardType.CT_DOUBLE thenresultArr = self:FindAllDouble(selfpokers,minNum)elseif t == CardType.CT_THREE thenresultArr = self:FindAllThree(selfpokers,minNum)elseif t == CardType.CT_SINGLE_LINE thenresultArr = self:FindAllSingleLine(selfpokers,minNum,#prepokers)elseif t == CardType.CT_DOUBLE_LINE thenresultArr = self:FindAllDoubleLine(selfpokers,minNum,#prepokers/2)elseif t == CardType.CT_THREE_TAKE_ONE thenresultArr = self:FindAllThreeTakeOne(selfpokers,minNum)elseif t == CardType.CT_THREE_TAKE_TWO thenresultArr = self:FindAllThreeTakeTwo(selfpokers,minNum)elseif t == CardType.CT_FOUR_TAKE_ONE thenresultArr = self:FindAllFourTakeOne(selfpokers,minNum)elseif t == CardType.CT_FOUR_TAKE_TWO thenresultArr = self:FindAllFourTakeTwo(selfpokers,minNum)elseif t == CardType.CT_THREE_LINE thenresultArr = self:FindAllThreeLine(selfpokers,minNum,#prepokers/3)elseif t == CardType.CT_THREE_LINE_S thenresultArr = self:FindAllThreeLineS(selfpokers,minNum,#prepokers/4)elseif t == CardType.CT_THREE_LINE_B thenresultArr = self:FindAllThreeLineB(selfpokers,minNum,#prepokers/5)end--获取所有的炸弹和王炸for k,v in pairs(self:FindAllBombAndMissile(selfpokers)) dotable.insert(resultArr,v)endreturn resultArrend
end--根据牌优先级合并成一个哈希表
function PokerManager:TOHashTable(selfPoker)local hashTable = {}for i=1,16 dohashTable[i] = {}endfor k,v in pairs(selfPoker) doif v < 78 thentable.insert(hashTable[self:GetGrad(v)],v)elseif v == 78 thenhashTable[-1] = velseif v == 79 thenhashTable[-2] = vendendreturn hashTable
end--找出所有符合条件的炸弹和王炸
function PokerManager:FindAllBombAndMissile(selfPokers,min)if min thenif min == 16 thenreturn falseendelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}for i=min+1,#hashTable doif #hashTable[i] == 4 thentable.insert(resultArr,hashTable[i])endendif hashTable[-1] and hashTable[-2] thentable.insert(resultArr,{hashTable[-1],hashTable[-2]})endreturn resultArr
end--找出所有符合条件的炸弹
function PokerManager:FindAllBomb(selfPokers,min)if min thenif min == 16 thenreturn falseendelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}for i=min+1,#hashTable doif #hashTable[i] == 4 thentable.insert(resultArr,hashTable[i])endendreturn resultArr
end--找出所有符合条件的单牌
function PokerManager:FindSingles(selfPokers,min)if min thenif min == 16 thenreturn falseendelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}for i=min+1,#hashTable doif #hashTable[i] == 1 thentable.insert(resultArr,hashTable[i])endendreturn resultArr
end--找出所有符合条件的单牌
function PokerManager:FindAllSingle(selfPokers,min)if min thenif min == 16 thenreturn falseendelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}for i=min+1,#hashTable doif #hashTable[i] == 1 thentable.insert(resultArr,hashTable[i])endendfor i=min+1,#hashTable doif #hashTable[i] == 2 thentable.insert(resultArr,{hashTable[i][1]})table.insert(resultArr,{hashTable[i][2]})endendfor i=min+1,#hashTable doif #hashTable[i] == 3 thentable.insert(resultArr,{hashTable[i][1]})table.insert(resultArr,{hashTable[i][2]})table.insert(resultArr,{hashTable[i][3]})endendreturn resultArr
end--找出所有符合条件的对子
function PokerManager:FindAllDouble(selfPokers,min)if min thenif min == 16 thenreturn falseendelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}for i=min+1,#hashTable doif #hashTable[i] == 2 thentable.insert(resultArr,hashTable[i])endendreturn resultArr
end--找出所有符合条件的三条
function PokerManager:FindAllThree(selfPokers,min)if min thenif min == 16 thenreturn falseendelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}for i=1,#hashTable doif #hashTable[i] == 3 thentable.insert(resultArr,hashTable[i])endendreturn resultArr
end--找出所有符合条件的顺子
function PokerManager:FindAllSingleLine(selfPokers,min,count)-- print("min,count:",min,count)if min thenif min == 16 thenreturn {}endelsemin = 0endif count thenif count == 13 thenreturn {}endif count > #selfPokers thenreturn {}endelsecount = 5endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}for i=min+1,16-count dolocal tempArr = {}for j=0,count-1 doif #hashTable[i+j] > 0 thentable.insert(tempArr,hashTable[i+j][1])elsebreakendendif #tempArr == count thentable.insert(resultArr,tempArr)endendreturn resultArr
end--找出所有符合条件的连对
function PokerManager:FindAllDoubleLine(selfPokers,min,count)-- print("min,count:",min,count)if min thenif min == 16 thenreturn {}endelsemin = 0endif count thenif count == 13 thenreturn {}endif count > #selfPokers thenreturn {}endelsecount = 3endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}for i=min+1,16-count dolocal tempArr = {}for j=0,count-1 doif #hashTable[i+j] > 1 thentable.insert(tempArr,hashTable[i+j][1])table.insert(tempArr,hashTable[i+j][2])elsebreakendendif #tempArr == count*2 thentable.insert(resultArr,tempArr)endendreturn resultArr
end--找出所有符合条件的三带一
function PokerManager:FindAllThreeTakeOne(selfPokers,min)if min thenif min == 16 thenreturn {}endif #selfPokers < 4 thenreturn {}endelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}local threeArr = self:FindAllThree(selfPokers,min)if #threeArr > 0 then--找一个要带的单牌local singleCard = nillocal singleArr = self:FindSingles(selfPokers)if #singleArr > 0 thensingleCard = singleArr[1][1]else--没有单牌,优先从对子里找一个for i=1,#hashTable doif #hashTable[i]==2 thensingleCard = hashTable[i][1]breakendend--没有对子,从3条里找一个if singleCard == nil thenfor i=1,#hashTable doif #hashTable[i]==3 and i ~= min thensingleCard = hashTable[i][1]breakendendendendif singleCard thenfor i=1,#threeArr dotable.insert(threeArr[i],singleCard)table.insert(resultArr,threeArr[i])endreturn resultArrelsereturn {}endelsereturn {}end
end--找出所有符合条件的三带二
function PokerManager:FindAllThreeTakeTwo(selfPokers,min)if min thenif min == 16 thenreturn {}endif #selfPokers < 5 thenreturn {}endelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}local threeArr = self:FindAllThree(selfPokers,min)if #threeArr > 0 then--找一对要带的对子local doubleCardArr = {}local doubleArr = self:FindAllDouble(selfPokers)if #doubleArr > 0 thendoubleCardArr = doubleArr[1]elsefor i=1,#hashTable doif #hashTable[i]==3 and i ~= min thendoubleCardArr = hashTable[i]table.insert(doubleCardArr,hashTable[i][1])table.insert(doubleCardArr,hashTable[i][2])breakendendendif #doubleCardArr == 2 thenfor i=1,#threeArr dotable.insert(threeArr[i],doubleCardArr[1])table.insert(threeArr[i],doubleCardArr[2])table.insert(resultArr,threeArr[i])endreturn resultArrelsereturn {}endelsereturn {}end
end--找出所有符合条件的四带两单
function PokerManager:FindAllFourTakeOne(selfPokers,min)if min thenif min == 16 thenreturn {}endif #selfPokers < 6 thenreturn {}endelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}local fourArr = self:FindAllBomb(selfPokers,min)if #fourArr > 0 then--找2个要带的单牌local singleCardArr = {}local singleArr = self:FindSingles(selfPokers)if #singleArr > 0 thenfor i=1,#singleArr dotable.insert(singleCardArr,singleArr[i][1])if #singleCardArr == 2 thenbreakendendendif #singleCardArr < 2 then--没有2张单牌,优先从对子里找for i=1,#hashTable doif #hashTable[i]==2 thenif #singleCardArr == 0 thensingleCardArr = hashTable[i]elsetable.insert(singleCardArr,hashTable[i][1])endbreakendend--没有对子,从3条里找if #singleCardArr == 0 thenfor i=1,#hashTable doif #hashTable[i]==3 and i ~= min thentable.insert(singleCardArr,hashTable[i][1])if #singleCardArr == 0 thentable.insert(singleCardArr,hashTable[i][2])endbreakendendendendif #singleCardArr == 2 thenfor i=1,#fourArr dotable.insert(fourArr[i],singleCardArr[1])table.insert(fourArr[i],singleCardArr[2])table.insert(resultArr,fourArr[i])endreturn resultArrelsereturn {}endelsereturn {}end
end--找出所有符合条件的四带两对
function PokerManager:FindAllFourTakeTwo(selfPokers,min)if min thenif min == 16 thenreturn {}endif #selfPokers < 8 thenreturn {}endelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}local fourArr = self:FindAllBomb(selfPokers,min)if #fourArr > 0 then--找2个要带的对子local doubleCardArr = {}local doubleArr = self:FindAllDouble(selfPokers)if #doubleArr == 2 thentable.insert(doubleCardArr,doubleArr[1][1])table.insert(doubleCardArr,doubleArr[1][2])table.insert(doubleCardArr,doubleArr[2][1])table.insert(doubleCardArr,doubleArr[2][2])elseif #doubleArr == 1 thentable.insert(doubleCardArr,doubleArr[1][1])table.insert(doubleCardArr,doubleArr[1][2])end--不够2个对子,从3条里找2个if #doubleCardArr < 4 thenfor i=1,#hashTable doif #hashTable[i]==3 and i ~= min thentable.insert(doubleCardArr,hashTable[i][1])table.insert(doubleCardArr,hashTable[i][2])if #doubleCardArr == 4 thenbreakendendendendendif #doubleCardArr == 4 thenfor i=1,#fourArr dotable.insert(fourArr[i],doubleCardArr[1])table.insert(fourArr[i],doubleCardArr[2])table.insert(fourArr[i],doubleCardArr[3])table.insert(fourArr[i],doubleCardArr[4])table.insert(resultArr,fourArr[i])endreturn resultArrelsereturn {}endelsereturn {}end
end--找出所有符合条件的飞机(三顺)
function PokerManager:FindAllThreeLine(selfPokers,min,count)if min thenif min == 16 thenreturn {}endelsemin = 0endif count thenif count == 13 thenreturn {}endif count > #selfPokers thenreturn {}endelsecount = 3endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}for i=min+1,16-count dolocal tempArr = {}for j=0,count-1 doif #hashTable[i+j] > 2 thentable.insert(tempArr,hashTable[i+j][1])table.insert(tempArr,hashTable[i+j][2])table.insert(tempArr,hashTable[i+j][3])elsebreakendendif #tempArr == count*3 thentable.insert(resultArr,tempArr)endendreturn resultArr
end--找出所有符合条件的飞机带小翼(三顺+同数量单牌)
function PokerManager:FindAllThreeLineS(selfPokers,min,count)if min thenif min == 16 thenreturn {}endif #selfPokers < 12 thenreturn {}endelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}local threeArr = self:FindAllThreeLine(selfPokers,min,count)if #threeArr > 0 then--找count个要带的单牌local singleCardArr = {}local singleArr = self:FindSingles(selfPokers)if #singleArr > 0 thenfor i=1,#singleArr dotable.insert(singleCardArr,singleArr[i][1])if #singleCardArr >= count thenbreakendendendif #singleCardArr<count then--不够单牌,优先从对子里找for i=1,#hashTable doif #hashTable[i]==2 thentable.insert(singleCardArr,hashTable[i][1])if #singleCardArr<count thentable.insert(singleCardArr,hashTable[i][2])elsebreakendendendendif #singleCardArr<count then--不够单牌,从3条里找for i=1,#hashTable doif #hashTable[i]==3 and i ~= min then-- singleCardArr = hashTable[i][1]-- breakfor j=1,#hashTable[i] dotable.insert(singleCardArr,hashTable[i][j])if #singleCardArr >= count thenbreakendendif #singleCardArr >= count thenbreakendendendendif #singleCardArr == count thenfor i=1,#threeArr dofor j=1,#singleCardArr dotable.insert(threeArr[i],singleCardArr[j])endtable.insert(resultArr,threeArr[i])endreturn resultArrelsereturn {}endelsereturn {}end
end--找出所有符合条件的飞机带大翼(三顺+同数量对子)
function PokerManager:FindAllThreeLineB(selfPokers,min,count)if min thenif min == 16 thenreturn {}endif #selfPokers < 15 thenreturn {}endelsemin = 0endlocal hashTable = self:TOHashTable(selfPokers)local resultArr = {}local threeArr = self:FindAllThreeLine(selfPokers,min,count)if #threeArr > 0 then--找count个要带的对子local doubleCardArr = {}local doubleArr = self:FindAllDouble(selfPokers)if #doubleArr > 0 thenfor i=1,#doubleArr dotable.insert(doubleCardArr,doubleArr[i][1])table.insert(doubleCardArr,doubleArr[i][2])if #doubleCardArr >= count*2 thenbreakendendendif #doubleCardArr<count*2 then--不够对子,从3条里找for i=1,#hashTable doif #hashTable[i]==3 and i ~= min thentable.insert(doubleCardArr,hashTable[i][1])table.insert(doubleCardArr,hashTable[i][2])if #doubleCardArr >= count*2 thenbreakendendendendif #doubleCardArr == count*2 thenfor i=1,#threeArr dofor j=1,#doubleCardArr dotable.insert(threeArr[i],doubleCardArr[j])endtable.insert(resultArr,threeArr[i])endreturn resultArrelsereturn {}endelsereturn {}end
endlocal myPoker = {22,38,54,23,39,55,24,40,56,9,10,26,11,27,12,28}local r = PokerManager:TipsSendPokers({3,19,35,4,20,36,5,21,37,6,22,7,23,8,24},myPoker)
print("count:",#r)
print("\n")
for i=1,#r doif #r[i] == 1 thenprint("value:",r[i][1])elsefor k,v in pairs(r[i]) doio.write(v," ")endendprint("\n")
end

斗地主中的提示出牌算法(Lua)相关推荐

  1. 斗地主陪练机器人出牌算法使用说明

    下载地址: 斗地主AI陪练出牌算法CSDN 使用方法: 首先创建m_pRobot = new CRobot()对象 叫分: 1.初始化手牌到m_pRobot->m_szHandCards数组,手 ...

  2. unity开发 斗地主算法—提示AI(提示出牌)

    牌型的定义在http://blog.csdn.net/csdn_cjt/article/details/78593140 第一章 这是第四章 下面是代码 #region 提示出牌 public sta ...

  3. python斗地主出牌算法_斗地主之用蚁群算法整理牌型:如何进行牌力估计

    我们在前面讲到过,各牌手的牌力估计就是我们在用蚁群算法构造最优牌型时的启发性知识.启发性知识其实就是我们利用自己的经验对事物做出的判优性评估,或者说就是对事物价值的判断. 原则上,应用蚁群算法需要用到 ...

  4. 斗地主智能(AI)出牌算法

    去年有想写个斗地主的小游戏,自己玩玩.找了很多资料,后来好不容易在网上找到了一个AI算法.转过的的时候是贴在自己电脑的TXT文本上,再次感谢下原作者.现在借花献佛发给你参考下.    我以前写过一个斗 ...

  5. python斗地主出牌算法_python模拟斗地主发牌

    本文实例为大家分享了python模拟斗地主发牌的具体代码,供大家参考,具体内容如下 题目:趣味百题之斗地主 扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏.例如,在Windows操作 ...

  6. 麻将胡牌算法lua 不支持癞子

    --[[ file:game\lualib\mahjongHelper.lua desc:麻将辅助 + 胡牌 + 听牌 算法 auto:Carol Luo ]] local ipairs = ipai ...

  7. 带赖子的麻将胡牌算法Java_有人讨论下麻将胡牌,出牌算法吗,求思路

    前段时间学会了打麻将,觉得老祖宗的智慧真的博大精深,很好玩,食胡的时候真兴奋啊,于是空余时间就想自己写个麻将游戏出来,模仿欢乐麻将那种,数学差,想了两个礼拜才想出一个胡牌算法,前段时间学会了打麻将. ...

  8. 游戏中常见的洗牌算法

    今天把游戏中用到的洗牌算法好好看了看,把自己感觉最易懂的和最经典的一种分享出来,当然,我这个是看过别人之后自己写的. 我们以扑克牌当做例子,一共有54张,如何一次就把排序全部打乱呢? 1.最笨的洗牌算 ...

  9. 斗地主AI算法——第十三章の主动出牌(2)

    上一章我们已经搭好了出牌算法的基本框架,本章主要实现优先处理的三带.飞机等牌型. 首先定义一些基本变量: //暂存最佳的价值HandCardValue BestHandCardValue;BestHa ...

  10. 斗地主AI算法——第九章の被动出牌(3)

    上一章已经说明了被动出牌算法基本的出牌思路,且以单牌为例给出了具体的代码. 对牌.三不带牌型实现方法与单牌基本类似.改动的地方主要是枚举牌类型,出牌时value_nPutCardList的处理,回溯时 ...

最新文章

  1. 【生活乐园】深圳技能培训补贴申请流程
  2. C++ 写时拷贝 2
  3. 将时间格式的字符串转换成日期类型浏览器兼容解决方案
  4. 深度学习三巨头共获 2018 年图灵奖(经典重温)!
  5. 《数据库系统概念》20-恢复系统
  6. atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29
  7. 使用PL/SQL Developer 远程连接Oracle数据库出现 “无监听程序“错误 的解决办法
  8. [入门向]标准测试用例模板
  9. Pytorch demo(三)之蚂蚁和蜜蜂
  10. Java实验一:博饼
  11. 东芝打印机共享怎么设置_东芝 e-studio181怎么设置网络打印机
  12. 什么是嵌入式操作系统?
  13. 10.27Unity事件、场景烘焙、Render Texture
  14. Java对接腾讯IM以及一些方法的简单封装
  15. ROG魔霸7Plus的CPU温度与 Armoury Crate 设置问题
  16. Faster RCNN论文学习
  17. springboot 前端传来的参数是string 后台接受类型为date
  18. 【附源码】Python计算机毕业设计水库洪水预报调度系统
  19. 【vs code / idea】快速去除代码注释
  20. Chu-LiuEdmonds算法之无环解析

热门文章

  1. HDMI CEC HDCP
  2. 生成doc和docx教程
  3. PHP用GD库实现简单的验证码
  4. 怎么尽可能将pdf文件压缩到最小
  5. 计算机家庭网络共享,Windows7创建家庭组实现多台电脑之间共享资源
  6. 使用tayga测试无状态nat64功能
  7. 优启通制作系统u盘_如何用优启通制作U盘启动盘
  8. HTML+CSS+JS在线客服对话框迷你版
  9. 先天八卦与后天八卦原理及区别
  10. 生成随机的姓名、电话