lua——牛牛牌型處理相關算法(中)——牌型判定


牛牛的牌型按從小到大的順序分為:無牛<有牛<牛牛<銀牛<金牛<炸彈<五小牛。

 

算牛的方式為:先選出三張牌,若能組成十的整數倍 即為有牛,然后再看剩余兩張牌除以十的余數。余幾就是牛幾,若正好也能整除十,即為牛牛。若無法選出三張組成十的整數倍的牌即為無牛。

銀牛: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  



以上就是牌型判定相關的處理函數,下一章我們實現牌型比較的相關邏輯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM