--region *.lua
--Date
--此文件由[BabeLua]插件自动生成
--add by lfp
local CURRENT_MODULE_NAME = ...

local LandGameLogic = class("LandGameLogic")
--排序类型
ST_ORDER                                         =  1                                                                        --大小排序
ST_COUNT                                         =  2                                                                        --数目排序
ST_CUSTOM                                         =  3                                                                        --自定排序

--索引变量
local cbIndexCount = 5

--扑克数据
local        m_cbCardData  = 
{
        0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,        --方块 A - K   1 - 13
        0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,        --梅花 A - K   17 - 29
        0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,        --红桃 A - K   33 - 45
        0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,        --黑桃 A - K   49 - 61
        0x4E,0x4F,                                                                         --78,79
}

----------------------------------------------------------------------------------
function LandGameLogic:ctor()
    print("LandGameLogic -> ctor()")
end
--获取类型
function LandGameLogic:GetCardType(cbCardData, cbCardCount)
    self:SortCardList(cbCardData, cbCardCount, ST_ORDER)
        --简单牌型
        if cbCardCount == 0 then        --空牌                
                return CMD_LAND.CT_ERROR
        elseif cbCardCount == 1 then  --单牌
                return CMD_LAND.CT_SINGLE                
        elseif cbCardCount == 2 then         --对牌火箭
                --牌型判断
                if ((cbCardData[1] == 0x4F)and(cbCardData[2] == 0x4E)) then 
            return CMD_LAND.CT_MISSILE_CARD
        end
                if (self:GetCardLogicValue(cbCardData[1]) == self:GetCardLogicValue(cbCardData[2]))then
            return CMD_LAND.CT_DOUBLE
        end
                return CMD_LAND.CT_ERROR                
        end

--分析扑克
    --tagAnalyseResult
        local AnalyseResult = {}
        AnalyseResult = self:AnalysebCardData(cbCardData, cbCardCount)

--四牌判断
        if (AnalyseResult.cbBlockCount[4] > 0)then
                --牌型判断
                if ((AnalyseResult.cbBlockCount[4] == 1) and (cbCardCount == 4))then
            return CMD_LAND.CT_BOMB_CARD
        end
                if ((AnalyseResult.cbBlockCount[4] == 1) and (cbCardCount == 6)) then 
            return CMD_LAND.CT_FOUR_TAKE_ONE
        end
                if ((AnalyseResult.cbBlockCount[4] == 1)and(cbCardCount == 8)and(AnalyseResult.cbBlockCount[2] == 2)) then
            return CMD_LAND.CT_FOUR_TAKE_TWO
        end
        --下面还要判断78888999这种飞机牌
        if (AnalyseResult.cbBlockCount[3] == 0) then
                    return CMD_LAND.CT_ERROR
        end
        end

--三牌判断
        if (AnalyseResult.cbBlockCount[3] > 0)then
                --连牌判断
                -- 飞机中带中4张相同牌是判断
                if AnalyseResult.cbBlockCount[4] > 0 then 
                        local num = AnalyseResult.cbBlockCount[3]
                        for i = 0, AnalyseResult.cbBlockCount[4] -1 do 
                                AnalyseResult.cbCardData[3][(num+i)*3 + 1] = AnalyseResult.cbCardData[4][i*4 + 1]
                                AnalyseResult.cbCardData[3][(num+i)*3 + 2] = AnalyseResult.cbCardData[4][i*4 + 2]
                                AnalyseResult.cbCardData[3][(num+i)*3 + 3] = AnalyseResult.cbCardData[4][i*4 + 3]
                        end
                        AnalyseResult.cbBlockCount[3] = AnalyseResult.cbBlockCount[3] + AnalyseResult.cbBlockCount[4]
                end

if (AnalyseResult.cbBlockCount[3] > 1)then
                        --变量定义
                        local cbCardData = AnalyseResult.cbCardData[3][1]
                        local cbFirstLogicValue = self:GetCardLogicValue(cbCardData)

--错误过虑
                        if (cbFirstLogicValue >=  15) then 
                return CMD_LAND.CT_ERROR
            end
                        --连牌判断         
                        local table = {}
                        table[cbFirstLogicValue] = 1

for i = 1, AnalyseResult.cbBlockCount[3] - 1 do                        
                                local cbCardData = AnalyseResult.cbCardData[3][i*3 + 1]
                                table[self:GetCardLogicValue(cbCardData)] = 1
                        end
                        local max = 0
            local min = 0
                        for index = 3, 14 do
                                if table[index] == 1 then
                                         if min == 0 then 
                                                 min = index
                                         end 
                                         max = index
                                 end
                        end
                        if (max - min + 1) ~= AnalyseResult.cbBlockCount[3] then 
                                return CMD_LAND.CT_ERROR
                        end

--for i = 1, AnalyseResult.cbBlockCount[3] - 1 do
                        --
                        --        local cbCardData = AnalyseResult.cbCardData[3][i*3 + 1]
                        --        if (cbFirstLogicValue ~=  (self:GetCardLogicValue(cbCardData)+i))then
                        --            return CMD_LAND.CT_ERROR
                        --    end
                        --end
                elseif( cbCardCount == 3 ) then
            return CMD_LAND.CT_THREE
        end
                --牌形判断
                if (AnalyseResult.cbBlockCount[3]*3 == cbCardCount) then
            return CMD_LAND.CT_THREE_LINE
        end
                if (AnalyseResult.cbBlockCount[3]*4 == cbCardCount) then
            return CMD_LAND.CT_THREE_TAKE_ONE
        end
                if ((AnalyseResult.cbBlockCount[3]*5 == cbCardCount)and(AnalyseResult.cbBlockCount[2] == AnalyseResult.cbBlockCount[3])) then
            return CMD_LAND.CT_THREE_TAKE_TWO
        end
                return CMD_LAND.CT_ERROR
        end

--两张类型
        if (AnalyseResult.cbBlockCount[2] >=  3)then
                --变量定义
                local cbCardData = AnalyseResult.cbCardData[2][1]
                local cbFirstLogicValue = self:GetCardLogicValue(cbCardData)

--错误过虑
                if (cbFirstLogicValue >=  15) then
            return CMD_LAND.CT_ERROR
        end
                --连牌判断
                for i = 1, AnalyseResult.cbBlockCount[2] - 1 do
                
                        local cbCardData = AnalyseResult.cbCardData[2][i*2 + 1]
                        if (cbFirstLogicValue ~=  (self:GetCardLogicValue(cbCardData)+i))then
                return CMD_LAND.CT_ERROR
            end
                end

--二连判断
                if ((AnalyseResult.cbBlockCount[2]*2) == cbCardCount) then
            return CMD_LAND.CT_DOUBLE_LINE
        end
                return CMD_LAND.CT_ERROR
        end

--单张判断
        if ((AnalyseResult.cbBlockCount[1] >=  5)and(AnalyseResult.cbBlockCount[1] == cbCardCount))then
                --变量定义
                local cbCardData = AnalyseResult.cbCardData[1][1]
                local cbFirstLogicValue = self:GetCardLogicValue(cbCardData)

--错误过虑
                if (cbFirstLogicValue >= 15) then 
            return CMD_LAND.CT_ERROR
        end

--连牌判断
                for i = 1, AnalyseResult.cbBlockCount[1] - 1 do
                        local cbCardData = AnalyseResult.cbCardData[1][i + 1]
                        if (cbFirstLogicValue~= (self:GetCardLogicValue(cbCardData) + i))then
                return CMD_LAND.CT_ERROR
                    end
        end

return CMD_LAND.CT_SINGLE_LINE
        end

return CMD_LAND.CT_ERROR
end

--排列扑克
function LandGameLogic:SortCardList(cbCardData, cbCardCount, cbSortType)
        --数目过虑
        if (cbCardCount == 0) then return end
        if (cbSortType == ST_CUSTOM) then return end

--转换数值
        local cbSortValue = {}
        for i = 1, cbCardCount do 
        cbSortValue  = self:GetCardLogicValue(cbCardData)        
    end
        --排序操作
        local bSorted = true
        local cbSwitchData = 0
    local cbLast = cbCardCount-1

repeat
                bSorted = true
                for i = 1, cbLast do
        if cbSortValue and cbSortValue[i+1] then

if ((cbSortValue < cbSortValue[i+1]) or
                                ((cbSortValue == cbSortValue[i+1])and(cbCardData < cbCardData[i+1])))then
                                --设置标志
                                bSorted = false
                --[[
                printf("cbLast = %d", cbLast)
                printf("paixuqian:cbCardData=%d",cbCardData)
                printf("paixuqian:cbCardData[i+1]=%d",cbCardData[i+1])
                printf("paixuqian:cbSortValue=%d",cbSortValue)
                printf("paixuqian:cbSortValue[i+1]=%d",cbSortValue[i+1])]]
                                --扑克数据
                                cbSwitchData = cbCardData
                                cbCardData = cbCardData[i+1]
                                cbCardData[i+1] = cbSwitchData

