lua 牛牛牌型處理相關演算法(上) 牌值資料

2021-09-07 18:41:50 字數 4155 閱讀 4167

這幾天又做了牛牛遊戲,在這裡把相關演算法寫一下,與前幾天寫的贏三張的基本類似,所以大家也可以參考前幾篇部落格。

牛牛是一種簡單卻又非常有意思的棋牌遊戲,主要是採用一副撲克牌其中的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張牌均勻分給給各位玩家。玩家拿到牌後根據一定的遊戲規則進行排列組合,莊家和閒家依次進行大小比較從而決定勝負。牛牛的牌型比較裡考慮...