斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等)
斗地主游戏算法牌型项目研发
本篇主要讲解斗地主中如何判断一手牌的牌型。
牌型
火箭:即双王(大王和小王),最大的牌。
炸弹:四张点数相同的牌,如:7777。
单牌:任意一张单牌。
对牌:任意两张点数相同的牌。
三张:任意三张点数相同的牌,如888。
三带一:点数相同的三张牌+一张单牌或一对牌。如:333+6 或444+99。
单顺:任意五张或五张以上点数相连的牌,如:45678或78910JQK。不包括2和双王。
双顺:三对或更多的连续对牌,如:334455、7788991010JJ。不包括2 点和双王。
三顺:二个或更多的连续三张牌,如:333444 、555666777888。不包括2 点和双王。
飞机带翅膀:三顺+同数量的单牌或同数量的对牌。如:444555+79 或
333444555+7799JJ
四带二:四张牌+两手牌。(注意:四带二不是炸弹)。如:5555+3+8 或4444+55+77 。
友情提示:本篇是接着上1篇讲述的,建议先看看上1篇一张牌Card的构造过程。
斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌
/**
* 游戏规则牌的类型共有10种:
*
* 1. 单2.对子3.3不带4.3带1 5.炸弹6.顺子7.4带2 8.连队9.飞机10.对王
*
* @author LeiWen@,,
* /FansUnion
*
*/
1.单
1/**
2 * 判断牌是否为单
3 *
4 * @param myCards
5 * 牌的集合
6 * @return 如果为单,返回true;否则,返回false。
7 */
8public static boolean isDan(List
10boolean flag = false;
11if (myCards != null && myCards.size() == 1) {
12 flag = true;
13 }
14return flag;
15 }
2.对子
16/**
17 * 判断牌是否为对子
18 *
19 * @param myCards
20 * 牌的集合
21 * @return 如果为对子,返回true;否则,返回false。
22 */
23public static boolean isDuiZi(List
24// 默认不是对子
25boolean flag = false;
26
27if (myCards != null && myCards.size() == 2) {
28
29int grade1 = myCards.get(0).grade;
30int grade2 = myCards.get(1).grade;
31if (grade1 == grade2) {
32 flag = true;
33 }
34 }
35
36return flag;
37
38 }
3.3带1
/**
39* 判断牌是否为3带1
40 *
41 * @param myCards
42 * 牌的集合
43 * @return如果为3带1,被带牌的位置,0或3,否则返回-1。炸弹返回-1。
44 */
45public static int isSanDaiYi(List
46int flag = -1;
47// 默认不是3带1
48if (myCards != null && myCards.size() == 4) {
49// 对牌进行排序
50 CardUtil.sortCards(myCards);
51
52int[] grades = new int[4];
53 grades[0] = myCards.get(0).grade;
54 grades[1] = myCards.get(1).grade;
55 grades[2] = myCards.get(2).grade;
56 grades[3] = myCards.get(3).grade;
57
58// 暂时认为炸弹不为3带1
59if ((grades[1] == grades[0]) && (grades[2] == grades[0])
60 && (grades[3] == grades[0])) {
61return -1;
62 }
63// 3带1,被带的牌在牌头
64else if ((grades[1] == grades[0] && grades[2] == grades[0])) { 65return0;
66 }
67// 3带1,被带的牌在牌尾
68else if (grades[1] == grades[3] && grades[2] == grades[3]) { 69return3;
70 }
71 }
72return flag;
73 }
4.3不带
74/**
75 * 判断牌是否为3不带
76 *
77 * @param myCards
78 * 牌的集合
79 * @return 如果为3不带,返回true;否则,返回false。
80 */
81public static boolean isSanBuDai(List
82// 默认不是3不带
83boolean flag = false;
84
85if (myCards != null && myCards.size() == 3) {
86int grade0 = myCards.get(0).grade;
87int grade1 = myCards.get(1).grade;
88int grade2 = myCards.get(2).grade;
89
90if (grade0 == grade1 && grade2 == grade0) {
91 flag = true;