--排序权位
                                cbSwitchData = cbSortValue
                                cbSortValue = cbSortValue[i+1]
                                cbSortValue[i+1] = cbSwitchData

end        
                end
     end
                cbLast = cbLast - 1
        until bSorted == true

--数目排序
        if (cbSortType == ST_COUNT)then
                --变量定义
                local cbCardIndex = 0

--分析扑克
                local AnalyseResult = {}
                AnalyseResult = self:AnalysebCardData(cbCardData[cbCardIndex + 1], cbCardCount - cbCardIndex)

--提取扑克
                for i = 1, 4 do
                        --拷贝扑克
                        local cbIndex = 4 - (i-1)-1
                        cbCardData[cbCardIndex + 1] = AnalyseResult.cbCardData[cbIndex + 1]

--设置索引
                        cbCardIndex = cbCardIndex + AnalyseResult.cbBlockCount[cbIndex + 1]*(cbIndex+1)
                end
        end
end

--混乱扑克(暂时没有用到的方法)
function LandGameLogic:RandCardList(cbCardBuffer, cbBufferCount)
        --混乱准备
        local cbCardData = {}
        cbCardData = clone(m_cbCardData)

--混乱扑克
        local cbRandCount = 0
    local cbPosition = 0
        repeat
                cbPosition = math.random(1,(cbBufferCount - cbRandCount))  
                cbCardBuffer[cbRandCount] = cbCardData[cbPosition]
        cbRandCount = cbRandCount + 1
                cbCardData[cbPosition] = cbCardData[cbBufferCount - cbRandCount + 1]
        until (cbRandCount >= cbBufferCount)

end

--删除扑克
function LandGameLogic:RemoveCardList(cbRemoveCard, cbRemoveCount, cbCardData, cbCardCount)
        --检验数据 nana
        --LuaProxy:ASSERT(cbRemoveCount <= cbCardCount)

--定义变量
        local cbDeleteCount = 0
    local cbTempCardData = {}
        if (cbCardCount > CMD_LAND.MAX_COUNT) then return false end
        cbTempCardData = clone(cbCardData)

--置零扑克
        for i = 1, cbRemoveCount do
                for j = 1, cbCardCount do
                        if (cbRemoveCard == cbTempCardData[j]) then
                                cbDeleteCount = cbDeleteCount + 1
                                cbTempCardData[j] = 0
                                break
                        end
                end
        end
        if (cbDeleteCount~= cbRemoveCount) then return false end

--清理扑克
        local cbCardPos = 0
        for i = 1, cbCardCount do
                if (cbTempCardData~= 0) then         
            cbCardData[cbCardPos + 1] = cbTempCardData
            cbCardPos = cbCardPos + 1
        end
        end

return true
end

--删除扑克
function LandGameLogic:RemoveCard(cbRemoveCard, cbRemoveCount, cbCardData, cbCardCount)
        --检验数据 nana
        --LuaProxy:ASSERT(cbRemoveCount <= cbCardCount)

--定义变量
        local cbDeleteCount = 0
    local cbTempCardData = {}
        if (cbCardCount > CMD_LAND.MAX_COUNT) then return false end
        cbTempCardData = clone(cbCardData)

--置零扑克
        for i = 1, cbRemoveCount do
                for j = 1, cbCardCount do
                        if (cbRemoveCard == cbTempCardData[j])then
                                cbDeleteCount = cbDeleteCount + 1
                                cbTempCardData[j] = 0
                                break
                        end
                end
        end
        if (cbDeleteCount~= cbRemoveCount) then return false end

--清理扑克
        local cbCardPos = 0
        for i = 1, cbCardCount do
                if (cbTempCardData ~= 0) then            
            cbCardData[cbCardPos + 1] = cbTempCardData
            cbCardPos = cbCardPos + 1
        end
        end

return true
end

--排列扑克
function LandGameLogic:SortOutCardList(cbCardData, cbCardCount)
        --获取牌型
        local cbCardType = self:GetCardType(cbCardData,cbCardCount)

if( cbCardType == CMD_LAND.CT_THREE_TAKE_ONE or cbCardType == CMD_LAND.CT_THREE_TAKE_TWO )then
                --分析牌
                local AnalyseResult = {}
                AnalyseResult = self:AnalysebCardData( cbCardData, cbCardCount)

cbCardCount = AnalyseResult.cbBlockCount[3]*3
                cbCardData = clone(AnalyseResult.cbCardData[3])
                for i = 4 , 1, -1 do
            while true do
                if 3 == i then
                    break
                end
                if( AnalyseResult.cbBlockCount > 0 )then
                                    cbCardData[cbCardCount + 1] = clone(AnalyseResult.cbCardData)            
                                    cbCardCount  =  cbCardCount + (i)*AnalyseResult.cbBlockCount
                            end
                break
            end                
                end
        elseif( cbCardType == CMD_LAND.CT_FOUR_TAKE_ONE or cbCardType == CMD_LAND.CT_FOUR_TAKE_TWO ) then
        
                --分析牌
                local AnalyseResult = {}
                AnalyseResult = self:AnalysebCardData( cbCardData,cbCardCount)

cbCardCount = AnalyseResult.cbBlockCount[4]*4
                cbCardData = clone(AnalyseResult.cbCardData[4])
                for i = 4, 1, -1 do
        
                        while true do
                if 4 == i then
                    break
                end
                if( AnalyseResult.cbBlockCount > 0 )then
                                    cbCardData[cbCardCount + 1] = clone(AnalyseResult.cbCardData)
                                            
                                    cbCardCount =  cbCardCount + (i)*AnalyseResult.cbBlockCount
                            end
                break
            end                        
                end
        end

end

--逻辑数值
function LandGameLogic:GetCardLogicValue(cbCardData)
        --扑克属性
    if not cbCardData then return end
        local cbCardColor = self:GetCardColor(cbCardData)
        local cbCardValue = self:GetCardValue(cbCardData)

--转换数值
        if (cbCardColor == 0x40) then return cbCardValue + 2 end
    local value = cbCardValue
    if cbCardValue <= 2 then
        value = cbCardValue+13
    end
        return value
end

--对比扑克
function LandGameLogic:CompareCard(cbFirstCard,  cbNextCard, cbFirstCount, cbNextCount)
        --获取类型
        local cbNextType = self:GetCardType(cbNextCard,cbNextCount)
        local cbFirstType = self:GetCardType(cbFirstCard,cbFirstCount)

--类型判断
        if (cbNextType == CMD_LAND.CT_ERROR) then return false end
        if (cbNextType == CMD_LAND.CT_MISSILE_CARD)then return true end
        if (cbFirstType == CMD_LAND.CT_MISSILE_CARD) then return false end

--炸弹判断
        if ((cbFirstType~= CMD_LAND.CT_BOMB_CARD)and(cbNextType == CMD_LAND.CT_BOMB_CARD)) then return true end
        if ((cbFirstType == CMD_LAND.CT_BOMB_CARD)and(cbNextType~= CMD_LAND.CT_BOMB_CARD)) then return false end

--规则判断
        if ((cbFirstType~= cbNextType)or(cbFirstCount~= cbNextCount)) then return false end

--开始对比
        if cbNextType == CMD_LAND.CT_SINGLE or cbNextType == CMD_LAND.CT_DOUBLE or cbNextType == CMD_LAND.CT_THREE
        or cbNextType == CMD_LAND.CT_SINGLE_LINE or cbNextType == CMD_LAND.CT_DOUBLE_LINE
        or cbNextType == CMD_LAND.CT_THREE_LINE  or cbNextType == CMD_LAND.CT_BOMB_CARD then
                --获取数值
                local cbNextLogicValue = self:GetCardLogicValue(cbNextCard[1])
                local cbFirstLogicValue = self:GetCardLogicValue(cbFirstCard[1])

--对比扑克
                return cbNextLogicValue > cbFirstLogicValue
                
        elseif  cbNextType == CMD_LAND.CT_THREE_TAKE_ONE or cbNextType == CMD_LAND.CT_THREE_TAKE_TWO then
                --分析扑克
                local NextResult = {}
                local FirstResult = {}
                NextResult = self:AnalysebCardData(cbNextCard,cbNextCount)
                FirstResult = self:AnalysebCardData(cbFirstCard,cbFirstCount)

--获取数值
                local cbNextLogicValue = self:GetCardLogicValue(NextResult.cbCardData[3][1])
                local cbFirstLogicValue = self:GetCardLogicValue(FirstResult.cbCardData[3][1])

