如何实现麻将对比手上的牌
-
如何实现麻将对比手上的牌是否可以胡牌等
-
一点个人想法:
首先麻将基础的胡牌规则应该是 顺子*n+刻子*m+一对,也就是说,我们编写事件时要考虑如何实现这个规则,
由于碰、吃、杠之类的行为会将牌打出(表现上是不在手牌中的),所以其实是判定剩下的手牌是否满足胡牌规则
先准备好一个临时数组,用来存基础的手牌,然后开始按以下规则遍历(注意,以下只讨论基础胡牌规则,七小对、十三幺等特殊牌型皆不在列)
1、拿数组的第一张牌为当前想要组合的牌,存在一个变量里,并把这个牌所在的行删除(这样数组里就像是把这张牌拿出来了一样)
2、然后按 顺子→刻子→对子 的顺序遍历,具体如下:
准备另外两个变量,用来存放第二第三张组合牌
先判断第一张拿的牌是否是万、筒、条牌,如果是,就进行顺子的判断规则,如果不是,就跳过顺子的判断规则
顺子、刻子、对子的判断规则也是相当于模拟拿牌组合的过程,具体为:
以顺子为例,在剩余的数组里,按序判断,只要判断到是第一张牌的下一张(构成顺子),就拿来放到第二张组合牌的变量里,然后把这个牌所在的行删除,并中断循环,表示第二张牌查找完毕,如果都不满足,说明顺子绝对构不成,这张牌就跳过顺子的规则判断,进入到刻子的判断规则中,第三张牌的判定规则也是类似,但需要注意的是,如果第三张牌判断时找不到合适的牌,判定失败了,需要把第二张牌添加回数组中,再进入刻子的判断规则中。
与顺子的流程类似,刻子和对子只是遍历数组时判断的规则变成判断是不是相同的牌。
3、以上三个规则判断完之后,就会有两种可能结果:以第一张牌为基础组合牌时,【手牌中找到了可以构成顺子/刻子/对子】或者【手牌中没有可匹配的组合】,如果是后者,就表示直接不满足胡牌规则,可以跳出判断,不用继续进行下去了,如果是前者,就继续从数组剩下的牌中执行1、2点操作(需要注意的是,对子的情况比较特别,需要有一个变量来标记对子是否已被组合过,因为对子只能有一对,如果判断对子规则时,这个标记变量表示对子已被组合过的话,则不进行对子规则的判断)
以上1、2、3点规则不断反复运行,直到数组中完全没牌时,则判定结束,此时可断定满足胡牌规则,如果过程中有任何一次不满足规则,都会直接跳出这个大循环,表示不满足胡牌规则。
目前想到的就这么多了,不过没有自己动手做过,所以可能有考虑欠缺的地方,所以你就只当是一个思路分享来参考看看就好