lua——赢三张牌型处理相关算法(下)——牌型比较


上文中我们已经实现了赢三张牌型的判定方法,同时我们也给出了一个枚举结构CardType。不难理解,若两组牌不是同一牌型的话,直接根据枚举的值进行比对就可以了。若是相同牌型还需要进行进一步的判断。所以我们暂且将比牌函数分为两个分支

--@比牌接口函数
--@ my_Cards, 本家牌,
--@ pre_Cards,下家牌,
--@ ret true/false
function cardTool.isOvercomePrev(my_Cards, next_Cards)
    --获取各自牌形
    local my_Cards_Type = cardTool.getCardType(my_Cards)
    local next_Cards_Type = cardTool.getCardType(next_Cards)
    local winorlose
    if  my_Cards_Type == next_Cards_Type then --牌形相同的情况下
        winorlose =  CardTypeSame(my_Cards, next_Cards, my_Cards_Type)
    end
    if my_Cards_Type ~= next_Cards_Type  then --牌形不同的情况下
  
        winorlose =  CardTypeDifferent(my_Cards, next_Cards,my_Cards_Type,next_Cards_Type)
    end
	return winorlose
end

若牌型不同,直接根据枚举值判断,这里有一个235管豹子的说法,所以需要单独处理一下豹子事件。

function  CardTypeDifferent( my_Cards, next_Cards, my_Cards_Type, next_Cards_Type )
	local  win  = true
    local  lose = false

    local isWinOrlose

    local my_Cards_Bao_Zi = false
    local next_Cards_Bao_Zi = false

    if my_Cards_Type == CardType.BAO_ZI then
        my_Cards_Bao_Zi = true
    end

    if next_Cards_Type == CardType.BAO_ZI then
        next_Cards_Bao_Zi = true
    end

    --如果没有豹子
    if my_Cards_Bao_Zi == next_Cards_Bao_Zi then
        isWinOrlose = my_Cards_Type - next_Cards_Type
        if isWinOrlose > 0 then
            return win
        end

        if isWinOrlose < 0 then
            return lose
        end
    end

    if my_Cards_Bao_Zi or next_Cards_Bao_Zi then
		my_Cards_235 = is235(my_Cards)
        next_Cards_235 = is235(next_Cards)
        if my_Cards_235  then
            if cardTool.isTongHua(my_Cards) then
                return lose
            else
                return win
            end
		end
        if next_Cards_235 then
            if cardTool.isTongHua(next_Cards) then
                return win
            else
                return lose
			end
        end
		if (my_Cards_235 == false) and (next_Cards_235 == false) then
			if 	my_Cards_Type == CardType.BAO_ZI then
				return win
			end

			if next_Cards_Type == CardType.BAO_ZI then
				return lose
			end
    	end
	end
end

同牌型的牌比较就要分别处理了:

豹子:比较单张牌牌值

同花顺:比较第三张牌,同时考虑A23特殊顺子情况

同花:从第三张牌开始依次比较

顺子:比较第三张牌,同时考虑A23特殊顺子情况

对牌:首先比较第二张,因为第二张一定是构成对子的那张牌。若相同则再比对(第一张+第三张)

另外:赢三张规定,三张牌值完全相同的情况下,比牌者输

