• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

lua——牛牛牌型处理相关算法(中)——牌型判定

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

牛牛的牌型按从小到大的顺序分为:无牛<有牛<牛牛<银牛<金牛<炸弹<五小牛。

 

算牛的方式为:先选出三张牌,若能组成十的整数倍 即为有牛,然后再看剩余两张牌除以十的余数。余几就是牛几,若正好也能整除十,即为牛牛。若无法选出三张组成十的整数倍的牌即为无牛。

银牛:1张10 加4张大于10的牌

金牛:5张大于10的牌

炸弹:存在四张相同的牌

五小牛:五张牌总数值相加小于等于10

 

首先定义牌型,因为客户端不同数的牛显示不一样,所以把有牛的九种情况都分开定义

 

[plain] view plain copy
 
  1. --五小牛>炸弹>金牛>银牛>牛牛>有牛>没牛  
  2. CardType =  
  3. {  
  4.   
  5.     NOT_NIU=0,        --没牛  
  6.     NIU_1 =1,         --牛一  
  7.     NIU_2 =2,         --牛二  
  8.     NIU_3 =3,         --牛三  
  9.     NIU_4 =4,         --牛四  
  10.     NIU_5 =5,         --牛五  
  11.     NIU_6 =6,         --牛六  
  12.     NIU_7 =7,         --牛七  
  13.     NIU_8 =8,         --牛八  
  14.     NIU_9 =9,         --牛九  
  15.     NIU_NIU =10,      --牛牛  
  16.     SILVER_NIU =11,   --银牛  
  17.     GOLD_NIU=12,      --金牛  
  18.     BOMB = 13,        --炸弹  
  19.     SMALL_NIU = 14,   --五小牛  
  20. }  

 

为了方便计算,在判定牌型前要对牌进行排序。

 

[plain] view plain copy
 
  1. function compByCardsValue(a, b)  
  2.   
  3.     if a.card_value < b.card_value then  
  4.         return true  
  5.     end  
  6.   
  7.     if a.card_value > b.card_value then  
  8.         return false  
  9.     end  
  10.   
  11.     return a.card_color < b.card_color  
  12. end  
  13.   
  14.   
  15. function cardTool.sortByCardsValue(cards)  
  16.     table.sort(cards, compByCardsValue);  
  17. end  


下面进行牌值的判定,先计算特殊的牌型

 

[plain] view plain copy
 
  1. function cardTool.is_small_niu(cards)  
  2.     local sum = 0       
  3.     for i = 1,#cards do  
  4.         sum = sum + cards[i].card_count  
  5.     end  
  6.     if sum <= 10 then  
  7.         return true  
  8.     else  
  9.         return false  
  10.     end  
  11. end  
  12.   
  13. function cardTool.is_bomb(cards)  
  14.   
  15.     if cards[1].card_value == cards[4].card_value then  
  16.         return true  
  17.     elseif cards[2].card_value == cards[5].card_value then  
  18.         return true  
  19.     else  
  20.         return false  
  21.     end  
  22. end  
  23.   
  24. function cardTool.is_gold_niu(cards)  
  25.     if cards[1].card_value > 10 then  
  26.         return true  
  27.     else  
  28.         return false  
  29.     end  
  30. end  
  31.   
  32. function cardTool.is_silver_niu(cards)  
  33.     if cards[2].card_value > 10 and cards[1].card_value == 10 then  
  34.         return true  
  35.     else  
  36.         return false  
  37.     end  
  38. end  


判定牛数的算法其实很简单,我们先算出五张牌总值除以十的余数,然后再枚举两张牌,若存在两张牌之和除以十的余数等于五张牌除以十的余数,那么其他三张牌必然总和为十的倍数。那么这个余数就是牛数。

 

