哇,很久很久沒寫東西啦。。。git
這兩天實現了一個簡單的遊戲引擎,能夠發牌,能夠比較兩手牌的大小github
這階段事後準備用這個引擎來實現一個簡單的AI對戰,如今先記錄一下,實現方面我用的是GO語言算法
接下來我假設你已經懂遊戲規則和俗語了數組
首先是牌的儲存,2~~A,一共13張牌,我用的是一個14位的二進制區間來儲存的,好比2-A,將表示爲:11111111111110,辣麼第一位是幹啥的呢,請繼續看下面排序
這樣的儲存方式除了省空間外還有什麼優點呢?咱們順子的判斷爲例:
例如順子10JQKA,在二進制區間將表示爲11111000000000,叫它S
如今咱們有手牌2 3 10 J Q K A,那麼它的二進制表示是11111000000110,叫它T
那麼T&S==S的話,就能夠說明T包含一個順子,而且順子是10JQKA
S轉化爲10進制的話是15872
相似的咱們將全部可能的順子預先保存好,以下表(10用T表示):three
----------------------------------------------------------------------------------------------------遊戲
TJQKA | 9TJQK | 89TJQ | 789TJ | 6789T | 56789 | 45678 | 34567 | 23456 | A2345 |get
15872 | 7936 | 3968 | 1984 | 992 | 496 | 248 | 124 | 62 | 31 |源碼
-----------------------------------------------------------------------------------------------------it
因爲德州撲克裏面A 2 3 4 5是最小的順子,如今你能夠明白二進制區間裏第0位的做用了,和最高位同樣也是保存A
咱們維護一個容量爲4的int數組straight,它表示四個花色中每種花色的牌,儲存原理見開頭,它將被用來快速的判斷同花順,同時還能夠用來判斷是否爲同花
再維護一個int變量hand,它表示全部手牌的並集,不分花色。它將被用來快速的判斷是否爲順子
最後維護一個容量爲13的int數組count,它用於對每種牌值出現的次數計數
咱們將全部牌型作一個分級:
皇家同花順:10
同花順 :9
四條 :8
葫蘆 :7
同花 :6
順子 :5
三條 :4
兩對 :3
一對 :2
高牌 :1
比較的時候先比較兩手牌的等級,等級相同的狀況下,咱們進一步分析每一副手牌的value值。
個人value的算法以下:
對你的手牌進行排序,排序規則是出現次數多的優先,次數相同的則值大的優先,好比:
7 8 4 2 2 A K,排序後爲:22AK874,能夠理解爲16進制:0x22AD874。
須要注意的是,順子和同花不適應此算法,順子的value就是該順子的最高牌;同花的value是該花色的牌並集(具體讀者能夠本身思考)
各類牌型的判斷以及比較:
一、皇家同花順 royal flush
這個最簡單了,直接用四個花色的牌集(詳見straight數組),去和15872相與便可(原理見上)
一場牌局只可能出現惟一皇家同花順,因此只須要記錄等級便可,由於只可能win or tie(五張公牌)
二、同花順straight flush
和皇家同花順相似,從大到小遍歷全部可能的順子,和它們作與操做。value值是該順子中最大的高牌
三、四條 four of a kind
維護一個數組count []int用於對每一種牌值進行計數便可。
還有一種方法是將四種花色的牌集相與,最後二進制區間內仍是1的那些就是咱們要的。
四、葫蘆 full house
經過count數組先遍歷有沒有出現三次的,有的話,再遍歷有沒有出現2次的
五、同花 flush
有兩個方法,一個是對每個花色的牌集進行遍歷,看看二進制集合裏有沒有5個1
第二個方法詳見代碼,判斷同花的邏輯處
六、順子 straight
取全部花色牌的集合,去和全部可能的順子作與操做
七、三條 three of a kind;兩對 two pairs; 一對 one pair
運用count數組計數器
源碼開源在github上:https://github.com/SongLiangChen/TexasHoldem.git