這幾天又做了牛牛遊戲,在這裡把相關演算法寫一下,與前幾天寫的贏三張的基本類似,所以大家也可以參考前幾篇部落格。
牛牛是一種簡單卻又非常有意思的棋牌遊戲,主要是採用一副撲克牌其中的52張(除去大小王);第一局的莊家是隨機產生,而後每局的莊家是上一輪遊戲中的贏家,每局遊戲系統自動洗牌後將5張牌均勻分給給各位玩家。玩家拿到牌後根據一定的遊戲規則進行排列組合,莊家和閒家依次進行大小比較從而決定勝負。
牛牛的牌型比較裡考慮到了花色的大小,即:
單牌比較: k>q>j>10>9>8>7>6>5>4>3>2>a。
花色比較:黑桃》紅桃》梅花》方塊。
同時不同的牌有乙個算「牛」的數值含義,k q j的數值是10,其他的等於自身數值。
所以為了方便計算,在定義牌資訊類裡面設三個引數,分別表示花色、牌值、數值
[plain]view plain
copy
cardcolor =
cardvalue =
cardcount =
撲克的資料同樣採用16進製制雙位數,一位表示花色,一位表示牌值
[plain]view plain
copy
--撲克資料
carddata=
g_cardscount = 52 --撲克數目
g_perplacardcount = 5 --每個玩家牌數
所以獲取單牌資訊的方法為:
[plain]view plain
copy
local cardcolor = luabit.band(cardbuffer[i] , 0xf0)/16+1
local cardvalue = luabit.band(cardbuffer[i] , 0x0f)
local cardcount = cardtool.getcountbyvalue(cardvalue)
local cardinfo =
[plain]view plain
copy
function cardtool.getcountbyvalue(value)
if value > 10 then
return 10
else
return value
end
end
洗牌:[plain]view plain
copy
function cardtool.randcardlist()
local buffercount = #carddata;
local randcount = 1;
local position = 1;
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 = tabletool.deepcopy(carddata);
return cardbuffer;
end
發牌:[plain]view plain
copy
local cardbuffer =cardtool.randcardlist()
--[[
cardbuffer[1]=2
cardbuffer[2]=4+16
cardbuffer[3]=6
cardbuffer[4]=10+16
cardbuffer[5]=12+32
cardbuffer[6]=6+48
cardbuffer[7]=7+16
cardbuffer[8]=9
cardbuffer[9]=10+32
cardbuffer[10]=12+48
]]
local cards1={}
local cards2={}
for i=1,10,1 do
local cardcolor = luabit.band(cardbuffer[i] , 0xf0)/16+1
local cardvalue = luabit.band(cardbuffer[i] , 0x0f)
local cardcount = cardtool.getcountbyvalue(cardvalue)
local cardinfo =
if i >5 then
cards2[i-5] = cardinfo
else
cards1[i] = cardinfo
end
end
兩個cards的資料為:
[plain]view plain
copy
table: 0072b4f8
[2] => table: 0072b4f8
[3] => table: 0072b4f8
[4] => table: 0072b4f8
[5] => table: 0072b4f8
} table: 0072b520
[2] => table: 0072b520
[3] => table: 0072b520
[4] => table: 0072b520
[5] => table: 0072b520
}
我們寫乙個牌的翻譯函式
[plain]view plain
copy
function cardtool.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 cardtool.getcardnamebycards(cards)
local string=""
for i = 1,#cards do
string=string..cardtool.getcardnamebycard(cards[i])
end
return string
end
上述牌資訊轉換的牌為:
[plain]view plain
copy
梅花3梅花6紅桃6紅桃1梅花7
梅花9梅花j梅花k梅花8紅桃k
lua 牛牛牌型處理相關演算法(下) 牌型比較
牛牛的比牌規則為 單牌比較 k q j 10 9 8 7 6 5 4 3 2 a。花色比較 黑桃 紅桃 梅花 方塊。牌型比較 無牛 有牛 牛牛 銀牛 金牛 炸彈 五小牛。無牛牌型比較 取其中最大的一張牌比較大小,牌大的贏,大小相同比花色。有牛牌型比較 比牛數 牛數相同莊吃閒。牛牛牌型比較 取其中最大...
lua 牛牛牌型處理相關演算法(下) 牌型比較
牛牛的比牌規則為 單牌比較 k q j 10 9 8 7 6 5 4 3 2 a。花色比較 黑桃 紅桃 梅花 方塊。牌型比較 無牛 有牛 牛牛 銀牛 金牛 炸彈 五小牛。無牛牌型比較 取其中最大的一張牌比較大小,牌大的贏,大小相同比花色。有牛牌型比較 比牛數 牛數相同莊吃閒。牛牛牌型比較 取其中最大...
lua 牛牛牌型處理相關演算法(上) 牌值資料
牛牛是一種簡單卻又非常有意思的棋牌遊戲,主要是採用一副撲克牌其中的52張 除去大小王 第一局的莊家是隨機產生,而後每局的莊家是上一輪遊戲中的贏家,每局遊戲系統自動洗牌後將5張牌均勻分給給各位玩家。玩家拿到牌後根據一定的遊戲規則進行排列組合,莊家和閒家依次進行大小比較從而決定勝負。牛牛的牌型比較裡考慮...