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

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

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

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

单牌比较: k>q>j>10>9>8>7>6>5>4>3>2>a。

花色比较:黑桃>红桃>梅花>方块。

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

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

[plain]view plaincopy

  1. CardColor =
  2. {
  3. Spade = 4, --黑桃
  4. Heart = 3, --红桃
  5. Plum = 2, --梅花
  6. Block = 1, --方块
  7. }
  8. CardValue =
  9. {
  10. card_A = 1,
  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. }
  24. CardCount =
  25. {
  26. card_A = 1,
  27. card_2 = 2,
  28. card_3 = 3,
  29. card_4 = 4,
  30. card_5 = 5,
  31. card_6 = 6,
  32. card_7 = 7,
  33. card_8 = 8,
  34. card_9 = 9,
  35. card_10 = 10,
  36. card_J = 10,
  37. card_Q = 10,
  38. card_K = 10,
  39. }

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

[plain]view plaincopy

  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. g_CardsCount = 52 --扑克数目
  10. g_PerPlaCardCount = 5 --每个玩家牌数

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

[plain]view plaincopy

  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. local cardinfo =
  5. {
  6. card_value = cardValue,
  7. card_color = cardColor,
  8. card_count = cardCount,
  9. }

[plain]view plaincopy

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

洗牌:

[plain]view plaincopy

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

发牌:

[plain]view plaincopy

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

两个cards的数据为:

[plain]view plaincopy

  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. table: 0072B520 {
  29. [1] => table: 0072B520 {
  30. [card_color] => 2
  31. [card_value] => 9
  32. [card_count] => 9
  33. }
  34. [2] => table: 0072B520 {
  35. [card_color] => 2
  36. [card_value] => 11
  37. [card_count] => 10
  38. }
  39. [3] => table: 0072B520 {
  40. [card_color] => 2
  41. [card_value] => 13
  42. [card_count] => 10
  43. }
  44. [4] => table: 0072B520 {
  45. [card_color] => 2
  46. [card_value] => 8
  47. [card_count] => 8
  48. }
  49. [5] => table: 0072B520 {
  50. [card_color] => 3
  51. [card_value] => 13
  52. [card_count] => 10
  53. }
  54. }

我们写一个牌的翻译函数

[plain]view plaincopy

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

上述牌信息转换的牌为:

[plain]view plaincopy

  1. 梅花3梅花6红桃6红桃1梅花7
  2. 梅花9梅花J梅花K梅花8红桃K

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