--对比扑克
                return cbNextLogicValue > cbFirstLogicValue
    elseif  cbNextType == CMD_LAND.CT_FOUR_TAKE_ONE or cbNextType == CMD_LAND.CT_FOUR_TAKE_TWO then

--分析扑克
                local NextResult = {}
                local FirstResult = {}
                NextResult = self:AnalysebCardData(cbNextCard,cbNextCount)
                FirstResult = self:AnalysebCardData(cbFirstCard,cbFirstCount)

--获取数值
                local cbNextLogicValue = self:GetCardLogicValue(NextResult.cbCardData[4][1])
                local cbFirstLogicValue = self:GetCardLogicValue(FirstResult.cbCardData[4][1])

--对比扑克
                return cbNextLogicValue > cbFirstLogicValue
        end
        
        
        return false
end

--构造扑克
function LandGameLogic:MakeCardData(cbValueIndex, cbColorIndex)
        return bit.bor(bit.blshift(cbColorIndex,4),(cbValueIndex+1))
end

--分析扑克
function LandGameLogic:AnalysebCardData(cbCardData, cbCardCount)
        --设置结果
    --memset(&AnalyseResult,0,sizeof(AnalyseResult));
        --初始化结构体中数组 AnalyseResult
    --分析结构
--struct tagAnalyseResult
--{
--        BYTE                                                         cbBlockCount[4];                                        //扑克数目
--        BYTE                                                        cbCardData[4][CMD_LAND.MAX_COUNT];                        //扑克数据
--};
    local AnalyseResult = {}
    AnalyseResult.cbBlockCount = {}
    AnalyseResult.cbCardData = {}
    for i = 1, 4 do      
        AnalyseResult.cbBlockCount = 0
        AnalyseResult.cbCardData = {}
        for j = 1, CMD_LAND.MAX_COUNT do
            AnalyseResult.cbCardData[j] = 0
        end     
    end

--扑克分析
    local index = 0
        for i = 0, cbCardCount-1 do
                --变量定义
        if i == index then
            index = 0
            local cbSameCount = 1
            local cbCardValueTemp = 0
                    local cbLogicValue = self:GetCardLogicValue(cbCardData[i+1])

--搜索同牌
                    for j = i+1, cbCardCount - 1 do
                            --获取扑克
                            if (self:GetCardLogicValue(cbCardData[j+1])~= cbLogicValue) then
                    break
                end
                            --设置变量
                            cbSameCount = cbSameCount + 1
                    end

--设置结果
            --todo:liufapu 也是一个坑
            --BYTE cbIndex=AnalyseResult.cbBlockCount[cbSameCount-1]++;
            if cbSameCount <= #AnalyseResult.cbBlockCount then
                local cbIndex = AnalyseResult.cbBlockCount[cbSameCount]
                AnalyseResult.cbBlockCount[cbSameCount] = AnalyseResult.cbBlockCount[cbSameCount] + 1
                for j = 0, cbSameCount - 1 do
                    AnalyseResult.cbCardData[cbSameCount][cbIndex * cbSameCount + j + 1] = cbCardData[i + j + 1]
                end
                -- 设置索引
                -- i+=cbSameCount-1;--更大一个坑
                index = i + cbSameCount - 1 + 1
                -- 因为在下一个循环中i++,所以此处应+1
            end
        end        
        end

return AnalyseResult
end

--分析分布
function LandGameLogic:AnalysebDistributing(cbCardData, cbCardCount)
        --设置变量
        local Distributing = {}
    --初始化
    Distributing.cbCardCount = 0
    Distributing.cbDistributing = {}
    for i = 1, 15 do
        Distributing.cbDistributing = {}
        for j = 1, 6 do
            Distributing.cbDistributing[j] = 0
        end     
    end

--设置变量
        for i = 1, cbCardCount do
        while true do
            if (cbCardData == 0)then 
                break
            end
            --获取属性
                    local cbCardColor = self:GetCardColor(cbCardData)
                    local cbCardValue = self:GetCardValue(cbCardData)

--分布信息
                    Distributing.cbCardCount = Distributing.cbCardCount + 1
                    Distributing.cbDistributing[cbCardValue][cbIndexCount + 1] = Distributing.cbDistributing[cbCardValue][cbIndexCount+1] + 1
                    local cbIndex = bit.brshift(cbCardColor,4)
            Distributing.cbDistributing[cbCardValue][cbIndex + 1] = Distributing.cbDistributing[cbCardValue][cbIndex + 1] + 1
            break
        end        
        end
    return Distributing
end

--出牌搜索
function LandGameLogic:SearchOutCard(cbHandCardData, cbHandCardCount, cbTurnCardData, cbTurnCardCount)
        --设置结果
    --delete by liufpu
        --LuaProxy:ASSERT( pSearchCardResult ~=  nil )
        --if( pSearchCardResult == nil ) then return 0 end
        
    local pSearchCardResult = {}
    pSearchCardResult.cbSearchCount = 0
    pSearchCardResult.cbCardCount = {}
    pSearchCardResult.cbResultCard = {}
    for i = 1, CMD_LAND.MAX_COUNT do
        pSearchCardResult.cbCardCount = 0
        pSearchCardResult.cbResultCard = {}
        for j = 1, CMD_LAND.MAX_COUNT do
            pSearchCardResult.cbResultCard[j] = 0
        end       
    end
        if (cbHandCardCount == 0)then return pSearchCardResult end

--变量定义
        local cbResultCount = 0
        local tmpSearchCardResult = {}

--构造扑克
        local cbCardData = {}
        local cbCardCount = cbHandCardCount

cbCardData = clone(cbHandCardData)

--排列扑克
        self:SortCardList(cbCardData, cbCardCount, ST_ORDER)

--获取类型
        local cbTurnOutType = self:GetCardType(cbTurnCardData,cbTurnCardCount)

--出牌分析
        if cbTurnOutType == CMD_LAND.CT_ERROR then                                        --错误类型
                --提取各种牌型一组
        --delete by liufpu
                --LuaProxy:ASSERT( pSearchCardResult )
                --if( not pSearchCardResult )then return 0 end

--是否一手出完
                if( self:GetCardType(cbCardData,cbCardCount) ~=  CMD_LAND.CT_ERROR ) then
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = cbCardCount
                        pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(cbCardData)
                        cbResultCount = cbResultCount + 1
                end

--如果最小牌不是单牌,则提取
                local cbSameCount = 0
                if( cbCardCount > 1 and self:GetCardValue(cbCardData[cbCardCount]) == self:GetCardValue(cbCardData[cbCardCount-1]) )then
                        cbSameCount = 1
                        pSearchCardResult.cbResultCard[cbResultCount + 1][1] = cbCardData[cbCardCount]
                        local cbCardValue = self:GetCardValue(cbCardData[cbCardCount])
                        for i = cbCardCount-1, 1, -1 do
                                if( self:GetCardValue(cbCardData) == cbCardValue )then             
                                        pSearchCardResult.cbResultCard[cbResultCount + 1][cbSameCount + 1] = cbCardData
                                    cbSameCount = cbSameCount + 1
                                else 
                    break
                end
                        end

pSearchCardResult.cbCardCount[cbResultCount + 1] = cbSameCount
                        cbResultCount = cbResultCount + 1
                end

--单牌
                local cbTmpCount = 0
                if( cbSameCount ~=  1 )then
                        cbTmpCount, tmpSearchCardResult = self:SearchSameCard( cbCardData,cbCardCount,0,1)
                        if( cbTmpCount > 0 )then
                                pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount[1]
                                pSearchCardResult.cbResultCard[cbResultCount + 1]  = clone(tmpSearchCardResult.cbResultCard[1])
                                cbResultCount = cbResultCount + 1
                        end
                end

--对牌
                if( cbSameCount ~=  2 ) then
                        cbTmpCount, tmpSearchCardResult = self:SearchSameCard( cbCardData, cbCardCount, 0, 2)
                        if( cbTmpCount > 0 ) then
                        
                                pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount[1]
                                pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpSearchCardResult.cbResultCard[1])
                                cbResultCount = cbResultCount + 1
                        end
                end

--三条
                if( cbSameCount ~=  3 ) then
                        cbTmpCount, tmpSearchCardResult = self:SearchSameCard( cbCardData, cbCardCount, 0, 3)
                        if( cbTmpCount > 0 ) then
                                pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount[1]
                                pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpSearchCardResult.cbResultCard[1])
                                cbResultCount = cbResultCount + 1
                        end
                end

--三带一单
                cbTmpCount, tmpSearchCardResult = self:SearchTakeCardType( cbCardData,cbCardCount,0,3,1)
                if( cbTmpCount > 0 ) then
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount[1]
                        pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpSearchCardResult.cbResultCard[1])
                        cbResultCount = cbResultCount + 1
                end

