用数字代替麻将中的所有牌:
一万~九万 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,则就是胡了,返回成功即可。