function CardTypeSame( my_Cards, next_Cards, my_Cards_Type )
    --------------------------------------豹子-----------------------------
	local  win  = true
    local  lose = false
    local  SubValueBaoZi
    if  my_Cards_Type == CardType.Bao_ZI then
        SubValueBaoZi = my_Cards[1].card_value - next_Cards[1].card_value
        if  SubValueBaoZi == 0 then
            return lose
        end
        if SubValueBaoZi > 0 then
            return win
        end
        if SubValueBaoZi < 0 then
            return lose
        end
    end
    -------------------------------------同花顺-----------------------------

    local  IsOrNotA32_mycards
    local  IsOrNotA32_nextcards
    local  SubValueSunZi
    if  my_Cards_Type == CardType.TONG_HUA_SHUN then

        IsOrNotA32_mycards = isA32(my_Cards)
        IsOrNotA32_nextcards = isA32(next_Cards)

        --两个都是A32
        if IsOrNotA32_mycards  and IsOrNotA32_nextcards then
            return lose
        end

        --有一个有A32
        if IsOrNotA32_mycards  or IsOrNotA32_nextcards then
            if IsOrNotA32_nextcards then
                return win
            else
                return lose
            end
        end

        --都没有A32
        if IsOrNotA32_mycards  == false and IsOrNotA32_nextcards == false then
            SubValueSunZi = my_Cards[3].card_value - next_Cards[3].card_value
            if SubValueSunZi == 0 then
                return lose
            end
            if SubValueSunZi > 0 then
                return win
            end
            if SubValueSunZi < 0 then
                return lose
            end
        end
    end

    --------------------------------------------同花----------------------------------
    if  my_Cards_Type == CardType.TONG_HUA then
        if my_Cards[3].card_value - next_Cards[3].card_value > 0 then
            return win 
        end

        if my_Cards[3].card_value - next_Cards[3].card_value < 0 then
            return lose
        end
        if my_Cards[2].card_value - next_Cards[2].card_value > 0 then
            return win 
        end

        if my_Cards[2].card_value - next_Cards[2].card_value < 0 then
            return lose
        end        
        if my_Cards[1].card_value - next_Cards[1].card_value > 0 then
            return win 
        end

        if my_Cards[1].card_value - next_Cards[1].card_value < 0 then
            return lose
        end
        return lose
    end
    
    --------------------------------------------顺子----------------------------------
    local  IsOrNotA32_mycards
    local  IsOrNotA32_nextcards
    local  SubValueSunZi
    if  my_Cards_Type == CardType.SHUN_ZI then

        IsOrNotA32_mycards = isA32(my_Cards)
        IsOrNotA32_nextcards = isA32(next_Cards)

        --两个都是A32
        if IsOrNotA32_mycards  and IsOrNotA32_nextcards then
            return lose
        end

        --有一个有A32
        if IsOrNotA32_mycards  or IsOrNotA32_nextcards then
            if IsOrNotA32_nextcards then
                return win
            else
                return lose
            end
        end

        --都没有A32
        if IsOrNotA32_mycards  == false and IsOrNotA32_nextcards == false then
            SubValueSunZi = my_Cards[3].card_value - next_Cards[3].card_value
            if SubValueSunZi == 0 then
                return lose
            end
            if SubValueSunZi > 0 then
                return win
            end
            if SubValueSunZi < 0 then
                return lose
            end
        end
    end

    --------------------------------------------对子----------------------------------
   
    if  my_Cards_Type == CardType.DUI_ZI then
        --第二张牌一定是组成对子的那张牌
        local SubValueDuiZi = my_Cards[2].card_value - next_Cards[2].card_value
        --第二张不等
        if SubValueDuiZi > 0 then
            return win 
        end
        if SubValueDuiZi < 0 then
            return lose
        end
        --第二张相等
        if SubValueDuiZi == 0 then
            if (my_Cards[1].card_value + my_Cards[3].card_value ) > (next_Cards[1].card_value + next_Cards[3].card_value) then
                return win
            else
                return lose
            end
        end
        
    end

    --------------------------------------------单牌----------------------------------
    if  my_Cards_Type == CardType.UNDEFINE then
        if my_Cards[3].card_value - next_Cards[3].card_value > 0 then
            return win 
        end

        if my_Cards[3].card_value - next_Cards[3].card_value < 0 then
            return lose
        end
        if my_Cards[2].card_value - next_Cards[2].card_value > 0 then
            return win 
        end

        if my_Cards[2].card_value - next_Cards[2].card_value < 0 then
            return lose
        end        
        if my_Cards[1].card_value - next_Cards[1].card_value > 0 then
            return win 
        end

        if my_Cards[1].card_value - next_Cards[1].card_value < 0 then
            return lose
        end
        return lose
	end
end

最后用我们的测试函数验证一下:

local cardBuffer =cardTool.RandCardList()


--cardBuffer[1]=2
--cardBuffer[2]=3+16
--cardBuffer[3]=5

--cardBuffer[4]=4+16
--cardBuffer[5]=4+32
--cardBuffer[6]=4+48


local cards1={}
local cards2={}

for i=1,6,1 do
    local cardColor = luabit.band(cardBuffer[i] , 0xF0)
    local cardValue = luabit.band(cardBuffer[i] , 0x0F)


    local cardinfo =
    {
        card_value = cardValue;
        card_Color = cardColor;
    }
    if i >3 then
        cards2[i-3] = cardinfo
    else
        cards1[i] = cardinfo
    end


end


print_t(cardTool.getCardTypeNamebyType(cardTool.getCardType(cards1)))
print_t(cardTool.getCardNamebyCards(cards1))

print_t(cardTool.getCardTypeNamebyType(cardTool.getCardType(cards2)))
print_t(cardTool.getCardNamebyCards(cards2))



print_t(cardTool.isOvercomePrev(cards1,cards2))

输出:

  单牌

  黑桃4梅花6方块Q

  同花

  梅花5梅花9梅花K

  false


测试235逻辑:

cardBuffer[1]=2
cardBuffer[2]=3+16
cardBuffer[3]=5

cardBuffer[4]=4+16
cardBuffer[5]=4+32
cardBuffer[6]=4+48

输出:

  单牌

  黑桃2红桃3黑桃5

  豹子

  红桃4梅花4方块4

  true

测试A23逻辑:

cardBuffer[1]=2
cardBuffer[2]=3+16
cardBuffer[3]=14

cardBuffer[4]=4+16
cardBuffer[5]=5+32
cardBuffer[6]=6+48

输出:

  顺子

  黑桃2红桃3黑桃A

  顺子

  红桃4梅花5方块6

  false

好啦~赢三张系列已经完结~~~~~~~撒花~~~~~~~同时还要吐槽一个CSDN,之前因为叫zhajinhua侵犯了敏感词结果被封了,宝宝很心塞,宝宝很委屈╮(╯▽╰)╭




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值