--三带一对
                cbTmpCount, tmpSearchCardResult = self:SearchTakeCardType( cbCardData,cbCardCount,0,3,2)
                if( cbTmpCount > 0 )then
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount[1]
                        pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpSearchCardResult.cbResultCard[1])
                        cbResultCount = cbResultCount + 1
                end

--单连
                cbTmpCount, tmpSearchCardResult = self:SearchLineCardType( cbCardData,cbCardCount,0,1,0)
                if( cbTmpCount > 0 )then
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount[1]
                        pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpSearchCardResult.cbResultCard[1])
                        cbResultCount = cbResultCount + 1
                end

--连对
                cbTmpCount,tmpSearchCardResult = self:SearchLineCardType( cbCardData,cbCardCount,0,2,0)
                if( cbTmpCount > 0 )then
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount[1]
                        pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpSearchCardResult.cbResultCard[1])
                        cbResultCount = cbResultCount + 1
                end

--三连
                cbTmpCount, tmpSearchCardResult = self:SearchLineCardType( cbCardData,cbCardCount,0,3,0)
                if( cbTmpCount > 0 )then
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount[1]
                        pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpSearchCardResult.cbResultCard[1])
                        cbResultCount = cbResultCount + 1
                end

--炸弹
                if( cbSameCount ~=  4 )then
                        cbTmpCount, tmpSearchCardResult = self:SearchSameCard( cbCardData,cbCardCount,0,4)
                        if( cbTmpCount > 0 )then
                                pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount[1]
                                pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpSearchCardResult.cbResultCard[1])
                                cbResultCount = cbResultCount + 1
                        end
                end
                --搜索火箭
                if ((cbCardCount>= 2)and(cbCardData[1] == 0x4F)and(cbCardData[2] == 0x4E))then
                        --设置结果
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = 2
                        pSearchCardResult.cbResultCard[cbResultCount + 1][1] = cbCardData[1]
                        pSearchCardResult.cbResultCard[cbResultCount + 1][2] = cbCardData[2]
                        cbResultCount = cbResultCount + 1
                end
        elseif cbTurnOutType == CMD_LAND.CT_SINGLE or cbTurnOutType == CMD_LAND.CT_DOUBLE or cbTurnOutType == CMD_LAND.CT_THREE then
            --单牌类型
                --对牌类型
                --三条类型                                        
                --变量定义
                local cbReferCard = cbTurnCardData[1]
                local cbSameCount = 1
                if( cbTurnOutType == CMD_LAND.CT_DOUBLE ) then 
            cbSameCount = 2
                elseif( cbTurnOutType == CMD_LAND.CT_THREE ) then
            cbSameCount = 3
        end
                --搜索相同牌
                cbResultCount, pSearchCardResult = self:SearchSameCard( cbCardData, cbCardCount, cbReferCard, cbSameCount)

elseif cbTurnOutType == CMD_LAND.CT_SINGLE_LINE or cbTurnOutType == CMD_LAND.CT_DOUBLE_LINE or cbTurnOutType == CMD_LAND.CT_THREE_LINE then
                --单连类型
                --对连类型
                --三连类型
                
                --变量定义
                local cbBlockCount = 1
                if( cbTurnOutType == CMD_LAND.CT_DOUBLE_LINE ) then
            cbBlockCount = 2
                elseif( cbTurnOutType == CMD_LAND.CT_THREE_LINE ) then
            cbBlockCount = 3
        end

local cbLineCount = math.floor(cbTurnCardCount/cbBlockCount)

--搜索边牌
                cbResultCount, pSearchCardResult = self:SearchLineCardType( cbCardData,cbCardCount,cbTurnCardData[1],cbBlockCount,cbLineCount)

elseif cbTurnOutType == CMD_LAND.CT_THREE_TAKE_ONE or cbTurnOutType == CMD_LAND.CT_THREE_TAKE_TWO then
            --三带一单
            --三带一对                
                --效验牌数
                if cbCardCount >= cbTurnCardCount then 
                --如果是三带一或三带二
                        if( cbTurnCardCount == 4 or cbTurnCardCount == 5 )then
                                local cbTakeCardCount = 2
                    if cbTurnOutType == CMD_LAND.CT_THREE_TAKE_ONE then
                        cbTakeCardCount = 1
                    end

--搜索三带牌型
                                cbResultCount, pSearchCardResult = self:SearchTakeCardType( cbCardData,cbCardCount,cbTurnCardData[3],3,cbTakeCardCount)
                        else
                        
                                --变量定义
                                local cbBlockCount = 3
                    local temp = 5
                    if cbTurnOutType == CMD_LAND.CT_THREE_TAKE_ONE then
                        temp = 4
                    end
                                local cbLineCount = math.floor(cbTurnCardCount/temp)
                                local cbTakeCardCount = 2
                    if cbTurnOutType == CMD_LAND.CT_THREE_TAKE_ONE then
                        cbTakeCardCount = 1
                    end

--搜索连牌
                                local cbTmpTurnCard = {}
                                cbTmpTurnCard = clone(cbTurnCardData)
                                self:SortOutCardList( cbTmpTurnCard,cbTurnCardCount )
                    local comperNum = nil
                    local sameNum = 0
                    for aa = 1, cbTurnCardCount do
                        local cbLogicValueTem = self:GetCardLogicValue(cbTmpTurnCard[aa])
                            --搜索同牌
                        sameNum = 0
                                for cc = aa+1, cbTurnCardCount do
                                        --获取扑克
                                        if (self:GetCardLogicValue(cbTmpTurnCard[cc]) ~= cbLogicValueTem) then
                                break
                            end
                            --设置变量
                            sameNum = sameNum + 1
                            if sameNum > 1 then
                                comperNum = cbTmpTurnCard[cc]
                            end
                                end
                    end
                   if comperNum == nil then
                      comperNum = cbTmpTurnCard[1]
                   end
                    cbResultCount, pSearchCardResult = self:SearchLineCardType(cbCardData,cbCardCount,comperNum,cbBlockCount,cbLineCount)
                                --cbResultCount, pSearchCardResult = self:SearchLineCardType(cbCardData,cbCardCount,cbTmpTurnCard[1],cbBlockCount,cbLineCount)
                    if cbTurnOutType == CMD_LAND.CT_THREE_TAKE_ONE then

elseif(cbTurnOutType == CMD_LAND.CT_THREE_TAKE_TWO) then

end
                                --提取带牌
                                local bAllDistill = true
                    for i = 1, cbResultCount do
                                        local cbResultIndex = cbResultCount - (i - 1) -1

--变量定义
                                        local cbTmpCardData = {}
                                        local cbTmpCardCount = cbCardCount

--删除连牌
                                        cbTmpCardData = clone(cbCardData)
                                        LuaProxy:ASSERT( self:RemoveCard( pSearchCardResult.cbResultCard[cbResultIndex + 1],pSearchCardResult.cbCardCount[cbResultIndex  + 1],
                                                cbTmpCardData,cbTmpCardCount ) )
                                        cbTmpCardCount =  cbTmpCardCount - pSearchCardResult.cbCardCount[cbResultIndex + 1]

--分析牌
                                        local  TmpResult = {}
                                        TmpResult = self:AnalysebCardData(cbTmpCardData,cbTmpCardCount)

--提取牌
                                        local cbDistillCard = {}
                                        local cbDistillCount = 0
                        for j = cbTakeCardCount, 4 do
                                                if( TmpResult.cbBlockCount[j] > 0 )then
                            --[[
                            if( j+1 == cbTakeCardCount && TmpResult.cbBlockCount[j] >= cbLineCount )
                                                                {
                                                                        BYTE cbTmpBlockCount = TmpResult.cbBlockCount[j];
                                                                        memcpy( cbDistillCard,&TmpResult.cbCardData[j][(cbTmpBlockCount-cbLineCount)*(j+1)],
                                                                                sizeof(BYTE)*(j+1)*cbLineCount );
                                                                        cbDistillCount = (j+1)*cbLineCount;
                                                                        break;
                                                                }
                                    ]]--todo:liufapu
                                                        if((j -1)+1 == cbTakeCardCount and TmpResult.cbBlockCount[j] >=  cbLineCount )then
                                                                local cbTmpBlockCount = TmpResult.cbBlockCount[j]
                                     for h = 1, j*cbLineCount do --nana
                                      cbDistillCard[h] = TmpResult.cbCardData[j][(cbTmpBlockCount-cbLineCount)*(j) + h]
                                     end
                                    
                                                                --cbDistillCard = clone(TmpResult.cbCardData[j][(cbTmpBlockCount-cbLineCount)*(j) + 1]) 
                                                                cbDistillCount = (j)*cbLineCount
                                                                break                                                
                                                        else
                                                                for k = 1, TmpResult.cbBlockCount[j] do                                                        
                                                                        local cbTmpBlockCount = TmpResult.cbBlockCount[j]
                                        for z = 1, cbTakeCardCount do --nana
                                        cbDistillCard[cbDistillCount + z] = TmpResult.cbCardData[j][(cbTmpBlockCount-(k-1)-1)*(j) + z]
                                        end
                                                                        cbDistillCount =  cbDistillCount + cbTakeCardCount
                                                                        --提取完成
                                                                        if( cbDistillCount == cbTakeCardCount*cbLineCount )then
                                            break
                                        end
                                                                end
                                                        end
                                                end

--提取完成
                                                if( cbDistillCount == cbTakeCardCount*cbLineCount )then
                                break
                            end
                        end

--提取完成
                                        if( cbDistillCount == cbTakeCardCount*cbLineCount )then
                                                --复制带牌
                                                local cbCount = pSearchCardResult.cbCardCount[cbResultIndex + 1]
                            for zz = 1, cbDistillCount do -- nana
                                     pSearchCardResult.cbResultCard[cbResultIndex + 1][cbCount  + zz] = cbDistillCard[zz]
                            end
                                                --pSearchCardResult.cbResultCard[cbResultIndex + 1][cbCount  + 1] = cbDistillCard
                                                pSearchCardResult.cbCardCount[cbResultIndex + 1] = pSearchCardResult.cbCardCount[cbResultIndex + 1] + cbDistillCount
                                        
                                        --否则删除连牌
                                        else
                                        
                                                bAllDistill = false
                                                pSearchCardResult.cbCardCount[cbResultIndex + 1] = 0
                                        end
                                end

--整理组合
                                if( not bAllDistill )then
                                        pSearchCardResult.cbSearchCount = cbResultCount
                                        cbResultCount = 0
                                        for i = 1, pSearchCardResult.cbSearchCount do
                                                if( pSearchCardResult.cbCardCount ~=  0 )then
                                                        tmpSearchCardResult.cbCardCount[cbResultCount + 1] = pSearchCardResult.cbCardCount
                                                        tmpSearchCardResult.cbResultCard[cbResultCount + 1] = clone(pSearchCardResult.cbResultCard)
                                                        cbResultCount = cbResultCount + 1
                                                end
                                        end
                                        tmpSearchCardResult.cbSearchCount = cbResultCount
                                        pSearchCardResult = tmpSearchCardResult
                                end
                        end
                end
    elseif cbTurnOutType == CMD_LAND.CT_FOUR_TAKE_ONE or cbTurnOutType == CMD_LAND.CT_FOUR_TAKE_TWO then
            --四带两单
            --四带两双
                local cbTakeCount = 2
        if cbTurnOutType == CMD_LAND.CT_FOUR_TAKE_ONE then
            cbTakeCount = 1
        end

local cbTmpTurnCard = {}
                cbTmpTurnCard = clone(cbTurnCardData)
                self:SortOutCardList( cbTmpTurnCard,cbTurnCardCount )

--搜索带牌
                cbResultCount, pSearchCardResult = self:SearchTakeCardType( cbCardData,cbCardCount,cbTmpTurnCard[1],4,cbTakeCount)
        end

if pSearchCardResult == nil or pSearchCardResult.cbCardCount == nil then
        pSearchCardResult.cbCardCount = {}
        if pSearchCardResult.cbResultCard == nil then
            pSearchCardResult.cbResultCard = {}
        end

for i = 1, CMD_LAND.MAX_COUNT do
            pSearchCardResult.cbCardCount = 0
            if pSearchCardResult.cbResultCard == nil then
                pSearchCardResult.cbResultCard = {}
                for j = 1, CMD_LAND.MAX_COUNT do
                    pSearchCardResult.cbResultCard[j] = 0
                end
            end    
        end
    end

--搜索炸弹
        if ((cbCardCount>= 4)and(cbTurnOutType~= CMD_LAND.CT_MISSILE_CARD))then
                --变量定义
                local cbReferCard = 0
                if (cbTurnOutType == CMD_LAND.CT_BOMB_CARD) then
            cbReferCard = cbTurnCardData[1]
        end

--搜索炸弹
                local cbTmpResultCount, tmpSearchCardResult = self:SearchSameCard( cbCardData,cbCardCount,cbReferCard,4)
                for i = 1, cbTmpResultCount do
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSearchCardResult.cbCardCount
                        pSearchCardResult.cbResultCard[cbResultCount + 1] = tmpSearchCardResult.cbResultCard
                        cbResultCount = cbResultCount + 1
                end
        end

--搜索火箭
        if (cbTurnOutType~= CMD_LAND.CT_MISSILE_CARD and (cbCardCount>= 2) and (cbCardData[1] == 0x4F) and (cbCardData[2] == 0x4E)) then
                --设置结果
                pSearchCardResult.cbCardCount[cbResultCount + 1] = 2
                pSearchCardResult.cbResultCard[cbResultCount + 1][1] = cbCardData[1]
                pSearchCardResult.cbResultCard[cbResultCount + 1][2] = cbCardData[2]

cbResultCount = cbResultCount + 1
        end

pSearchCardResult.cbSearchCount = cbResultCount
        return pSearchCardResult
end

--同牌搜索
function LandGameLogic:SearchSameCard(cbHandCardData, cbHandCardCount, cbReferCard, cbSameCardCount)
        --[[//搜索结果
struct tagSearchCardResult
{
        BYTE                                                        cbSearchCount;                                                //结果数目
        BYTE                                                        cbCardCount[CMD_LAND.MAX_COUNT];                                //扑克数目
        BYTE                                                        cbResultCard[CMD_LAND.MAX_COUNT][CMD_LAND.MAX_COUNT];        //结果扑克
};]]
    --memset(pSearchCardResult,0, sizeof(tagSearchCardResult));
    --设置结果
        local pSearchCardResult = {}
    pSearchCardResult.cbSearchCount = 0
    pSearchCardResult.cbCardCount = {}
    pSearchCardResult.cbResultCard = {}
    for i = 1, CMD_LAND.MAX_COUNT do
        pSearchCardResult.cbCardCount = 0
        pSearchCardResult.cbResultCard = {}
        for j = 1, CMD_LAND.MAX_COUNT do
            pSearchCardResult.cbResultCard[j] = 0
        end       
    end

local cbResultCount = 0

--构造扑克
        local cbCardData = {}
        local cbCardCount = cbHandCardCount
        cbCardData = clone(cbHandCardData)

--排列扑克
        self:SortCardList(cbCardData,cbCardCount,ST_ORDER)

--分析扑克
        local AnalyseResult = {}
        AnalyseResult = self:AnalysebCardData( cbCardData,cbCardCount)

local cbReferLogicValue = self:GetCardLogicValue(cbReferCard)
    if cbReferCard == 0 then
        cbReferLogicValue = 0
    end
        local cbBlockIndex = cbSameCardCount - 1
        repeat
                for i = 1, AnalyseResult.cbBlockCount[cbBlockIndex + 1] do
                
                        local cbIndex = (AnalyseResult.cbBlockCount[cbBlockIndex + 1]-(i-1)-1)*(cbBlockIndex+1)
                        if( self:GetCardLogicValue(AnalyseResult.cbCardData[cbBlockIndex + 1][cbIndex+1]) > cbReferLogicValue )then
                                if( pSearchCardResult == nil ) then 
                 return 1
                end

LuaProxy:ASSERT( cbResultCount < CMD_LAND.MAX_COUNT )

--复制扑克 --todo:liufapu zhe li ye shi keng a 
               -- memcpy( pSearchCardResult->cbResultCard[cbResultCount],&AnalyseResult.cbCardData[cbBlockIndex][cbIndex],
                           --         cbSameCardCount*sizeof(BYTE) );--liufapu
               for j = 1,  cbSameCardCount do
                    pSearchCardResult.cbResultCard[cbResultCount + 1][j] = AnalyseResult.cbCardData[cbBlockIndex + 1][cbIndex + j]
               end              
                                pSearchCardResult.cbCardCount[cbResultCount + 1] = cbSameCardCount
                                cbResultCount = cbResultCount + 1
                        end
                end

cbBlockIndex = cbBlockIndex + 1
    until( cbBlockIndex >= 4 )

if( pSearchCardResult ) then
                pSearchCardResult.cbSearchCount = cbResultCount
    end
        return cbResultCount, pSearchCardResult
end

--带牌类型搜索(三带一,四带一等)
function LandGameLogic:SearchTakeCardType(cbHandCardData, cbHandCardCount, cbReferCard, cbSameCount, cbTakeCardCount)
        --设置结果
        local pSearchCardResult = {}
    pSearchCardResult.cbSearchCount = 0
    pSearchCardResult.cbCardCount = {}
    pSearchCardResult.cbResultCard = {}
    for i = 1, CMD_LAND.MAX_COUNT do
        pSearchCardResult.cbCardCount = 0
        pSearchCardResult.cbResultCard = {}
        for j = 1, CMD_LAND.MAX_COUNT do
            pSearchCardResult.cbResultCard[j] = 0
        end       
    end
        local cbResultCount = 0