[plain] view plain copy
 
  1. function cardTool.getNiubyCards(cards)  
  2.     local lave = 0     --余数  
  3.     for i = 1,#cards do  
  4.         lave = lave + cards[i].card_count  
  5.     end  
  6.     lave = lave % 10  
  7.     for i = 1,#cards - 1 do  
  8.         for j = i + 1,#cards do  
  9.             if(cards[i].card_count+cards[j].card_count)%10 == lave then  
  10.                 if lave == 0 then  
  11.                     return 10  
  12.                 else  
  13.                     return lave  
  14.                 end  
  15.             end  
  16.         end  
  17.     end  
  18.   
  19.     return 0  
  20. end  


这样我们所有分支牌型的判定逻辑就都实现了,下面写出接口

 

[plain] view plain copy
 
  1. function cardTool.getTypebyCards(cards)  
  2.   
  3.     cardTool.sortByCardsValue(cards)  
  4.     local cardtype = CardType.NOT_NIU  
  5.   
  6.     if cardTool.is_small_niu(cards) then  
  7.         cardtype = CardType.SMALL_NIU  
  8.         return cardtype  
  9.     end  
  10.     if cardTool.is_bomb(cards) then  
  11.         cardtype = CardType.BOMB  
  12.         return cardtype  
  13.     end   
  14.     if cardTool.is_gold_niu(cards) then  
  15.         cardtype = CardType.GOLD_NIU  
  16.         return cardtype  
  17.     end   
  18.     if cardTool.is_silver_niu(cards) then  
  19.         cardtype = CardType.SILVER_NIU  
  20.         return cardtype  
  21.     end   
  22.   
  23.     cardtype=cardTool.getNiubyCards(cards)  
  24.       
  25.     return cardtype  
  26. end  

 

翻译函数:

 

[plain] view plain copy
 
  1. function cardTool.getCardTypeNamebyType(CardType)  
  2.     if CardType==0 then  
  3.         return "没牛"  
  4.     end  
  5.     if CardType==1 then  
  6.         return "牛一"  
  7.     end  
  8.     if CardType==2 then  
  9.         return "牛二"  
  10.     end  
  11.     if CardType==3 then  
  12.         return "牛三"  
  13.     end  
  14.     if CardType==4 then  
  15.         return "牛四"  
  16.     end  
  17.     if CardType==5 then  
  18.         return "牛五"  
  19.     end  
  20.     if CardType==6 then  
  21.         return "牛六"  
  22.     end  
  23.     if CardType==7 then  
  24.         return "牛七"  
  25.     end  
  26.     if CardType==8 then  
  27.         return "牛八"  
  28.     end  
  29.     if CardType==9 then  
  30.         return "牛九"  
  31.     end  
  32.     if CardType==10 then  
  33.         return "牛牛"  
  34.     end  
  35.     if CardType==11 then  
  36.         return "银牛"  
  37.     end  
  38.     if CardType==12 then  
  39.         return "金牛"  
  40.     end  
  41.     if CardType==13 then  
  42.         return "炸弹"  
  43.     end  
  44.     if CardType==14 then  
  45.         return "五小牛"  
  46.     end  
  47.     return "异常牌型"  
  48.   
  49. end  



我们依然引用之前的测试函数来查看一下输出:

 

[plain] view plain copy
 
  1. print_t(cardTool.getCardTypeNamebyType(cardTool.getTypebyCards(cards1)))  
  2. print_t(cardTool.getCardNamebyCards(cards1))  
  3.   
  4. print_t(cardTool.getCardTypeNamebyType(cardTool.getTypebyCards(cards2)))  
  5. print_t(cardTool.getCardNamebyCards(cards2))  

 

 

[plain] view plain copy
 
  1. 牛牛  
  2.   
  3. 梅花3方块8方块9黑桃J红桃K  
  4.   
  5. 牛五  
  6.   
  7. 黑桃6红桃9方块10梅花J方块K  



以上就是牌型判定相关的处理函数,下一章我们实现牌型比较的相关逻辑。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#与lua相互调用发布时间:2022-07-22
下一篇:
quicklua3.3常用方法和学习技巧之transition.lua发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap