麻将介绍
麻将的基本规则都是一样的,我就不累赘了。
我从事棋牌工作五年了,开发过无数的麻将玩法,如柳州麻将,转转麻将,红中麻将,来宾麻将,广东麻将,清远麻将,长沙麻将,北海麻将,基本上两广的麻将都写过(狗头),所以对麻将开发有一定的理解。
我自己也开发了一款棋牌APP游戏,里面涵盖了很多麻将的玩法,欢迎私信我学习交流。
我们先把不同规则的麻将进行一个简单的归类,众所周知,全国各地每个地方的麻将叫法都不一样(注意:这里只是说叫法,打法可能相同),带风的,带花的,带癞子(精)的,只能自摸的,带番的,中码的,特殊牌型的,什么样的规则都有,但是核心算法却是百变不离其中。
按照惯例,先展示一部分麻将的界面,其中界面来源棋牌APP。
红中麻将:
柳州麻将:
转转麻将:
广东推倒胡:
从上面的几个麻将界面可以看出,按花色分类,可以分成 万子、条子、筒子、风字、癞子五大类,基本上每一类都是独立的,那么只要手牌满足每一类都能成牌,那就是可以胡了,按照这个逻辑,下面开始介绍麻将经典的胡牌算法。
麻将胡牌算法
麻将的核心算法,主要就是胡牌算法了,主流的胡牌算法有两种方式,一种是回溯法(性能低),另一种是查表法,下面我依次对这两种算法进行介绍。
回溯法:
所谓回溯,就是按照符合规则的牌型对所有手牌依次进行组合,首先将花色进行分类,按照刻字,顺子,将,这样可组合的方式对每一种花色进行组合(癞子可以作为任意牌添加进去),每次组合成功,将组合从手牌移除,重新进行回溯,如果有一次回溯失败,这样代表此组合不成立,换一种组合重新回溯,直到所有牌被移除或者所有组合都失败为结束。
回溯法的优点是比较好理解,逻辑上比较简单,但是缺点也很明显,效率太低!特别是有癞子的时候,回溯的次数非常非常多,这里也可以采用多路回溯法,但性能依然不跟查表法媲美。回溯法的另一个优点是可以在回溯的过程中计算番型,但这会大大提高代码的复杂性,因为本身番型是属于业务逻辑,不是胡牌算法本身通用的。
查表法:
所谓查表,顾名思义,就是想知道能不能胡牌,只需要把手牌放进去查一下表,就知道了。那么问题来了,什么样的表呢。说白了,就是将所有可能形成组合穷举出来,放到Map里,打个比方。假设我现在手牌是清一色,那么有多少种组合呢,11122233344455 12345678911234 22334455667788 .......等等等N种,所以这个表的数据非常非常大,大概在几百万条,会占据一定的内存空间(但其实不到100M)、构造这张表的难度非常大,要考虑各种可能,从1张牌到14张牌,从杠子到对子,还要支持癞子。
查表法的优点就是在于其性能极其高,每一种花色只需要一次hash查找就能得出结果,但是其缺点呢除了上面所说的占空间外,对于一些特殊的牌型或者特殊的组合,查表法是无济于事的,比如“七小对”,“十三幺”,这个时候还是不得不使用回溯法来进行计算。同时,查表法也不支持番型判定的。
代码实例:
回溯法可以参考我字牌系列总结篇,一样的思路,包括多路回溯
查表法由于代码较为复杂,篇幅很大计算量很多,有需要可以私信我
从下图可以看出,总共需要需要12个表,分为带将的和不带将的,带癞子的和不带癞子的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)