--效验
        LuaProxy:ASSERT( cbSameCount == 3 or cbSameCount == 4 )
        LuaProxy:ASSERT( cbTakeCardCount == 1 or cbTakeCardCount == 2 )
        if( cbSameCount ~=  3 and cbSameCount ~=  4 )then
                return cbResultCount,pSearchCardResult
    end
        if( cbTakeCardCount ~=  1 and cbTakeCardCount ~=  2 )then
                return cbResultCount, pSearchCardResult
    end

--长度判断
        if( cbSameCount == 4 and cbHandCardCount<cbSameCount+cbTakeCardCount*2 or
                cbHandCardCount < cbSameCount+cbTakeCardCount )then
                return cbResultCount, pSearchCardResult
    end

--构造扑克
        local cbCardData = {}
        local cbCardCount = cbHandCardCount
        cbCardData = clone(cbHandCardData)
        --排列扑克
        self:SortCardList(cbCardData, cbCardCount, ST_ORDER)

--搜索同张
        local SameCardResult = {}
        local cbSameCardResultCount, SameCardResult = self:SearchSameCard( cbCardData,cbCardCount,cbReferCard,cbSameCount)

if( cbSameCardResultCount > 0 )then
                --分析扑克
                local AnalyseResult = {}
                AnalyseResult = self:AnalysebCardData(cbCardData, cbCardCount)

--需要牌数
                local cbNeedCount = cbSameCount + cbTakeCardCount
                if( cbSameCount == 4 )then 
            cbNeedCount =  cbNeedCount + cbTakeCardCount
        end

--提取带牌
                for i = 1, cbSameCardResultCount do
                        local bMerge = false

for j = cbTakeCardCount - 1, 4 - 1 do
                                for k = 0, AnalyseResult.cbBlockCount[j + 1] - 1 do
                                        --从小到大
                                        local cbIndex = (AnalyseResult.cbBlockCount[j + 1]-k-1)*(j+1)

--过滤相同牌
                    while true do
                        if( self:GetCardValue(SameCardResult.cbResultCard[1])  == 
                                                self:GetCardValue(AnalyseResult.cbCardData[j + 1][cbIndex + 1]) )then
                            break
                        end
                        --复制带牌
                                            local cbCount = SameCardResult.cbCardCount
                        --memcpy(&SameCardResult.cbResultCard[cbCount], &AnalyseResult.cbCardData[j][cbIndex],
                                                --sizeof(BYTE)*cbTakeCardCount);
                        for index = 1, cbTakeCardCount do
                            SameCardResult.cbResultCard[cbCount + index] = clone(AnalyseResult.cbCardData[j + 1][cbIndex + index])
                        end

SameCardResult.cbResultCard[cbCount + 1] = AnalyseResult.cbCardData[j + 1][cbIndex + 1]
        
                                            SameCardResult.cbCardCount = SameCardResult.cbCardCount + cbTakeCardCount

if( SameCardResult.cbCardCount < cbNeedCount ) then 
                            break
                        end

--if( pSearchCardResult == nil ) then 
                         --   return 1
                        --end
                                            --复制结果
                        --memcpy(pSearchCardResult->cbResultCard[cbResultCount], SameCardResult.cbResultCard,
                                                --sizeof(BYTE)*SameCardResult.cbCardCount);
                                            pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(SameCardResult.cbResultCard)
                                            pSearchCardResult.cbCardCount[cbResultCount + 1] = SameCardResult.cbCardCount
                                            cbResultCount = cbResultCount + 1

bMerge = true
                        break --while xunhuan
                    end
                    if bMerge then
                        break--下一组合 --k xunhuan
                    end
                                        
                                end

if( bMerge )then
                    break --j xunhuan
                end
                        end
                end --for i xunhuan
        end --if

if( pSearchCardResult )then
                pSearchCardResult.cbSearchCount = cbResultCount
    end
        return cbResultCount,pSearchCardResult
end

--连牌搜索
function LandGameLogic:SearchLineCardType(cbHandCardData, cbHandCardCount, cbReferCard, cbBlockCount, cbLineCount)
        --设置结果
        local pSearchCardResult = {}
    --初始化
    pSearchCardResult.cbSearchCount = 0
    pSearchCardResult.cbCardCount = {}
    pSearchCardResult.cbResultCard = {}
    for i = 1, CMD_LAND.MAX_COUNT do
        pSearchCardResult.cbCardCount = 0
        pSearchCardResult.cbResultCard = {}
        for j = 1, CMD_LAND.MAX_COUNT do
            pSearchCardResult.cbResultCard[j] = 0
        end       
    end
        local cbResultCount = 0

--定义变量
        local cbLessLineCount = 0
        if( cbLineCount == 0 )then
                if( cbBlockCount == 1 )then
                        cbLessLineCount = 5
                elseif( cbBlockCount == 2 )then
                        cbLessLineCount = 3
                else 
            cbLessLineCount = 2
        end
        else 
        cbLessLineCount = cbLineCount
    end

local cbReferIndex = 2
        if( cbReferCard ~=  0 )then
                --LuaProxy:ASSERT( self:GetCardLogicValue(cbReferCard) - cbLessLineCount >= 2 )
                cbReferIndex = self:GetCardLogicValue(cbReferCard) - cbLessLineCount + 1
        end
        --超过A
        if( cbReferIndex + cbLessLineCount > 14 )then
        return cbResultCount, pSearchCardResult
    end

--长度判断
        if( cbHandCardCount < cbLessLineCount*cbBlockCount )then
        return cbResultCount, pSearchCardResult
    end
        --构造扑克
        local cbCardData = {}
        local cbCardCount = cbHandCardCount
        cbCardData = clone(cbHandCardData)

--排列扑克
        self:SortCardList(cbCardData, cbCardCount, ST_ORDER)

--分析扑克
        local Distributing = {}
        Distributing = self:AnalysebDistributing(cbCardData,cbCardCount)

--搜索顺子
        local cbTmpLinkCount = 0
        local cbValueIndex = 0
    local tempValueIndex = 0--临时变量,因为cbValueIndex经过for循环之后还是0,add by liufapu, yi da keng

for cbValueIndex = cbReferIndex, 12 do
        tempValueIndex = cbValueIndex
        local isContinue = false
                --继续判断 cbIndexCount = 5
                if ( Distributing.cbDistributing[cbValueIndex + 1][cbIndexCount + 1] < cbBlockCount )then
            while true do
                if( cbTmpLinkCount < cbLessLineCount )then
                            cbTmpLinkCount = 0
                    isContinue = true
                    break
                else
                    cbValueIndex = cbValueIndex - 1
                end
                break
            end                                
                else 
            print("22222cbTmpLinkCount = ", cbTmpLinkCount)
                        cbTmpLinkCount = cbTmpLinkCount + 1
                        --寻找最长连
            while true do
                if(cbLineCount == 0)then
                    isContinue = true
                    break
                end
                break
            end
                end

if not isContinue then
            if( cbTmpLinkCount >=  cbLessLineCount )then
                            if( pSearchCardResult == nil ) then 
                    print("return 1, pSearchCardResult ")
                    return 1, pSearchCardResult  
                end

-- LuaProxy:ASSERT(cbResultCount < pSearchCardResult.cbCardCount)

--复制扑克
                            local cbCount = 0
                            for cbIndex = cbValueIndex + 1 - cbTmpLinkCount, cbValueIndex do
                                    local cbTmpCount = 0
                                    for cbColorIndex = 0, 4 - 1 do
                                            for cbColorCount = 0, Distributing.cbDistributing[cbIndex + 1][3 - cbColorIndex + 1] - 1 do
                            if pSearchCardResult.cbResultCard[cbResultCount + 1] then
                               pSearchCardResult.cbResultCard[cbResultCount + 1][cbCount + 1] = self:MakeCardData(cbIndex, 3 - cbColorIndex)
                            end
                                                   
                            cbCount = cbCount + 1
                            cbTmpCount = cbTmpCount + 1
                           -- while true do
                             if( cbTmpCount == cbBlockCount ) then
                                break
                           -- end
                           -- break
                            end
                                                   
                                            end
                       -- while true do
                         if( cbTmpCount == cbBlockCount ) then
                            break
                      --  end
                       -- break
                        end
                                           
                                    end
                            end

--设置变量
                if pSearchCardResult.cbCardCount[cbResultCount + 1] then
                 pSearchCardResult.cbCardCount[cbResultCount + 1] = cbCount
                             cbResultCount = cbResultCount + 1
                end

