斗地主之出牌

Posted by 小一在此 on September 6, 2017

总算可以出牌了:)

出牌又可以分为两类:

  • 主动出牌,即牌权在自己手上,可以自由选择一手牌打出去

  • 被动出牌,即其他家出了手牌,则从大于这手牌的牌手中选择一个,当然还可以不要

出牌其实是一个很复杂的事情,因为我手上可能恰好有合适的牌手,但也可能没有合适的牌手,那我是否需要拆牌呢?作为地主我是否该强行终止农民的做桥过程呢?作为下家我是该顺牌呢,还是该放给对家过呢?所以之前有个兄弟评论我关于整理牌型的文章时说:关键是要掌握牌权、是猜对方的牌、要逼对方拆牌等等。嗯,我其实一开始也是这么想的,结果琢磨了一两个月都找不到解决办法:(

问题的关键在于这些事都是纠结在一起的,而对于复杂问题,我们IT的方法论是常说的分而治之:即将复杂问题拆分为小问题,如果小问题还是比较复杂,则继续拆分,直到无法拆分或我们已清楚如何处理。而我们拆分的原则应该是将一个高复杂度问题转换为一个组织起来的低复杂度问题的集合,也就是说复杂度的降低是通过有序的组织来换取的。找不到合适的组织方法的拆分是盲目的、也是无效的。之前思路的无效就是因为这种思路没有找到合适的组织方法。

很幸运的是,我在之前介绍用蚁群算法提取最优牌型时说过:为了避免提取出来的牌型过于琐碎,所以我引入了一个结构罚分系数。某一天,作为副作用,我突然想到了可以通过调节这个结构罚分系数来生成各种各样的牌型时才终于找到了这个问题的抓手!

这个抓手就是我们不需要考虑是否需要拆牌、该如何拆牌并重新组合,而是生成一系列各种各样的牌型,然后看看各牌型是否能出牌,最后再综合各牌型的意见给出一个全局最优解。有了这个思路,后面的事情就比较好办了,借鉴我们IT常用的各种选举机制,我将出牌分解为如下过程:

  • 准备:也就是生成一系列各种各样的牌型,有的对子强、有的单张强、有的顺子强等等

  • 提议:针对当前牌局,各牌型提出自己的候选牌手并给出该牌型估计的出牌价值,没有合适的候选牌手就不提

  • 审议:将所有候选牌手逐一交给所有的牌型,由各牌型对该候选牌手提出审议意见

  • 综合:结合所有牌型对所有候选牌手的价值判断,给出最有价值的牌手,这就是应出的牌手

这里面的核心就是提议过程,即本牌型根据当前的牌局,对所有可以出的牌手(主动出牌是所有牌手、被动出牌是比当前牌大的牌手)进行价值推理,计算当前牌局下该牌手的价值。这里我使用了模糊推理,相应的模糊规则形如:

#此规则意为:门板手中有地主的弱牌,则用尽可能大的牌打死地主价值非常大
如果 我 的 角色 等于 门板
且 最新出牌 的 角色 等于 地主
且 状态 等于 未出 同时 类型 等于 地主 的 弱牌 同时 牌力 只是 大
且 待出牌 的 牌力 是 非常 大 同时 类型 不等于 炸弹
则 价值 是 非常大 且 待出牌 的 牌力 越大越好

不需要考虑规则的分词问题,一方面分词与否不是核心问题,另一方面则是即便解决了分词但这样的文本规则还是太复杂,写看都太痛苦,关键是文本规则的校验比较麻烦,最终还是应发展相应的规则编辑器才是正途

这样一来,出牌就比较简单了:

  • 提议过程就是从规则表中选择相应的规则,然后对所有可以出的牌手进行模糊推理以判定其价值,然后从中选择价值最大的一手牌作为本牌型的提议结果

  • 审议过程就是简单看下自己这个牌型中如果出了这手牌是一个什么样的结果:如果我这个牌型中不包括这手牌,那就是说如果要出这手牌,我这个牌型就不存在了,显然是最不利的;如果我有这手牌,那就看下这手牌在我这个牌型中的价值,其实就是保存下提议过程中我的评分结果就好了

  • 综合过程最简单,就是将所有牌手逐一提交给不同的牌型,然后根据各牌型的权重设置牌型审议结果的权重,比如地主单张是弱牌,那显然单张强的牌型要比三张强的牌型有价值。有了各牌型的审议评分和各牌型的权重,我们只要做个简单的解模糊,就能得到该手牌的价值评分,而价值评分最高的那手牌就是我们要出的牌。所以,综合过程其实就是根据各牌型的价值及其对审议结果进行加权平均,然后选择最有利的一手牌就可以了

这样的话,核心问题其实就是该怎么写如何出牌的规则的问题了。由于规则是文本形式的,这样的话,我们完全可以定义一个规则表,指定给各自的玩家动态加载,所以写规则这个事完全可以交给玩家进行发挥、做他们自己的个性化定制好了,我们则可以去喝喝茶歇歇啦:) 当然,我们无论如何得先写一组基本规则来验证下确实能打牌才是

目前定义了80余条各种规则,包括主动出牌、被动出牌、价值估计、玩家动态估计等,但斗地主的牌局变化非常复杂,这些规则还不足以覆盖各种复杂局面,所以目前的表现和新手无异:(

====================================================================================================

关注我的公众号及时获取推送的最新文章

公众号