斗地主系列之牌型判断

Posted hfreeman2008

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了斗地主系列之牌型判断相关的知识,希望对你有一定的参考价值。

1.斗地主全部的牌型:

单牌:任意一张单牌(3 < 4 <… < K< A < 2 < 小王<大王)。

对牌:任意两张点数相同的牌(88)。

三张:  任意三张点数相同的牌,如888。

炸弹:  四张点数相同的牌,如:7777。

火箭:  即双王(大王和小王),最大的牌,这个其实也可以归类到炸弹中去。

三带一:点数相同的三张牌+一张单牌。如:333+6 。

三带二:点数相同的三张牌+一对牌。如 444+99。
四带二:点数相同的四张牌+二张单牌,或者一对牌如4444+3+8 或 4444+33

四带四:点数相同的四张牌+二个对牌,如4444+55+77
单顺:   任意五张或五张以上点数相连的牌,如:45678或78910JQK。不包括 2和双王。 
双顺:   三对或更多的连续对牌,如:334455、7788991010JJ。不包括 2 点和双王。  
飞机:   二个或更多的连续三张牌,如:333444 、555666777888。不包括 2 点和双王。 
飞机带翅膀(单牌):  三顺+同数量的单牌,如:444555+79 

飞机带翅膀(对牌):  三顺+同数量的对牌,如:333444555+7799JJ

错误牌型 :  


代码描述:

public enum CardType 
	c1,//单牌。
	c2,//对子。
	c3,//3不带。
	c4,//炸弹。
	c31,//3带1。
	c32,//3带2。
	c411,//4带2个单,或者一对
	c422,//4带2对
	c123,//连子。
	c1122,//连队。
	c111222,//飞机。
	c11122234,//飞机带单排.
	c1112223344,//飞机带对子.
	c0//不能出牌

2.判断牌型:

分别判断以上14种牌型:

List<Card> list,list是所选的牌,length为牌总数,我们先要对list按牌值大小来排序,再进行牌型判断:

(1)首先判断是不是火箭:

这个比较简单,就是先判断list的长度为2,并且二张牌都是王就OK了,但是火箭,是可以归类到炸弹中。


(2)判断牌型为:单牌(c1),对子(c2),3不带(c3),4个一样炸弹(c4),三带一(c31)----共5种。

如果牌数少于5张,并且第一张和最后一张牌值相同,也就是所有的牌都相同,则根据牌数数目为1,2,3,4分别返回c1,c2,c3,c4。

如果牌数为4张,并且第一张和第三张牌值相同,或者第二张和第四张牌值相同,那么则返回c31。


(3)判断牌型为:c32,//3带2,c411,//4带2个单,或者一对,c422,//4带2对,c123,//连子,c1122,//连队,c111222,//飞机,c11122234,//飞机带单排,c1112223344,//飞机带对子。

我们先定义一个List a[4],其中a[0]的值为list中重复一次(单张牌)的牌,a[1]的值为list中重复二次(对牌)的牌,a[2]的值为list中重复三次(三张)的牌,a[3]的值为list中重复四次(炸弹)的牌。

如果牌数大于等于5张,

c32(点数相同的三张牌+一对牌。如 444+99):

length(牌总数)为5  &&  a[2]. size()== 1 && a[1].size() == 1


c411(点数相同的四张牌+二张单牌,或者一对牌如4444+3+8 或 4444+33):

length(牌总数)为6  &&  a[3]. size()== 1


c422(点数相同的四张牌+二个对牌,如4444+55+77):

 length(牌总数)为8  &&  a[3]. size()== 1 && a[1].size() == 2


c123(任意五张或五张以上点数相连的牌,如:45678或78910JQK。不包括 2和双王):

牌值不包括双王和2  &&  a[0].size() == len   &&  (第一张牌值  - 最后一张牌值)== (length-1)


c1122(三对或更多的连续对牌,如:334455、7788991010JJ。不包括 2 点和双王):

length / 2 >= 3   &&  length%2 == 0 && a[1].size() == length/ 2  &&  (第一张牌值  - 最后一张牌值)== (length/2-1)


c111222(二个或更多的连续三张牌,如:333444 、555666777888。不包括 2 点和双王):

a[2].size() == length/ 3   &&  (length% 3 == 0)  && (第一张牌值  - 最后一张牌值)== (length/3-1)


c11122234(三顺+同数量的单牌,如:444555+79):

a[2].size() >= 2   &&   a[2].size() == length/ 4   && (a[2]的最后一个数 - a[2]的第一个数) == (length/ 4 - 1)


c1112223344(三顺+同数量的对牌,如:333444555+7799JJ):

a[2].size() >= 2  &&  a[2].size()  == length/ 5  &&  (a[2]的最后一个数 - a[2]的第一个数) == (length/ 5 - 1)


参考资料:

1.地主算法之判断牌型

http://blog.csdn.net/wojiushi3344/article/details/7578298

2.斗地主算法的设计与实现(二)--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等)

http://blog.csdn.net/fansunion/article/details/12564949


以上是关于斗地主系列之牌型判断的主要内容,如果未能解决你的问题,请参考以下文章

自己实现斗地主引擎

斗地主算法的设计与实现--如何比较两手牌的大小

斗地主特殊牌型定义

十三水,十三张,斗地主,牛牛的牌型搜索思考

Loj#6434「PKUSC2018」主斗地(搜索)

斗地主之推测 - 小一