1. 程式人生 > >麻將胡牌演算法

麻將胡牌演算法

用數字代替麻將中的所有牌:

一萬~九萬    1~9

一筒~九筒    11~19

一條~九條    21~29

東、南、西、北、中、發、白    31~37

胡牌的種類:對對胡、十三么和33332

判斷胡牌的過程(以下所說的規則,都是針對手牌已經按從小到大的順序排序):

1、首先判斷手牌的總數是否為3n+2,如果不是肯定不是胡牌。

2、先從特殊的下手,如果手牌為14張的時候,就有可能是“對對胡”或者“十三么”,先判斷是否為這兩種特殊胡牌,如果不是,再繼續下面的判斷。排除特殊情況,那麼要胡,就只能是“33332”。

3、遍歷所有的手牌,找到一種牌的數量>=2的,那麼“33332”中的“2”就有可能從這種牌中抽取2張作為這個“2”,然後把這2張去掉,剩下的手牌就是3n張,再判斷剩下的3n張牌是否能組成順子或者是暗刻,如果可以全部組成,那麼說明這牌就胡了。否則需要找下一種牌當成“2”,再重複上面的判斷,直到找到為止,找不到就是不胡啦。

判斷剩下的3n張牌是否能組成順子或者是暗刻,是通過判斷第一種牌的數量:

①如果是1張或2張,要胡牌的話,它必須和後面的牌組成順子,否自不能胡。如果可以,將組成順子的牌移除,接著處理剩下的牌。

②如果是3張,要胡牌有兩種可能,一種是把3張當做是暗刻,另一種是這3張都與後面的牌組成順子。如果只是判斷胡不胡牌,這兩種任意一種都是一樣的,如果要計算分數,就要自己分開算了。

③如果是4張,要胡牌的話,有1張要和後面的牌組成順子,剩下的3張牌又可以繼續②操作。

整個過程可以通過函式的遞迴呼叫,每次處理一張,如果不能湊成順子或者暗刻就不能胡,直接返回錯誤,如果可以則繼續判斷,直到牌數為0,則就是胡了,返回成功即可。