麻将游戏中胡牌实现

  • 说起麻将,无论亲朋好友聚会,还是同学聚会,总是少不了麻将的声音。网络上各种各样的麻将游戏也非常的多,现在游戏公司正在做一款麻将游戏,其中判断是否胡牌的部分由你来完成。

麻将规则如下:

麻将只能包括3种类型:条,筒,万。没有“白门、东风、南风、西风、北风、、红中”。每种牌都是数字从1到9,每个数字有4张,共36张,筒,万,条均一样。

胡牌规则如下:

a) 手里面的牌最多只有两种类型,即必须打缺一种,不能出现:条,筒,万都存在的情况。

b) 必须有一个对子,即两张相同的牌,比如:两个2筒,两个4条等。

c) 剩余的牌,每3张需要凑成一个有效牌,比如:3个一样的牌(3个2筒),或者3个顺子(1条2条3条)。

如果所有的牌都能够凑好,再满足规则b和a,有一个对子,并且所有的牌只有两种,那么就可以胡牌了。

d) 有一种特殊牌,叫做七对,即全部的牌都是成对出现,比如:2筒2筒5筒5筒3筒3筒4条4条8条8条1条1条2条2条,

一共7对,再满足条件a,也可以胡牌。

e) 假设牌不会出现碰的情况,即手里面的牌是14张。输入数据肯定都是麻将牌,不用考虑会输入“白门”,“红中”“东风、南风、西风、北风”等牌。

要求实现函数:

bool IsMahjonggWin(char *pCards)

【输入】 char *pCards:参数说明:

假设:  

条子为:T,2条输入为:2T

筒子为:D,3筒输入为:3D

万子为:W,4万输入为:4W

pCards:输入麻将序列。比如:”1T2T2T2T3T7T8T9T5D4D7D8D8D8D”

【返回】 bool类型:如果能够胡牌,返回true;如果不能胡牌,返回false。

比如:“7T1T8T2T2T2T3T9T5D4D3D8D8D8D”可以转换成“1T2T3T2T2T 7T8T9T3D4D5D8D8D8D”,可以胡牌。

注意:需要考虑输入的合法性。输入的牌为字符串,字母为大写的”TDW”,请编码的时候注意。

示例

输入: “1D2D2D2D3D3D4D4D5D5D5D6D6D7D”,返回true

输入: “1D1D1D3D3D3D5D5D5D7D7D7D2W3W”,返回false

 

基本思路:

a.检查是否缺一门。
b.检查是否为7对牌型。
c.普通胡牌规则判断。(实际是一个递归过程)
能胡牌的牌最终组合为 一对+n个三个相同+n个顺子;对子有且只能有一对;
判断能否胡牌的步骤如下:
① 将牌按从小到大排序(假设条筒万依次变大)后,取最小的牌出来,
②找到一张同样的牌,如找到则取出配对牌,判断剩余牌是否为3个一组合,如剩余牌能组成3个一组(或无牌了)则可胡牌,否则放回刚才找到牌,
③找到两张同样的牌,如找到则取出这两张牌,判断剩余牌能否胡牌,剩余牌可胡牌则可胡牌,如剩余牌不能胡牌,则放回刚取出的两张牌,进行下一步。
④找出紧跟所取牌的两张牌(组成顺子),如找到,则取出这两张牌,判断剩余牌是否胡牌,剩余牌可胡牌则可胡牌,如剩余牌不能胡牌,则放回刚取出的两张牌,进行下一步。
⑤返回不能胡牌。

posted @ 2017-08-21 10:54  wjliu  阅读(1163)  评论(0)    收藏  举报