一直学一直嗨,一直嗨一直学

lua 牛牛算法

最近在写棋牌游戏,写了一个牛牛的算法,在这里分享给大家! 部分代码参考了网上的!

main.lua

#!/usr/local/bin/lua    local card = require("card")  local bit = require("bit")    local cardBuffer = card.RandCardList()    local cards1 = {}  local cards2 = {}  local cards3 = {}  local cards4 = {}    for i = 1, 20, 1 do        local cardColor = bit.band(cardBuffer[i], 0xF0) / 16 + 1      local cardValue = bit.band(cardBuffer[i], 0x0F)      local cardCount = card.getCountByValue(cardValue)        local cardInfo = {          card_value = cardValue,          card_color = cardColor,          card_count = cardCount      }        if i <= 5 then          cards1[i] = cardInfo      elseif i > 5 and i <= 10 then          cards2[i - 5] = cardInfo      elseif i > 10 and i <= 15 then          cards3[i - 10] = cardInfo      elseif i > 15 and i <= 20 then          cards4[i - 15] = cardInfo      elseif i > 20 and i <= 25 then          cards5[i - 20] = cardInfo      end  end    print("庄家牌:", card.getCardNameByCards(cards1))  print("庄家牛牛类型:", card.getCardTypeNameByType(card.getTypeByCards(cards1)))    print("------------------------------------")    print("闲1牌:", card.getCardNameByCards(cards2))  print("闲1牛牛类型:", card.getCardTypeNameByType(card.getTypeByCards(cards2)))    print("------------------------------------")    print("闲2牌:", card.getCardNameByCards(cards3))  print("闲2牛牛类型:", card.getCardTypeNameByType(card.getTypeByCards(cards3)))    print("------------------------------------")    print("闲3牌:", card.getCardNameByCards(cards4))  print("闲3牛牛类型:", card.getCardTypeNameByType(card.getTypeByCards(cards4)))    print("------------------------------------")    print("闲4牌:", card.getCardNameByCards(cards5))  print("闲4牛牛类型:", card.getCardTypeNameByType(card.getTypeByCards(cards5)))  

card.lua

