斗地主AI-拆牌篇01

在开篇《斗地主ai-需求篇》中阐述了ai使用场景和主要功能。

玩乐儿童编程:斗地主AI-需求篇

那么接下来就开始讲如何实现。拿到一手牌之后,首先要让ai读懂牌,知道有哪些套牌,才能进一步分析牌好牌坏,进行策略判定等。所以,无论采用什么方法实现ai都绕不过拆牌,这是实现ai的第一步,拆牌的结果直接影响后续所有步骤的。


下边先来约定几个拆牌中常用的术语和概念。


什么是手牌?

一般指ai获得的牌,是拆牌的输入。手牌是n张随机牌组成的,其中0<n<20,且随机牌是黑桃(spades)红桃(hearts)樱花(clubs)方块(diamonds)四种牌之一,且同种花色牌不超过4张。


什么是套牌?

能成套打出的,符合斗地主玩法约定的一套组合牌。比如,34567是顺子。每个套牌都有一个或多个牌型。比如,33334444,可以认为是4带2,即3333带两对4,也可以认为是飞机333444带两个单34。


什么是牌型?

斗地主游戏约定的出牌固定组合方式。主流的斗地主玩法一般包括这些牌型:

  • 单张
  • 对子(相同点数2张)
  • 三张(相同点数3张)
  • 三带一(相同点数3张带1张牌)
  • 三带对(相同点数3张带1对牌)
  • 炸弹(相同点数4张)
  • 火箭(大小王)
  • 单顺(连续5个及以上的单张,2王除外)
  • 连对(连续3个及以上的对子,2王除外)
  • 飞机(连续2个及以上的三张,2王除外)
  • 飞机带单张(连续2个及以上的三张,带与三张相同数量的单张)
  • 飞机带对子(连续2个及以上的三张,带与三张相同数量的对子)
  • 四带两单(相同点数4张带两个任意点数的单张)
  • 四带两对(相同点数4张带两个任意点数的对子)

拆牌时点数表示?

  • 10点用X表示
  • 小王用S表示
  • 大王用B表示
  • 其他点数按扑克牌本身的点数表示

什么是拆牌?

找出手牌能组成的所有套牌组合。之所以要分析出所有套牌组合,有其中的道理,因为在不同牌面和情势下,需要有不同的出牌或跟牌方式。而拆牌要做的就是找出所有可能性,为后续步骤提供这种可能性。

有些拆牌逻辑只需要先把大牌找出来就行了,或者先找顺子、再找三带一,再找三带之类的,这些拆牌逻辑都是不完整的。

例个举个例子,出牌农民手上有2KQJ3333,农民下家报单剩个4点,地主剩余AAAA6667,这种情况需要拆牌提供单个3的可能性,这样才能确保农民队友获胜。如果是先找炸弹的拆牌逻辑,那3333不可能拆成单牌,也就不可能为后续提供出单个3的可能性。所以,再强调一下,我们讨论的拆牌算法是找出所有的可能性,而不是按某种牌型顺序去找某些可能性


以手牌333456789X为例,简单说明拆牌的逻辑(其中每种套牌用英文逗号分隔):

1. 单张套牌

[3,3,3,4,5,6,7,8,9,X]


2. 单张和顺子

5张顺子

[3,3,34567,8,9,X]

[3,3,3,45678,9,X]

[3,3,3,4,56789,X]

[3,3,3,4,5,6789X]

6张顺子

[3,3,345678,9,X]

[3,3,3,456789,X]

[3,3,3,4,56789X]

7张顺子

[3,3,3456789,X]

[3,3,3,456789X]

8张顺子

[3,3,3456789X]


3. 单张和对子套牌

[3,33,4,5,6,7,8,9,X]


4.单张、对子和顺子套牌

5张顺子

[33,34567,8,9,X]

[33,3,45678,9,X]

[33,3,4,56789,X]

[33,3,4,5,6789X]

6张顺子

[33,345678,9,X]

[33,3,456789,X]

[33,3,4,56789X]

7张顺子

[33,3456789,X]

[33,3,456789X]

8张顺子

[33,3456789X]


5. 三张和单张

[333,4,5,6,7,8,9,X]


6.单张、三张和顺子

5张顺子

[333,45678,9,X]

[333,4,56789,X]

[333,4,5,6789X]

6张顺子

[333,456789,X]

[333,4,56789X]

7张顺子

[333,456789X]


7. 三带一和单张

[3334,5,6,7,8,9,X]

[3335,4,6,7,8,9,X]

...

[333X,4,5,6,7,8,9]


8. 单张、三带一和顺子

5张顺子

[3339,45678,X]

[333X,45678,9]

[3334,56789,X]

[333X,56789,4]

[3334,5,6789X]

[3335,4,6789X]

6张顺子

[333X,456789]

[3334,56789X]


斗地主不同于德州和麻将,前两者牌型基本上都是固定的组合。但是,斗地主有带牌的概念和牌型,这让斗地主的套牌组合由于带牌的原因相对更加复杂。于是,我们将拆牌分成2大步骤:

  • 第一步,将手牌拆成不可带牌的套牌。即排除:三带一、三带二、四带两单、四带两对、飞机带单张、飞机带对子这6种牌型。
  • 第二步,对每一种拆法计算带牌后的套牌。将三张、飞机、炸弹与单张、对子进行组合,分析出包括带牌在内的所有套牌。


下一篇中,我们先讲如何将手牌拆成不可带牌的套牌

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值