lua牛牛算法和大小比较

棋牌 lua牛牛算法和大小比较

local Logic = {}

local Define = {}
Define.CardData = {
	0x0D, 0x1D, 0x2D, 0x3D,  --K --方块,梅花,红桃,黑桃 --0x0F,--大王 --0x0E,--小王
	0x0C, 0x1C, 0x2C, 0x3C,  --Q
	0x0B, 0x1B, 0x2B, 0x3B,  --J
	0x0A, 0x1A, 0x2A, 0x3A,  --10
	0x09, 0x19, 0x29, 0x39,  --9
	0x08, 0x18, 0x28, 0x38,  --8
	0x07, 0x17, 0x27, 0x37,  --7
	0x06, 0x16, 0x26, 0x36,  --6
	0x05, 0x15, 0x25, 0x35,  --5
	0x04, 0x14, 0x24, 0x34,  --4
	0x03, 0x13, 0x23, 0x33,  --3
	0x02, 0x12, 0x22, 0x32,  --2
	0x01, 0x11, 0x21, 0x31,  --1
}

--牛牛牌型
Define.CardType = {
	NoNiu       = 0, 	-- 无牛
	NiuOne      = 1, 	-- 牛一
	NiuTwo      = 2, 	-- 牛二
	NiuThree    = 3, 	-- 牛三
	NiuFour     = 4, 	-- 牛四
	NiuFive     = 5, 	-- 牛五
	NiuSix      = 6, 	-- 牛六
	NiuSeven    = 7, 	-- 牛七
	NiuEight    = 8, 	-- 牛八
	NiuNine     = 9, 	-- 牛九
	NiuNiu      = 10, 	-- 牛牛
	Niu4Color   = 11,   -- 四花牛
	Niu5Color   = 12, 	-- 五花牛
	NiuBomb     = 13, 	-- 炸弹牛
	Niu5Little  = 14,   -- 五小牛
}

--洗牌函数
local function Shuff()
    local cards = {}
    table.move(Define.cardData, 1, #Define.cardData, #cards+1, cards)
    local len = #cards
    for i = 1, len do
        local m = math.random(1, len)
        cards[i], cards[m] = cards[m], cards[i]
    end
    return cards
end

Logic.random_cards = Shuff() --洗牌

--获取牌点数
local function GetCardNum(card)
	return card % 16
end

--获取花色
local function GetCardColor(card)
	return card / 16
end

 --对每个玩家的手牌进行排序
function Logic.SortCard(cards)
	table.sort(cards,function(first,second)
		if not first or not second then return false end
		if first % 16 > second % 16 then return true end
		if first % 16 < second % 16 then return false end
		if first / 16 > second / 16 then return true end
		if first / 16 < second / 16 then return false end
		return false
	end)
end

--五小牛
function Logic.IsFiveSmallNiu(nCards)
    if GetCardNum(nCards[1]) >= 5 then
        return 0
    end
    local addvalue = 0
    for _,card in ipairs(nCards) do
        addvalue = addvalue + GetCardNum(card)
        if addvalue > 10 then
            return false
        end
    end
    return true
end

-- 炸弹牛
function Logic.IsBombNiu(nCards)
    if GetCardNum(nCards[1]) == GetCardNum(nCards[4]) then
        return true
    elseif GetCardNum(nCards[2]) == GetCardNum(nCards[5]) then
        return true
    end
    return false
end

-- 五花牛
function Logic.IsFiveColorNiu(nCards)
    if GetCardNum(nCards[5]) <= 10 then
        return false
    end
    return true
end

-- 四花牛
function Logic.IsFourColorNiu(nCards)
    if GetCardNum(nCards[5]) < 10 or GetCardNum(nCards[4]) <= 10 then
        return false
    end
    return true
end

function Logic.GetCard(card)
    local value = GetCardNum(card)
    if value > 10 then
        return 10
    end
    return value
end

--其它牛
function Logic.IsOtherNiu(nCards)
	local ModNum = 0
    local nCardNum = #nCards
    for i = 1,nCardNum do
        ModNum = ModNum + Logic.GetCard(nCards[i])
    end
    ModNum = ModNum % 10  --5张牌的余数
    for i = 1,nCardNum - 1 do
        for j = i + 1,nCardNum do
            --2张牌的余数和5张牌的余数比较,如果相等,则剩下的3张余数必然是0,这样剩下的3张牌就能组成牛
            if(Logic.GetCard(nCards[i]) + Logic.GetCard(nCards[j]))%10 == ModNum then
                if ModNum == 0 then
                    return 10
                else
                    return ModNum
                end
            end
        end
    end
    return 0
end

-- 获取牌类型
function Logic.GetCardType(nCards)
    assert(#nCards == 5)
    Logic.SortCard(nCards) --对每个玩家的手牌进行排序
	if Logic.IsFiveSmallNiu(nCards) then --五小牛判断
		return Define.CardType.Niu5Little
	end
    if Logic.IsBombNiu(nCards) then --炸弹牛判断
        return Define.CardType.NiuBomb
	end
	if Logic.IsFiveColorNiu(nCards) then --五花牛判断
        return Define.CardType.Niu5Color
	end
	if Logic.IsFourColorNiu(nCards) then --四花牛判断
        return Define.CardType.Niu5Color
    end
    return Logic.IsOtherNiu(nCards) --其他牛判断
end

--计算牌值,用于比较牌大小
function Logic.GetCmpValue(cards, cardType)
    Logic.SortCard(cards) --对每个玩家的手牌进行排序
	local maxCard = GetCardNum(cards[1])*100 + GetCardColor(cards[1]) * 10
	return cardType * 10000 + maxCard
end


--[[
    tValue 的结构
    tValue = {
        nPlayId = 玩家id,
        CmpValue = 玩家的牌值,   --该值通过  Logic.GetCmpValue  获取
    }
]]
--通过该接口,可以把所有玩家的牌进行从大到小排序
function Logic.SortAllUsers(tValue)
    table.sort(tValue,function(first,second)
        if not first or not second then return false end
        return (first.CmpValue > second.CmpValue)
    end)
end

你可能感兴趣的:(棋牌算法)