if( cbLineCount ~=  0 )then                        
                                    cbTmpLinkCount = cbTmpLinkCount - 1                        
                            else 
                                    cbTmpLinkCount = 0
                            end
                    end
        end        
        end

--add by liufapu,因为cbValueIndex = 12时  后面还cbValueIndex++ 了一次
    tempValueIndex = tempValueIndex + 1
        --特殊顺子(带A的顺子)
        if( cbTmpLinkCount >= (cbLessLineCount - 1) and (tempValueIndex == 13) )then
                if( Distributing.cbDistributing[1][cbIndexCount + 1] >=  cbBlockCount or
                        cbTmpLinkCount >=  cbLessLineCount )then
                        if( pSearchCardResult == nil ) then 
                return 1, pSearchCardResult
            end

--LuaProxy:ASSERT( cbResultCount < CMD_LAND.MAX_COUNT )

--复制扑克
                        local cbCount = 0
                        local cbTmpCount = 0
                        for cbIndex = tempValueIndex - cbTmpLinkCount, 12 do
                                cbTmpCount = 0
                                for cbColorIndex = 0, 4 - 1 do
                                        for cbColorCount = 0, Distributing.cbDistributing[cbIndex + 1][3 - cbColorIndex + 1] - 1 do                                    
                                                if pSearchCardResult.cbResultCard[cbResultCount + 1] then
                                                 pSearchCardResult.cbResultCard[cbResultCount + 1][cbCount + 1] = self:MakeCardData(cbIndex, 3 - cbColorIndex)
                        cbCount = cbCount + 1
                        cbTmpCount = cbTmpCount + 1
                                                end

if( cbTmpCount == cbBlockCount )then
                            break
                        end
                                        end
                                        if( cbTmpCount == cbBlockCount ) then
                        break
                    end
                                end
                        end
                        --复制A
                        if( Distributing.cbDistributing[1][cbIndexCount + 1] >=  cbBlockCount )then
                                cbTmpCount = 0
                                for cbColorIndex = 0, 4 - 1 do
                                        for cbColorCount = 0, Distributing.cbDistributing[1][3-cbColorIndex + 1] - 1 do        
                    if pSearchCardResult.cbResultCard[cbResultCount + 1] then
                            pSearchCardResult.cbResultCard[cbResultCount + 1][cbCount + 1] = self:MakeCardData(0,3-cbColorIndex)
                        cbCount = cbCount + 1
                        cbTmpCount =cbTmpCount + 1
                    end                                    
                                        
                                                if( cbTmpCount == cbBlockCount ) then
                            break
                        end
                                        end
                                        if( cbTmpCount == cbBlockCount ) then 
                        break
                    end
                                end
                        end

--设置变量
            if pSearchCardResult.cbCardCount[cbResultCount + 1] then
            pSearchCardResult.cbCardCount[cbResultCount + 1] = cbCount
                        cbResultCount = cbResultCount + 1
            end
                        
                end
        end

if( pSearchCardResult )then
                pSearchCardResult.cbSearchCount = cbResultCount
    end
        return cbResultCount, pSearchCardResult
end

--搜索飞机(暂时没用到的方法)
function LandGameLogic:SearchThreeTwoLine(cbHandCardData, cbHandCardCount)
        --设置结果
    local pSearchCardResult = {}
    pSearchCardResult.cbSearchCount = 0
    pSearchCardResult.cbCardCount = {}
    pSearchCardResult.cbResultCard = {}
    local tmpSingleWing = { }
    tmpSingleWing.cbSearchCount = 0
    tmpSingleWing.cbResultCard = { }
    tmpSingleWing.cbCardCount = { }
    local tmpDoubleWing = { }
    tmpDoubleWing.cbSearchCount = 0
    tmpDoubleWing.cbResultCard = { }
    tmpDoubleWing.cbCardCount = { }
    for i = 1, CMD_LAND.MAX_COUNT do
        pSearchCardResult.cbCardCount = 0
        pSearchCardResult.cbResultCard = { }

tmpSingleWing.cbCardCount = 0
        tmpSingleWing.cbResultCard = { }

tmpDoubleWing.cbCardCount = 0
        tmpDoubleWing.cbResultCard = { }
        for j = 1, CMD_LAND.MAX_COUNT do
            pSearchCardResult.cbResultCard[j] = 0
            tmpSingleWing.cbResultCard[j] = 0
            tmpDoubleWing.cbResultCard[j] = 0
        end
    end
    -- 变量定义
    local tmpSearchResult = { }
    -- local tmpSingleWing = {}
    -- local tmpDoubleWing = {}
    local cbTmpResultCount = 0

-- 搜索连牌
    cbTmpResultCount, tmpSearchResult = self:SearchLineCardType(cbHandCardData, cbHandCardCount, 0, 3, 0)

if (cbTmpResultCount > 0) then
        -- 提取带牌
        for i = 1, cbTmpResultCount do
            -- 变量定义
            local cbTmpCardData = { }
            local cbTmpCardCount = cbHandCardCount

-- 不够牌
            if (cbHandCardCount - tmpSearchResult.cbCardCount < math.floor(tmpSearchResult.cbCardCount / 3)) then
                local cbNeedDelCount = 3
                while (cbHandCardCount + cbNeedDelCount - tmpSearchResult.cbCardCount < math.floor(tmpSearchResult.cbCardCount - cbNeedDelCount) / 3) do
                    cbNeedDelCount = cbNeedDelCount + 3
                end
                -- 不够连牌
                while true do
                    if (math.floor((tmpSearchResult.cbCardCount - cbNeedDelCount) / 3) < 2) then
                        break
                        -- 废除连牌
                    end
                    -- 拆分连牌
                    self:RemoveCard(tmpSearchResult.cbResultCard, cbNeedDelCount, tmpSearchResult.cbResultCard,
                    tmpSearchResult.cbCardCount)
                    tmpSearchResult.cbCardCount = tmpSearchResult.cbCardCount - cbNeedDelCount
                    break
                end

end

-- if( pSearchCardResult == nil ) then
            --    return 1
            -- end

-- 删除连牌
            cbTmpCardData = clone(cbHandCardData)
            -- LuaProxy:ASSERT(self:RemoveCard(tmpSearchResult.cbResultCard, tmpSearchResult.cbCardCount,
            -- cbTmpCardData,cbTmpCardCount ) )
            cbTmpCardCount = cbTmpCardCount - tmpSearchResult.cbCardCount

-- 组合飞机
            local cbNeedCount = math.floor(tmpSearchResult.cbCardCount / 3)
            -- LuaProxy:ASSERT( cbNeedCount <=  cbTmpCardCount )
            tmpSingleWing.cbSearchCount = tmpSingleWing.cbSearchCount + 1
            local cbResultCount = tmpSingleWing.cbSearchCount
            tmpSingleWing.cbResultCard[cbResultCount + 1] = clone(tmpSearchResult.cbResultCard)

tmpSingleWing.cbResultCard[cbResultCount + 1][tmpSearchResult.cbCardCount] = clone(cbTmpCardData[cbTmpCardCount - cbNeedCount + 1])
            tmpSingleWing.cbCardCount = tmpSearchResult.cbCardCount + cbNeedCount

-- 不够带翅膀
            if (cbTmpCardCount < math.floor(tmpSearchResult.cbCardCount / 3 * 2)) then
                local cbNeedDelCount = 3
                while (cbTmpCardCount + cbNeedDelCount - tmpSearchResult.cbCardCount < math.floor((tmpSearchResult.cbCardCount - cbNeedDelCount) / 3 * 2)) do
                    cbNeedDelCount = cbNeedDelCount + 3
                end
                -- 不够连牌
                while true do
                    if (math.floor((tmpSearchResult.cbCardCount - cbNeedDelCount) / 3) < 2) then
                        break
                        -- 废除连牌
                    end
                    -- 拆分连牌
                    self:RemoveCard(tmpSearchResult.cbResultCard, cbNeedDelCount, tmpSearchResult.cbResultCard,
                    tmpSearchResult.cbCardCount)
                    tmpSearchResult.cbCardCount = tmpSearchResult.cbCardCount - cbNeedDelCount

-- 重新删除连牌
                    cbTmpCardData = clone(cbHandCardData)
                    -- LuaProxy:ASSERT(self:RemoveCard(tmpSearchResult.cbResultCard, tmpSearchResult.cbCardCount,
                    --  cbTmpCardData,cbTmpCardCount ) )
                                    cbTmpCardCount = cbHandCardCount-tmpSearchResult.cbCardCount
                    break
                end                
                        end

--分析牌
                        local  TmpResult = {}
                        TmpResult = self:AnalysebCardData(cbTmpCardData,cbTmpCardCount)

