德州撲克想必很多人都玩過,當然對于新手需要說明的是,德州指的是德克薩斯州,而不是山東德州。
這幾個月一直在做一個德州撲克的伺服器,分享下在計算最大牌型,比牌邏輯的算法和洗牌的方法,希望對大家有幫助。
首先我們定義一下poker類
這裡說明下,abcd代表四種不同的花色,2-16代表不同的牌面,a用14代替,我想不用多解釋吧!
首先是洗牌這塊,我們奔着不重複造輪子的思想,借用collections.shuffle(list)接口,去将52張牌打亂順序,然後随機随機抽取。
首先是,擷取每個玩家的最大牌型,即從n張撲克中取出5張最大的,我們從n張牌中抽出5張牌,有n多種算法,這裡給出一個算法
在取得所有可能的組合之後,我們從這些組合中得到最大的一副手牌。為了得到最大的一副手牌,我們計算每付(五張牌)手牌的大小。首先對這五張牌進行排序,從大到小,手牌的大小為一個long整形的數,手牌等級占兩位(比如高牌為10,一對為11,二兩為12,以此類推),五張撲克,每張撲克的數值占兩位,是以手牌的大小是一個12位的整數,
比如圖1.2的一副牌
手牌等級
第一張牌
第二張牌
第三張牌
第四張牌
第五張牌
10
a(a)
u(b)
10(c)
9(d)
7(c)
圖1.2
這副手牌的大小為 101412100907
需要注意的是,在遇到有對子的是情況,無論是兩對還是三雙,都要進行特殊排序,葫蘆和三雙的情況下,要把三個一樣的大的牌排到前面,然後再排對子,這樣才能保證在比較牌大小的情況下,正确比較出大小。還有就是在遇到a2345這樣的順子的情況下,要講a排在最後,因為34567的順子是比a2345大的。當然這兩種情況是屬于比較特殊情況,需要特别處理。
對應程式的算法為:
首先計算手牌的等級,如果是順子或者同花就不用說了,對子三雙葫蘆起始是相對比較難比較的,這裡給出一個算法,
this.level即牌型, 就是這樣計算出來的,然後就是計算這副手牌的大小了!
剩下的就是對所有的情況,進行排序;所有玩家比較的時候,也是這樣的情況!
希望對大家有幫助。