源码在上一篇文章:http://www.cnblogs.com/zhubenwuzui/archive/2009/06/06/1497673.html
本文是对C#网络版斗地主的开发总结,同时也是最后一篇。
其他三篇文章地址:
网络部分实现:http://www.cnblogs.com/zhubenwuzui/archive/2009/06/07/1497968.html
地主权限的传递:http://www.cnblogs.com/zhubenwuzui/archive/2009/06/07/1498097.html
出牌权限的传递:http://www.cnblogs.com/zhubenwuzui/archive/2009/06/08/1498369.html
大家知道,斗地主这个游戏是将一些特有的牌组合成牌组然后来比较牌组的大小,那么,就应该给PokerGroup类定义一个属性type,即牌组的类型,type的值是一个枚举类型
1 public enum PokerGroupType
2 {
3 单张 = 1,
4 对子 = 2,
5 双王 = 3,
6 三张相同 = 4,
7 三带一 = 5,
8 炸弹 = 6,
9 五张顺子 = 7,
10 六张顺子 = 8,
11 三连对 = 9,
12 四带二 = 10,
13 二连飞机 = 11,
14 七张顺子 = 12,
15 四连对 = 13,
16 八张顺子 = 14,
17 飞机带翅膀 = 15,
18 九张顺子 = 16,
19 三连飞机 = 17,
20 五连对 = 18,
21 十张顺子 = 19,
22 十一张顺子 = 20,
23 十二张顺子 = 21,
24 四连飞机 = 22,
25 三连飞机带翅膀 = 23,
26 六连对 = 24,
27 //没有13
28 七连对 = 25,
29 五连飞机 = 26,
30 八连对 = 27,
31 四连飞机带翅膀 = 28,
32 //没有17
33 九连对 = 29,
34 六连飞机 = 30,
35 //没有19
36 十连对 = 31,
37 五连飞机带翅膀 = 32
38
39
40 //下面是各种牌组对应的牌的张数
41 //单张 = 1,
42 //对子 = 2,
43 //双王 = 2,
44 //三张相同 = 3,
45 //三带一 = 4,
46 //炸弹 = 4,
47 //五张顺子 = 5,
48 //六张顺子 = 6,
49 //三连对 = 6,
50 //四带二 = 6,
51 //二连飞机 = 6,
52 //七张顺子 = 7,
53 //四连对 = 8,
54 //八张顺子 = 8,
55 //飞机带翅膀 = 8,
56 //九张顺子 = 9,
57 //三连飞机 = 9,
58 //五连对 = 10,
59 //十张顺子 = 10,
60 //十一张顺子 = 11,
61 //十二张顺子 = 12,
62 //四连飞机 = 12,
63 //三连飞机带翅膀 = 12,
64 //六连对 = 12,
65 ////没有13
66 //七连对 = 14,
67 //五连飞机 = 15,
68 //八连对 = 16,
69 //四连飞机带翅膀 = 16,
70 ////没有17
71 //九连对 = 18,
72 //六连飞机 = 18,
73 ////没有19
74 //十连对 = 20,
75 //五连飞机带翅膀 = 20
76 }
当玩家出牌时,首先应判断玩家的牌组类型。
我判断牌组类型的方法是根据玩家所出牌组张数的不同来做出不同的处理。比如,玩家出的牌只有一张,那么肯定是个子。如果有两张肯定是对子。如果有三张,肯定是三个。如果有6张呢?就有三种情况了:1、顺子。2、连对。、3、飞机。由于顺子,连对,飞机这三种牌可以有很多组合,顺子可以有6张顺子或者7张顺子,连对可以有4连对或者5连对。飞机可以有2连飞机,三连飞机。所以就需要写几个方法分别判断牌组是否为顺子,连对,飞机了。
顺子和对子很好判断,飞机就麻烦点了,由于飞机可以随便带一张或几张牌,如果带的牌的点数比飞机本身的点数大,那么大的那张牌就被排序到飞机前面了,这样对比较牌组的大小很不方便。所以还要有一个对飞机带翅膀这样的牌组进行排序的方法。
判断牌组类型的代码如下:
/// <summary>
/// 验证所出牌组是否符合游戏规则
/// </summary>
public static bool IsRules(PokerGroup leadPokers) //判断所出牌组类型以及其是否符合规则
{
bool isRule = false;
Player.sort(leadPokers);
switch (leadPokers.Count)
{
case 0:
isRule = false;
break;
case 1:
isRule = true;
leadPokers.type = PokerGroupType.单张;
break;
case 2:
if (IsSame(leadPokers,2))
{
isRule = true;
leadPokers.type = PokerGroupType.对子;
}
else
{
if (leadPokers[0] == PokerNum.大王 && leadPokers[1] == PokerNum.小王)
{
leadPokers.type = PokerGroupType.双王;
isRule = true;
}
else
{
isRule = false;
}
}
break;
case 3:
if (IsSame(leadPokers,3))
{
leadPokers.type = PokerGroupType.三张相同;
isRule = true;
}
else
{
isRule = false;
}
break;
case 4:
if (IsSame(leadPokers, 4))
{
leadPokers.type = PokerGroupType.炸弹;
isRule = true;
}
else
{
if (IsThreeLinkPokers(leadPokers))
{
leadPokers.type = PokerGroupType.三带一;
isRule = true;
}
else
{
isRule = false;
}
}
break;
case 5:
if (IsStraight(leadPokers))
{
leadPokers.type = PokerGroupType.五张顺子;
isRule = true;
}
else
{
isRule = false;
}
break;
case 6:
if (IsStraight(leadPokers))
{
leadPokers.type = PokerGroupType.六张顺子;
isRule = true;
}
else
{
if (IsLinkPair(leadPokers))
{
leadPokers.type = PokerGroupType.三连对;
isRule = true;
}
else
{
if (IsSame(leadPokers, 4))
{
leadPokers.type = PokerGroupType.四带二;
isRule = true;
}
else
{
if (IsThreeLinkPokers(leadPokers))
{
leadPokers.type = PokerGroupType.二连飞机;
isRule = true;
}
else
{
isRule = false;
}
}
}
}
break;
case 7:
if (IsStraight(leadPokers))
{
leadPokers.type = PokerGroupType.七张顺子;
isRule = true;
}
else
{
isRule = false;
}
break;
case 8:
if (IsStraight(leadPokers))
{
leadPokers.type = PokerGroupType.八张顺子;
isRule = true;
}
else
{
if (IsLinkPair(leadPokers))
{
leadPokers.type = PokerGroupType.四连对;
isRule = true;
}
else
{
if (IsThreeLinkPokers(leadPokers))
{
leadPokers.type = PokerGroupType.飞机带翅膀;
isRule = true;
}
else
{
isRule = false;
 
请发表评论