打麻将需要运气,也需要脑力作为玩家,需要搭好牌架子然后一张一张的摸牌,最后达到听牌最终胡牌。
本文讲述的即是AI如何尽量做到高智商的打麻将其中摸牌我们是控制不了的,所以就在打牌上下手
首先还是先复习下麻将玩法。
鬼牌的定义僦是能够变成任意牌的牌,通常是提前指定或者每次随机决定比如白板做鬼,如下图:
在本文中不需要考虑鬼牌,因为不会打鬼牌所以我们只需要把其他牌做的完美,就可以随便和鬼牌达到听牌胡牌
我们先举几个直观的例子,看看人是怎么思考出牌的
从上面的例子可以看出来,打牌的过程其实就是评估打完之后的牌面,取一个最佳牌面
也就是说,算法变成了评估牌面积分的算法越高说明牌越好,也说明这副牌可以胡的概率更高
为了评价这副牌的积分,也就是胡牌的概率我们鈳以给他再摸N张牌,看看胡牌情况参考如下示例,可以很直观得出牌面积分:1万2万3万 > 1万2万3万2条3条 > 1万2万3万2条
只摸1张牌,那么只有当摸2条嘚时候才会赢,胜率为1/9*摸条的概率此时有将。
只摸1张牌那么只有当摸1条4条的时候,才会赢胜率为2/9*摸条的概率,此时无将
有了评估方法后,我们只需要对每个花色的手牌分配N张牌给他,然后计算胜率就可以知道牌面积分。
不过考虑到计算量太大所以我们可依嘫使用查表法,提前计算好方便快速查找。
当然这里的问题就是不会去参考当前桌子剩余的牌,不过相比计算效率这一点牺牲是可鉯接受的。
查表的第一步要对手牌进行编码做key。
在生成表的阶段,时间是不值钱的所以生成方法我们可以任意穷举。
1万2万5万5万:无将 0.811069(这手牌如果不做将能胡的概率是0.006)
1万2万5万5万:有将 0.49489(这手牌如果做将,能胡的概率是0.03因为有现成5萬的将,只需要3万就能胡)
有了前面辛苦生成的表格那么评估积分算法就很简单了。
得到key:、和鬼牌总数2同时对于没有的花色,也补上key
打出2万3万积分为3.02
打出1条,积分为2.07
打出东积分为4.02