card = {}    -- 花色  CardColor = {      Spade = 4, --黑桃      Heart = 3, --红桃      Plum = 2, --梅花      Block = 1, --方块  }    -- 牌型  CardType = {      NOT_NIU = 0, --没牛      NIU_1 = 1, --牛一      NIU_2 = 2, --牛二      NIU_3 = 3, --牛三      NIU_4 = 4, --牛四      NIU_5 = 5, --牛五      NIU_6 = 6, --牛六      NIU_7 = 7, --牛七      NIU_8 = 8, --牛八      NIU_9 = 9, --牛九      NIU_NIU = 10, --牛牛      SILVER_NIU = 11, --银牛      GOLD_NIU = 12, --金牛      BOMB = 13, --炸弹      SMALL_NIU = 14, --五小牛  }    -- 所有的扑克牌  CardValue = {      card_A = 1,      card_2 = 2,      card_3 = 3,      card_4 = 4,      card_5 = 5,      card_6 = 6,      card_7 = 7,      card_8 = 8,      card_9 = 9,      card_10 = 10,      card_J = 11,      card_Q = 12,      card_K = 13,  }    --扑克数据  CardData = {      0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,      0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,      0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D,      0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,  }    function card.getCountByValue(value)      if value > 10 then          return 10      else          return value      end  end    function card.getCardNameByCard(Card)        local string = ""      if Card.card_color == 4 then          string = string .. "黑桃"      elseif Card.card_color == 3 then          string = string .. "红桃"      elseif Card.card_color == 2 then          string = string .. "梅花"      elseif Card.card_color == 1 then          string = string .. "方块"      else          string = "ERROR"      end        if Card.card_value == 13 then          string = string .. "K"      elseif Card.card_value == 12 then          string = string .. "Q"      elseif Card.card_value == 11 then          string = string .. "J"      else          string = string .. Card.card_value      end      return string  end    function card.getCardNameByCards(Cards)      local string = ""      for i = 1, #Cards do          string = string .. card.getCardNameByCard(Cards[i])      end      return string  end    -- 洗牌  function card.RandCardList()        math.randomseed(os.time())        for i = 1, #CardData do          local ranOne = math.random(1, #CardData + 1 - i)          CardData[ranOne], CardData[#CardData + 1 - i] = CardData[#CardData + 1 - i], CardData[ranOne]      end        local cardBuffer = card.deepCopy(CardData);        return cardBuffer;  end    function card.deepCopy(orig)      local orig_type = type(orig)      local copy      if orig_type == 'table' then          copy = {}          for orig_key, orig_value in next, orig, nil do              copy[card.deepCopy(orig_key)] = card.deepCopy(orig_value)          end          setmetatable(copy, card.deepCopy(getmetatable(orig)))      else          -- number, string, boolean, etc          copy = orig      end      return copy  end    function card.compByCardsValue(a, b)        if a.card_value < b.card_value then          return true      end        if a.card_value > b.card_value then          return false      end        return a.card_color < b.card_color  end    function card.sortByCardsValue(cards)      table.sort(cards, card.compByCardsValue);  end    function card.is_small_niu(cards)      local sum = 0      for i = 1, #cards do          sum = sum + cards[i].card_count      end      if sum <= 10 then          return true      else          return false      end  end    function card.is_bomb(cards)        if cards[1].card_value == cards[4].card_value then          return true      elseif cards[2].card_value == cards[5].card_value then          return true      else          return false      end  end    function card.is_gold_niu(cards)      if cards[1].card_value > 10 then          return true      else          return false      end  end    function card.is_silver_niu(cards)      if cards[2].card_value > 10 and cards[1].card_value == 10 then          return true      else          return false      end  end    function card.getNiuByCards(cards)      local lave = 0     --余数      for i = 1, #cards do          lave = lave + cards[i].card_count      end      lave = lave % 10      for i = 1, #cards - 1 do          for j = i + 1, #cards do              if (cards[i].card_count + cards[j].card_count) % 10 == lave then                  if lave == 0 then                      return 10                  else                      return lave                  end              end          end      end        return 0  end    function card.getTypeByCards(cards)        card.sortByCardsValue(cards)      local cardType = CardType.NOT_NIU        if card.is_small_niu(cards) then          cardType = CardType.SMALL_NIU          return cardType      end      if card.is_bomb(cards) then          cardType = CardType.BOMB          return cardType      end      if card.is_gold_niu(cards) then          cardType = CardType.GOLD_NIU          return cardType      end      if card.is_silver_niu(cards) then          cardType = CardType.SILVER_NIU          return cardType      end        cardType = card.getNiuByCards(cards)        return cardType  end    function card.getCardTypeNameByType(CardType)      if CardType == 0 then          return "没牛"      end      if CardType == 1 then          return "牛一"      end      if CardType == 2 then          return "牛二"      end      if CardType == 3 then          return "牛三"      end      if CardType == 4 then          return "牛四"      end      if CardType == 5 then          return "牛五"      end      if CardType == 6 then          return "牛六"      end      if CardType == 7 then          return "牛七"      end      if CardType == 8 then          return "牛八"      end      if CardType == 9 then          return "牛九"      end      if CardType == 10 then          return "牛牛"      end      if CardType == 11 then          return "银牛"      end      if CardType == 12 then          return "金牛"      end      if CardType == 13 then          return "炸弹"      end      if CardType == 14 then          return "五小牛"      end      return "异常牌型"    end    function card.bankerIsWin(banker_Cards, other_Cards)      local banker_Cards_Type = card.getTypeByCards(banker_Cards)      local other_Cards_Type = card.getTypeByCards(other_Cards)        if banker_Cards_Type ~= other_Cards_Type then          return banker_Cards_Type > other_Cards_Type      end        if banker_Cards_Type == CardType.SMALL_NIU then          return true      end        if banker_Cards_Type == CardType.BOMB then          return banker_Cards[3].card_value > other_Cards[3].card_value      end        if banker_Cards_Type == CardType.GOLD_NIU then          return card.compByCardsValue(other_Cards[5], banker_Cards[5])      end      if banker_Cards_Type == CardType.SILVER_NIU then          return card.compByCardsValue(other_Cards[5], banker_Cards[5])      end      if banker_Cards_Type == CardType.NIU_NIU then          return card.compByCardsValue(other_Cards[5], banker_Cards[5])      end      if banker_Cards_Type == CardType.NOT_NIU then          return card.compByCardsValue(other_Cards[5], banker_Cards[5])      end        return true  end    return card  

原文出处:segmentfault -> https://segmentfault.com/a/1190000019696387