棋牌麻將 無癩子胡牌演算法

2021-08-11 11:51:58 字數 1935 閱讀 1589

本文涉及的所有名詞均在博文中有說明:

去除雜念: 由於字牌中只只允許出現對子刻子, 所以單獨處理字牌.

返璞歸真: 萬/筒/條牌等序數牌處理除了花色不同其他規則一致, 所以忽略序數牌花色進行處理.

分而治之: 序數牌中存在關係的牌必須是連續的, 不連續的牌之間不會存在關係, 所以對連續牌進行分片.

各司其職: 單一分片能滿足胡牌的部分,要麼是 (不帶將), 要麼是 (帶將), 中的的牌不是三張牌一樣的刻子,就是三張連續牌的順子, 如: 1筒2筒3筒 1萬1萬1萬, 通過此規則對分片進行歸類.

各行其政: 針對 和 分片單獨處理

統計手牌中所有字牌的牌個數, 牌個數必須為 2 或者 3, 出現其他則無法胡牌.

所有字牌都不是連續牌, 不能出現順子, 只允許出現對子刻子.

移除字牌中牌個數為 2 和 3 的牌並統計相應的對子刻子.

將手牌中序數牌按花色以及牌個數進行歸表並記錄表中牌的總個數. (注意: 下文中出現的 牌錶 一詞均指此表.)

此處用萬舉例, 其他花色結果一樣:

遍歷所有 牌錶, 並對牌錶中牌個數為 4 的牌移除乙個刻子, 牌個數更改為 1.

對 牌錶 進行分類, 牌個數滿足 的歸一組, 滿足 的歸一組. 出現不屬於兩組內的則無法胡牌.

單一花色能滿足胡牌的部分,要麼是 (不帶將), 要麼是 (帶將), 中的的牌不是三張牌一樣的刻子,就是三張連續牌的順子, 如: 1筒2筒3筒 1萬1萬1萬

注意: 若字牌中不存在對子(將), 一副牌中 只能並且必須存在乙個, 所以 == 1, 否則 == 0)

對 表按零元素進行分片並統計分片牌個數, 對滿足 的計入 , 出現不滿足的則無法胡牌.

如表: 112110114(12) 最終切分為兩個分片, 分別是 11211(6) 和 114(6)

對 +2 表按零元素進行分片並統計分片牌個數, 分別計入 和 , 出現不滿足的則無法胡牌.

如表: 1221001142(14) 最終切分為兩個分片, 分別是 1221(6) 和 1142(8)

遍歷所有 分片, 去除所有牌個數為 3 的元素, 移除所有的刻子.

遍歷所有 分片, 判斷開頭結尾是否為 2, 為 2 則連續個數必須被 3 整除, 不能整除則無法胡牌.

遍歷所有 分片, 判斷開頭結尾是否為 1, 若為 1 則嘗試在此處移除乙個順子, 移除失敗則無法胡牌.

若上面 2 步任一執行成功, 則重新執行上面 2 步, 若上面 2 步全都沒有執行成功而且還有餘牌則當前牌無法胡牌.

遍歷所有 分片, 移除分片中牌個數全部為 3 的分片.

遍歷所有 分片, 移除所有開頭結尾的 2, 如果為連續的 2 則移除所有連續 2.

遍歷所有 分片, 判斷開頭結尾是否為 1, 若為 1 則嘗試在此處移除乙個順子, 移除失敗則無法胡牌.

遍歷所有 分片, 判斷開頭結尾是否為 3, 若為 3 則嘗試在此處硬解, 解牌失敗則無法胡牌.

若上面 3 步任一執行成功, 則重新執行上面 3 步, 若上面 3 步全都沒有執行成功而且還有餘牌則當前牌無法胡牌.

從開始出依次處理當前牌, 出現 2 跳過, 出現其他牌則認為此處為起點.

從起點處嘗試移除乙個順子, 移除成功向後跳到牌個數大於 1 的位置重新執行步驟 1.

若步驟 2 失敗, 判斷起點處是否為 1, 為 1 則無法胡牌. 不為 1 則起點向下移動一位重新執行步驟 2.

麻將胡牌演算法,帶癩子

貌似去年去面試一家公司,問了麻將的演算法。雖然之前做過廣東麻將,但是胡牌演算法在服務端,就沒有在意。現在在網上搜了一些演算法試了試 麻將普通的胡牌就是刻子 順子 將。癩子可以充當任意一張牌。網上蒐羅的演算法,先取將牌,然後遞迴判斷剩下的牌是否能組成刻子或順子。public canhulaizi ca...

癩子麻將胡牌判斷

牌值 var cardvalue 1,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,21,22,23,24,25,26,27,28,29,31,41,51,61,71,81,91 定撲 function ispu cards,laizinum 順子判斷 var...

麻將胡牌演算法

majiang algorithm是帶多張鬼牌的通用胡牌演算法,採用查表方式,簡單高效。在生成表的階段,時間是不值錢的,所以生成方法我們可以任意窮舉。首先分為普通 風 箭三張表。窮舉出所有的key,比如普通表,就是000000000 444420000,因為每一種牌最大4張,且總和不超過14張牌。對...