--提取翅膀
                        local cbDistillCard = {}
                        local cbDistillCount = 0
                        local cbLineCount = math.floor(tmpSearchResult.cbCardCount/3)
                        for j = 1, 4 - 1 do
                                if( TmpResult.cbBlockCount[j + 1] > 0 )then
                                
                                        if( j+1 == 2 and TmpResult.cbBlockCount[j + 1] >=  cbLineCount )then
                                        
                                                local cbTmpBlockCount = TmpResult.cbBlockCount[j+ 1]
                                                cbDistillCard = clone(TmpResult.cbCardData[j + 1][(cbTmpBlockCount-cbLineCount)*(j+1) + 1])
                                                cbDistillCount = (j+1)*cbLineCount
                                                break
                                        
                                        else
                                        
                                                for k = 0, TmpResult.cbBlockCount[j + 1] - 1 do
                                                
                                                        local cbTmpBlockCount = TmpResult.cbBlockCount[j + 1]
                            --todo:liufapu
                            --memcpy( &cbDistillCard[cbDistillCount],&TmpResult.cbCardData[j][(cbTmpBlockCount-k-1)*(j+1)],
                                                        --        sizeof(BYTE)*2 );
                            cbDistillCard[cbDistillCount + 1] = clone(TmpResult.cbCardData[j + 1][(cbTmpBlockCount - k - 1) *(j + 1) + 1])
                            cbDistillCard[cbDistillCount + 2] = clone(TmpResult.cbCardData[j + 1][(cbTmpBlockCount - k - 1) *(j + 1) + 2])
                                                        cbDistillCount =  cbDistillCount + 2

--提取完成
                                                        if( cbDistillCount == 2*cbLineCount ) then
                                break
                            end
                                                end
                                        end
                                end

--提取完成
                                if( cbDistillCount == 2*cbLineCount ) then
                    break
                end
                        end

--提取完成
                        if( cbDistillCount == 2*cbLineCount )then
                                --复制翅膀          
                                cbResultCount = tmpDoubleWing.cbSearchCount
                tmpDoubleWing.cbSearchCount = tmpDoubleWing.cbSearchCount + 1
                                tmpDoubleWing.cbResultCard[cbResultCount + 1] = clone(tmpSearchResult.cbResultCard)

tmpDoubleWing.cbResultCard[cbResultCount + 1][tmpSearchResult.cbCardCount] = clone(cbDistillCard)
                                tmpDoubleWing.cbCardCount = tmpSearchResult.cbCardCount+cbDistillCount
                        end
                end

--复制结果
                for i = 1,tmpDoubleWing.cbSearchCount do
                    pSearchCardResult.cbSearchCount = pSearchCardResult.cbSearchCount + 1
                        local cbResultCount = pSearchCardResult.cbSearchCount

pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpDoubleWing.cbResultCard)
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpDoubleWing.cbCardCount
                end
                for i = 1, tmpSingleWing.cbSearchCount do
            pSearchCardResult.cbSearchCount =pSearchCardResult.cbSearchCount + 1
                        local cbResultCount = pSearchCardResult.cbSearchCount

pSearchCardResult.cbResultCard[cbResultCount + 1] = clone(tmpSingleWing.cbResultCard)
                        pSearchCardResult.cbCardCount[cbResultCount + 1] = tmpSingleWing.cbCardCount
                end
        end
    local result = pSearchCardResult.cbSearchCount
    if pSearchCardResult == nil then
        result = 0
    end
    return result, pSearchCardResult
end

--获取数值
function LandGameLogic:GetCardValue(cbCardData) 
    return bit.band(cbCardData,CMD_LAND.MASK_VALUE)
end
--获取花色
function LandGameLogic:GetCardColor(cbCardData) 
    return bit.band(cbCardData,CMD_LAND.MASK_COLOR)
end

return LandGameLogic

--endregion

lua 的斗地主逻辑算法相关推荐

  1. 斗地主AI算法——第一章の业务逻辑

    转眼间快到了五月,帝都的天气也变的非常梦幻. 时而酷暑炎热,时而狂风席卷. 而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华. 世界是寂寞的,寂寞到不只是寂寞,而是死一般的寂 ...

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

    上一章已经排除了飞机.三带等牌型,那么除去炸弹王炸以外,我们只剩下单牌.对牌.三牌以及单顺.双顺.三顺了. 首先说单牌.对牌.三牌.其逻辑基本一样,只是出牌的个数有差别,即:如果该i牌数量满足这种牌型 ...

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

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

  4. 斗地主AI算法——第十二章の主动出牌(1)

    本章开始,我们介绍主动出牌的算法,和被动出牌类似,我们第一步把主要架子搭起来. 首先清空出牌序列 clsHandCardData.ClearPutCardList(); 主动出牌的策略按照优先级大体可 ...

  5. 斗地主AI算法——第十一章の被动出牌(5)

    本章是被动出牌的最后一章,截止目前,我们已经解决了大部分牌型.只剩下飞机和炸弹了. 飞机无疑是最复杂的类型,他等于顺子和三带的结合体,但又增加了很多难度. 根据上一章的算法,我们可以大概想到,若是带出 ...

  6. 斗地主AI算法——第八章の被动出牌(2)

    上一章我们已经搭好了被动出牌的基本架子,本章我们主要说明一下被动出牌算法的基本步骤. 我把出牌逻辑分为四个阶段,也就是策略的优先级.分别是:[直接打光手牌]→[同类型牌压制]→[炸弹王炸压制]→[不出 ...

  7. 斗地主AI算法——第七章の被动出牌(1)

    哎,之前扯了那么多蛋,终于讲出牌了! 本章开始讲被动出牌的逻辑算法.首先我们先把架子搭起来,被动出牌我们肯定是要知道场上目前打出的是什么牌型. 在第二章数据结构里我们定义过,游戏全局类里面有一个存放当 ...

  8. 斗地主AI算法——第四章の权值定义

    第一章业务逻辑结尾部分我提到了权值的计算方法: ①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样.③整手牌可以分成若干个组合牌,但分法不唯一. 当时,我说了① ...

  9. 斗地主AI算法——第三章の数据处理

    上一章我们定义了基本的数据结构,相信大家看到手牌类里面那么多出牌序列时一定会比较愤慨... 其实一开始写的时候我也是觉得很脑残,不过后续开发证明了这样的结构还是可以的,因为只要我封装了一层数据转换,接 ...

  10. 斗地主AI算法——第二章の数据结构

    上一章我们已经确立了基本的业务逻辑处理流程.从本章开始,我们便进入开发阶段. 首先就是明确我们都需要哪些数据,且它们以怎样的形式存储. 首先从上一章反复提到的手牌权值结构说起,也就是F()的返回值,他 ...

最新文章

  1. ElasticSearch 在数十亿级别数据下,如何提高查询效率?
  2. QT的QLatin1String类的使用
  3. Code Runner for VS Code 突破 2000 万下载量!支持超过 50 种语言
  4. Android之Android Studio三种方式导入外部资源 以及 报错处理
  5. 您应该对什么进行单元测试? –测试技术3
  6. go get 的不再src目录中_Go 每日一库之 sqlc:根据 sql 生成代码
  7. layui 分页ajax,实现Ajax异步的layui分页
  8. 作者:吴甘沙,英特尔中国研究院院长。
  9. Integer 与 int 的区别
  10. HP 3PAR公用存储的妙用
  11. Ubuntu 14.04开启ssh服务
  12. access ps4战地1要ea_EA游戏订阅服务将于2019年7月登陆PS4平台,抢先游玩枪车球新作...
  13. ABAP培训进入SAP第一步
  14. marlab中主成分得分怎么求_成考数学不可触碰的雷区和得分技巧(纯干货)
  15. SDK接入学习(一):PlayerSetting详解(PC、Mac、Linux)
  16. zhu的Oracle数据库笔记
  17. vbs 合并 excel 表格
  18. Flask邮件的配置和使用
  19. 没有一个真正歌手的时代,没有一首好歌的年代
  20. 全网最新最全的jmeter接口测试,压力测试

热门文章

  1. 为什么常用二倍图,流式布局中一倍图是否靠得住
  2. 【产品设计-小程序】小胖工具箱系列—汇率换算
  3. 关于微信网页版WeChat不能正常登录的最佳解决方案
  4. 微信登录显示网页无法连接服务器地址,手机微信登陆不了?
  5. 重装系统win10安装教程(超详细)
  6. 本地化软件UI部分不显示的一种可能
  7. w ndows 10关机快捷键,win10关机有什么快捷键 win10关机快捷键及使用小技巧【图文】...
  8. 计算机到期收益率公式,用到期收益率计算债券价格
  9. 台式计算机为什么数字输入不了,电脑小键盘不能输入数字该怎么办?
  10. 技术宅日记:机器学习修炼的每一步