ps:四川麻将AI算法已经开发完毕,现已上线运营,有需要交流的朋友请留言交流讨论
转载请说明出处:by:wojiushi3344
我想现实生活中应该有很多朋友都在玩四川麻将,不知道你有没有发现其实四川麻将是否胡牌其实也是可以用数学公式来表达的。不知道你猜到了没有?? 好了,好了 不留悬念了我直接给出来。ABCxN+AAAxN+AAx1 这个是什么意思了,意思就是你想要胡牌 那么你的牌型必须要满足以上这个公式你才能胡牌。你手牌必须是有N个顺子,或者N个刻子和一个对子组成才能胡牌。那么你现在知道了胡牌公式,那你会计算当前手牌的向听数吗?(向听数:这手牌摸几张牌能够听牌)。我想很多人打了多年的麻将,都不一定第一时间能看出手牌的向听数。这个其实在你写程序的时候非常重要,如果没有这个你就不知道别人打一张牌来,你是碰不碰,杠不杠。我可以直接告诉你其实也是有公式可以找的。
胡牌数:当手牌有N张时,最多需要N/32+1手即可胡
向听数:代表听牌最多需要N/32手听牌
这个公式我们是怎么得来的来,我们一起来看下面一张图片
大家看上面这张图片,假设我们手牌有14张,最坏的情况我们摸9张牌就可以听牌。为什么是9张不是8张,不是10张了。这个就要根据我们前面的胡牌公式来了,因为如果你要胡牌手牌就必须是连子或者或者加一个对子。那么我们这个就很好推倒出来了,一个连子由三张牌组成,一个刻子由3张牌组成,我们假设你只有连子中得一张牌,那么你就只差2张可以组成一个连子,那么你组成连子就需要2手,依次类推,你就可以得到我们最多有几首牌可以胡牌的公式。我们每组成一个搭子就会降低进听数。 N/3*2+1 下面我们一起给一张图片来计算一下胡牌的步数。
上面这张图片需要3张牌就可以胡牌,你算对了吗?为什么是三首了,1手:我们来看1,3差一张2万,2手:889差一张7或者一张8,
3手:2饼差一张2或者3条差一张3条 我们计算这个有什么用了,只要我们能快速的计算出来这个,我们就能知道我们现在牌型到了什么阶段了,我们需要怎么出牌了。还有一个特别重要的时刻就是,我们能够快速的分辨出牌,别人出一张牌,我们是否决定要碰牌。其实决定我们是否要碰牌,就是看我们有没有让牌型向听数量倒退,这个决定是否碰牌的算法,我们放到后面来讲。
可能现在很多人有一个疑问???为什么我们要把7拆成而不是
了?如果你发现了这个问题,那么恭喜你可以进入我们今天将的最重要的环节,如果拆解一个最优的牌型。
我们怎么才能拆解出最优的牌型,我们第一步就得把所有牌能组成的可能全部拆解出来。我们还是以上一首牌为例子:
1万3万可以组成的牌:
7,8,,9能组成的牌
5筒可能组成的3种牌型
6筒可能组成的牌型
7筒能组成的所有可能
8筒所有的可能
9筒所有的可能
我们通过这个计算就能完成第一步把这手牌所有能组成的搭子全部拆解出牌,我们知道一首牌胡牌为N/2*3+1,那么搭子的最大数量也就为N/3+1,这个大家下面可以自己去推算,我在这里就不一一讲解了,然后我们通过排列组合的方式至多组合5个搭子,看哪一个分数最大,听牌数量最少的。则为我们当前的最优拆牌方案,我们后面出牌就以这个为参考的标准出牌。后面有时间持续更新四川麻将的AI算法。这里我们可以给每一个搭子分配一个分数,为了后面计算。
这里为什么有第一个对子99了,因为我们胡牌只需要一个对子,2个对子就不能胡牌,所以只能给一个对子99分。上面理论部分的东西基本已经全部讲完,不知道大家有没有思路,有没有想法了,下面我给出python的实现的代码,需要的朋友可以点击链接下载。