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