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

lua——牛牛牌型处理相关算法(上)——牌值数据

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

这几天又做了牛牛游戏,在这里把相关算法写一下,与前几天写的赢三张的基本类似,所以大家也可以参考前几篇博客。

牛牛是一种简单却又非常有意思的棋牌游戏,主要是采用一副扑克牌其中的52张(除去大小王);第一局的庄家是随机产生,而后每局的庄家是上一轮游戏中的赢家,每局游戏系统自动洗牌后将5张牌均匀分给给各位玩家。玩家拿到牌后根据一定的游戏规则进行排列组合,庄家和闲家依次进行大小比较从而决定胜负。

 

牛牛的牌型比较里考虑到了花色的大小,即:

单牌比较: k>q>j>10>9>8>7>6>5>4>3>2>a。
花色比较:黑桃>红桃>梅花>方块。

同时不同的牌有一个算“牛”的数值含义,K Q J的数值是10,其他的等于自身数值。

所以为了方便计算,在定义牌信息类里面设三个参数,分别表示花色、牌值、数值

 

[plain] view plain copy
 
  1. CardColor =  
  2. {  
  3.     Spade = 4,         --黑桃  
  4.     Heart = 3,         --红桃  
  5.     Plum  = 2,         --梅花  
  6.     Block = 1,         --方块  
  7. }  
  8.   
  9. CardValue =  
  10. {  
  11.     card_A = 1,  
  12.     card_2 = 2,  
  13.     card_3 = 3,  
  14.     card_4 = 4,  
  15.     card_5 = 5,  
  16.     card_6 = 6,  
  17.     card_7 = 7,  
  18.     card_8 = 8,  
  19.     card_9 = 9,  
  20.     card_10 = 10,  
  21.     card_J = 11,  
  22.     card_Q = 12,  
  23.     card_K = 13,  
  24. }  
  25.   
  26. CardCount =  
  27. {  
  28.     card_A = 1,  
  29.     card_2 = 2,  
  30.     card_3 = 3,  
  31.     card_4 = 4,  
  32.     card_5 = 5,  
  33.     card_6 = 6,  
  34.     card_7 = 7,  
  35.     card_8 = 8,  
  36.     card_9 = 9,  
  37.     card_10 = 10,  
  38.     card_J = 10,  
  39.     card_Q = 10,  
  40.     card_K = 10,  
  41. }  

 

扑克的数据同样采用16进制双位数,一位表示花色,一位表示牌值

 

[plain] view plain copy
 
  1. --扑克数据  
  2. CardData=  
  3. {  
  4.     0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,  
  5.     0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,  
  6.     0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,  
  7.     0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,  
  8. }  
  9.   
  10. g_CardsCount            = 52     --扑克数目  
  11. g_PerPlaCardCount       = 5      --每个玩家牌数  


所以获取单牌信息的方法为:

 

[plain] view plain copy
 
  1. local cardColor = luabit.band(cardBuffer[i] , 0xF0)/16+1  
  2.   local cardValue = luabit.band(cardBuffer[i] , 0x0F)  
  3.   local cardCount = cardTool.getCountbyValue(cardValue)  
  4.   
  5.   local cardinfo =  
  6.   {  
  7.       card_value = cardValue,  
  8.       card_color = cardColor,  
  9.       card_count = cardCount,  
  10.   }  

 

[plain] view plain copy
 
  1. function cardTool.getCountbyValue(value)  
  2.     if value > 10 then  
  3.         return 10  
  4.     else  
  5.         return value  
  6.     end  
  7. end  


洗牌:

 

[plain] view plain copy
 
  1. function cardTool.RandCardList()  
  2.   
  3.     local bufferCount = #CardData;  
  4.     local randCount = 1;  
  5.     local position = 1;  
  6.   
  7.   
  8.     math.randomseed(os.time())   
  9.   
  10.   
  11.           
  12.     for i = 1,#CardData do  
  13.         local ranOne = math.random(1,#CardData+1-i)  
  14.         CardData[ranOne], CardData[#CardData+1-i] = CardData[#CardData+1-i],CardData[ranOne]  
  15.     end  
  16.   
  17.     local cardBuffer = tabletool.deepcopy(CardData);  
  18.     return cardBuffer;  
  19. end  


发牌:

 

 

[plain] view plain copy
 
  1. local cardBuffer =cardTool.RandCardList()  
  2.   
  3. --[[  
  4. cardBuffer[1]=2  
  5. cardBuffer[2]=4+16  
  6. cardBuffer[3]=6  
  7. cardBuffer[4]=10+16  
  8. cardBuffer[5]=12+32  
  9.   
  10. cardBuffer[6]=6+48  
  11. cardBuffer[7]=7+16  
  12. cardBuffer[8]=9  
  13. cardBuffer[9]=10+32  
  14. cardBuffer[10]=12+48  
  15. ]]  
  16.   
  17. local cards1={}  
  18. local cards2={}  
  19.   
  20. for i=1,10,1 do  
  21.     local cardColor = luabit.band(cardBuffer[i] , 0xF0)/16+1  
  22.     local cardValue = luabit.band(cardBuffer[i] , 0x0F)  
  23.     local cardCount = cardTool.getCountbyValue(cardValue)  
  24.   
  25.     local cardinfo =  
  26.     {  
  27.         card_value = cardValue,  
  28.         card_color = cardColor,  
  29.         card_count = cardCount,  
  30.     }  
  31.     if i >5 then  
  32.         cards2[i-5] = cardinfo  
  33.     else  
  34.         cards1[i] = cardinfo  
  35.     end  
  36.   
  37.   
  38. end  



两个cards的数据为:

 

[plain] view plain copy
 
  1. table: 0072B4F8 {  
  2.   [1] => table: 0072B4F8 {  
  3.            [card_color] => 2  
  4.            [card_value] => 3  
  5.            [card_count] => 3  
  6.          }  
  7.   [2] => table: 0072B4F8 {  
  8.            [card_color] => 2  
  9.            [card_value] => 6  
  10.            [card_count] => 6  
  11.          }  
  12.   [3] => table: 0072B4F8 {  
  13.            [card_color] => 3  
  14.            [card_value] => 6  
  15.            [card_count] => 6  
  16.          }  
  17.   [4] => table: 0072B4F8 {  
  18.            [card_color] => 3  
  19.            [card_value] => 1  
  20.            [card_count] => 1  
  21.          }  
  22.   [5] => table: 0072B4F8 {  
  23.            [card_color] => 2  
  24.            [card_value] => 7  
  25.            [card_count] => 7  
  26.          }  
  27. }  
  28.   
  29. table: 0072B520 {  
  30.   [1] => table: 0072B520 {  
  31.            [card_color] => 2  
  32.            [card_value] => 9  
  33.            [card_count] => 9  
  34.          }  
  35.   [2] => table: 0072B520 {  
  36.            [card_color] => 2  
  37.            [card_value] => 11  
  38.            [card_count] => 10  
  39.          }  
  40.   [3] => table: 0072B520 {  
  41.            [card_color] => 2  
  42.            [card_value] => 13  
  43.            [card_count] => 10  
  44.          }  
  45.   [4] => table: 0072B520 {  
  46.            [card_color] => 2  
  47.            [card_value] => 8  
  48.            [card_count] => 8  
  49.          }  
  50.   [5] => table: 0072B520 {  
  51.            [card_color] => 3  
  52.            [card_value] => 13  
  53.            [card_count] => 10  
  54.          }  
  55. }  


我们写一个牌的翻译函数

 

[plain] view plain copy
 
  1. function cardTool.getCardNamebyCard(Card)  
  2.   
  3.     local string=""  
  4.     if Card.card_color ==4 then  
  5.         string=string.."黑桃"  
  6.     elseif Card.card_color ==3 then  
  7.         string=string.."红桃"  
  8.     elseif Card.card_color ==2 then  
  9.         string=string.."梅花"  
  10.     elseif Card.card_color ==1 then  
  11.         string=string.."方块"  
  12.     else  
  13.         string="ERROR"  
  14.     end  
  15.   
  16.     if Card.card_value==13 then  
  17.         string=string.."K"  
  18.     elseif Card.card_value==12 then  
  19.         string=string.."Q"  
  20.     elseif Card.card_value==11 then  
  21.         string=string.."J"  
  22.     else  
  23.          string=string..Card.card_value  
  24.     end  
  25.     return string  
  26. end  
  27.   
  28. function cardTool.getCardNamebyCards(Cards)  
  29.     local string=""  
  30.     for i = 1,#Cards do  
  31.        string=string..cardTool.getCardNamebyCard(Cards[i])  
  32.     end  
  33.     return string  
  34. end  

 

上述牌信息转换的牌为:

 

[plain] view plain copy
 
  1. 梅花3梅花6红桃6红桃1梅花7  
  2.   
  3. 梅花9梅花J梅花K梅花8红桃K  



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

 


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
使用openresty+lua搭建api网关(一)安装openresty,并添加lua模块发布时间:2022-07-22
下一篇:
TinyXML与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