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

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

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

赢三张,我们东北管这个叫拖拉机。其他的几个名称是违规的。。

是一个简单粗暴的扑克牌(dubo)游戏。玩家每人三张牌,通过特定的牌型规则进行比大小。(押注什么的就不说了,具体详细规则请参考百度)

最近一直深陷在各种扑克玩法的牌型逻辑处理中,对比了一下,觉得赢三张应该算是比较简单的了,于是在这里写出一些牌型逻辑处理的算法。有些也适用于其他的扑克牌玩法。

注:语言为lua

 

首先是扑克牌的权值数据:对于这类花色有特殊意义的扑克玩法,一般常用的数据结构是采用16进制双位数,一位表示花色,一位表示牌值

例如:

 

[plain] view plain copy
 
  1. CardData=  
  2. {  
  3.     0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,   --黑桃 2 - A(14)  
  4.     0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,   --红桃 2 - A  
  5.     0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,   --樱花 2 - A  
  6.     0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,   --方块 2 - A  
  7. }  

 

然后使用位运算&可以方便的获取花色及牌值

lua语言里是band,需要导入bit模块。

即:

 

[plain] view plain copy
 
  1. luabit = require"bit"  
  2. local cardType = luabit.band(CardData[i] , 0xF0)  
  3. local cardVal = luabit.band(CardData[i] , 0x0F)  

 

 

得到的值对应的牌:

 

[plain] view plain copy
 
  1. CardColor =  
  2. {  
  3.     Spade = 0,         --黑桃  
  4.     Heart = 16,         --红桃  
  5.     Plum  = 32,         --梅花  
  6.     Block = 48,         --方块  
  7. }  
  8.   
  9. CardValue =  
  10. {  
  11.     card_2 = 2,  
  12.     card_3 = 3,  
  13.     card_4 = 4,  
  14.     card_5 = 5,  
  15.     card_6 = 6,  
  16.     card_7 = 7,  
  17.     card_8 = 8,  
  18.     card_9 = 9,  
  19.     card_10 = 10,  
  20.     card_J = 11,  
  21.     card_Q = 12,  
  22.     card_K = 13,  
  23.     card_A = 14,  
  24. }  


扎金花游戏没有大小王,故总牌数为52

 

[plain] view plain copy
 
  1. g_CardsCount            = 52     --扑克数目  
  2. g_PerPlaCardCount       = 3      --每个玩家牌数  


下面我们写出一个简单的洗牌发牌测试函数

 

 

洗牌:

 

[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]=6  
  5. --cardBuffer[2]=7+16  
  6. --cardBuffer[3]=7  
  7.   
  8. --cardBuffer[4]=5+16  
  9. --cardBuffer[5]=7+32  
  10. --cardBuffer[6]=7+48  
  11.   
  12.   
  13. local cards1={}  
  14. local cards2={}  
  15.   
  16. for i=1,6,1 do  
  17.     local cardColor = luabit.band(cardBuffer[i] , 0xF0)  
  18.     local cardValue = luabit.band(cardBuffer[i] , 0x0F)  
  19.   
  20.   
  21.     local cardinfo =  
  22.     {  
  23.         card_value = cardValue;  
  24.         card_Color = cardColor;  
  25.     }  
  26.     if i >3 then  
  27.         cards2[i-3] = cardinfo  
  28.     else  
  29.         cards1[i] = cardinfo  
  30.     end  
  31.   
  32.   
  33. end  


输出两组牌:

 

 

[plain] view plain copy
 
  1. table: 00444950 {  
  2.   [1] => table: 00444950 {  
  3.            [card_Color] => 48  
  4.            [card_value] => 2  
  5.          }  
  6.   [2] => table: 00444950 {  
  7.            [card_Color] => 16  
  8.            [card_value] => 9  
  9.          }  
  10.   [3] => table: 00444950 {  
  11.            [card_Color] => 0  
  12.            [card_value] => 14  
  13.          }  
  14. }  
  15.   
  16. table: 00444978 {  
  17.   [1] => table: 00444978 {  
  18.            [card_Color] => 32  
  19.            [card_value] => 2  
  20.          }  
  21.   [2] => table: 00444978 {  
  22.            [card_Color] => 32  
  23.            [card_value] => 4  
  24.          }  
  25.   [3] => table: 00444978 {  
  26.            [card_Color] => 32  
  27.            [card_value] => 12  
  28.          }  
  29. }  

 

 

为了方便查看结果,我们写个翻译函数

 

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

 

 

上文中两组牌即为:

 

[plain] view plain copy
 
  1. 方块2红桃9黑桃A  
  2.   
  3. 梅花2梅花4梅花Q  


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

 

 


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
lua解析赋值类型代码的过程发布时间:2022-07-22
下一篇:
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