先大致介紹一下麻將規則:
各地的麻將有各自的特色,規則上有許多差異。
麻將牌有條子、筒子、萬子,分別從1到9各4張。
一條、二條、...九條
一筒、二筒、...九筒
一萬、二萬、...九萬
"東南西北中發白"字牌各4張
有的麻將還有花牌"春夏秋冬梅蘭竹菊"各1張
共計144張牌。
玩家有一手牌3n+1張(n為0,1,2...)。
根據13張麻將和16張麻將的玩法n的上限不同,分別為4和5。
一手牌再加上別家打出的一張牌或者自己摸進的一張牌,組成3n+2張牌可以判斷是否胡牌。
基本牌型分為刻、順、杠、將。
刻是3張同樣的牌。
順是3張同一花色連號的條子、筒子或萬子。
將是2張同樣的牌。
杠是4張同樣的牌(由于杠牌時會補一張牌,所以玩家手牌數量仍然是3n+1張)
吃牌、碰牌、杠牌
吃牌是取上家打出的牌和自己的牌組成順。
碰牌是取別家打出的牌和自己的牌組成刻。
杠牌是取別家打出的牌或者自己摸到的牌和自己的牌組成杠。
吃碰的玩家不摸牌,但仍然需要打出一張。
杠牌的玩家需要補一張牌,并仍然需要打出一張。
麻將一般4人圍成一桌,分為東南西北四家,輪流做莊。
游戲開始各自初始拿到一樣數目的牌(13張麻將拿13張,16張麻將拿16張)。
從上局贏家開始摸牌,摸一張牌打一張牌。
只有下家可以吃上家打出的牌,任何玩家都可以碰(或者杠)其他玩家打出的牌。
在游戲中,玩家需要想辦法使得牌型成為某一種胡牌的類型。
要胡牌,一般需要配成一將搭配若干個刻或者順。
(也有其他特殊類型的胡牌,不同類型胡牌有翻(或者臺)的累積。
翻數越高,贏得越多)
百搭麻將是一種有趣的變種。
許多麻將玩法中都有百搭牌的玩法。
游戲開始時一般通過骰子確定某張牌是百搭牌。
百搭牌可以根據需要替代任何牌參與組合。
但百搭牌不允許被打出。
現在需要大家寫一個函數判斷玩家否滿足胡牌條件。
為了簡化判斷,牌只出現條子、筒子、萬子和字牌。
并且牌數保證是3n+2張(手牌+1張牌),其中0<=n<=5。
預先吃、碰、杠的牌均不需要考慮。
胡牌只判斷3n+2張牌是否滿足一將搭配若干個刻或者順。
不需要計算翻(或者臺數)。
當有3張或4張百搭牌時,也直接算胡。
并且規定:
條子是 0x01到0x09
筒子是 0x11到0x19
萬子是 0x21到0x29
東南西北分別是0x30,0x40,0x50,0x60
中發白分別是0x70,0x80,0x90
百搭牌是0x00
當牌A被選擇為百搭牌時,白板(0x90)就轉為代替A牌。
可以參與刻、順、將的組合。
注意白板本身也可能會被選中為百搭牌。
調用時,白板已經被轉為百搭牌本身的牌,所以除非白板本身是百搭,否則參數中不會出現0x90。
bool TestHu(const char pai[], int count, char baida);
pai數組內保存了count個牌(已經按編碼由小到大排序)
TestHu函數需要返回true表示牌型可以胡牌。
否則返回false
baida是被選中的百搭牌。
下面舉幾個例子:
0x00, 0x01, 0x02, 0x03, 0x30, baida = 0x40,胡牌,順+將,百搭配將
0x00, 0x11, baida = 0x11,胡牌,將,百搭歸位(它配為它本身的牌,注意這里的0x10其實本來是白板)
0x01, 0x02, 0x03, 0x04, 0x05, baida = 0x50, 不胡,無百搭
0x01, 0x02, 0x03, 0x04, 0x04, baida = 0x50, 胡,無百搭,順+將
0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03,baida = 0x50, 胡,刻+順+將(其實此時有許多種搭配都可以)
0x00, 0x00, 0x00, 0x00, 0x01, 0x12, 0x23, 0x60, baida = 0x50, 胡,4百搭
百搭規則參考溫州麻將,我家這邊百搭規則和它不一樣,不過這個規則相對我家這邊的百搭規則容易一些
最后扯一下,麻將游戲消遣可以,賭博就不好了。