在开篇《斗地主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种牌型。
- 第二步,对每一种拆法计算带牌后的套牌。将三张、飞机、炸弹与单张、对子进行组合,分析出包括带牌在内的所有套牌。
下一篇中,我们先讲如何将手牌拆成不可带牌的套牌。