首页 > 编程开发 > Objective-C编程 >
-
c#网络版斗地主出牌算法规则
大家知道,斗地主这个游戏是将一些特有的牌组合成牌组然后来比较牌组的大小,那么,就应该给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连飞机,三连飞机。所以就需要写几个方法分别判断牌组是否为顺子,连对,飞机了。
顺子和对子很好判断,飞机就麻烦点了,由于飞机可以随便带一张或几张牌,如果带的牌的点数比飞机本身的点数大,那么大的那张牌就被排序到飞机前面了,这样对比较牌组的大小很不方便。所以还要有一个对飞机带翅膀这样的牌组进行排序的方法。
判断牌组类型的代码下载地址:http://file.ddvip.com/2009_06/1244624108_ddvip_8017.rar
无序的牌组通过以上代码的洗礼,已经变成了非常容易比较的牌组了。
比较牌组的大小就非常简单了。首先排除特殊牌组炸弹,双王。
然后再比较普通牌组的第一张牌就可以了。下面是牌组比较的代码,重写了PokerGroup的大于号运算符
public static bool operator >(PokerGroup LP, PokerGroup RP)
{
bool IsGreater = false;
if (LP.type != RP.type && LP.type != PokerGroupType.炸弹 && LP.type != PokerGroupType.双王)
{
IsGreater = false;
}
else
{
if (LP.type == PokerGroupType.炸弹 && RP.type == PokerGroupType.炸弹) //LPRP都为炸弹
{
if (LP[0] > RP[0]) //比较大小
{
IsGreater = true;
}
else
{
IsGreater = false;
}
}
else
{
if (LP.type == PokerGroupType.炸弹) //只有LP为炸弹
{
IsGreater = true;
}
else
{
if (LP.type == PokerGroupType.双王) //LP为双王
{
IsGreater = true;
}
else
{
if (LP[0] > RP[0]) //LP为普通牌组
{
IsGreater = true;
}
else
{
IsGreater = false;
}
}
}
}
}
return IsGreater;
}
然后在接收其他玩家牌组的时候调用IsRule方法给牌组定义一个类型,自己出牌的时候也定义一个类型,再在出牌的时候比较俩牌组的大小。
当玩家出牌时,首先应判断玩家的牌组类型。
我判断牌组类型的方法是根据玩家所出牌组张数的不同来做出不同的处理。比如,玩家出的牌只有一张,那么肯定是个子。如果有两张肯定是对子。如果有三张,肯定是三个。如果有6张呢?就有三种情况了:1、顺子。2、连对。、3、飞机。由于顺子,连对,飞机这三种牌可以有很多组合,顺子可以有6张顺子或者7张顺子,连对可以有4连对或者5连对。飞机可以有2连飞机,三连飞机。所以就需要写几个方法分别判断牌组是否为顺子,连对,飞机了。
顺子和对子很好判断,飞机就麻烦点了,由于飞机可以随便带一张或几张牌,如果带的牌的点数比飞机本身的点数大,那么大的那张牌就被排序到飞机前面了,这样对比较牌组的大小很不方便。所以还要有一个对飞机带翅膀这样的牌组进行排序的方法。
判断牌组类型的代码下载地址:http://file.ddvip.com/2009_06/1244624108_ddvip_8017.rar
无序的牌组通过以上代码的洗礼,已经变成了非常容易比较的牌组了。
比较牌组的大小就非常简单了。首先排除特殊牌组炸弹,双王。
然后再比较普通牌组的第一张牌就可以了。下面是牌组比较的代码,重写了PokerGroup的大于号运算符
public static bool operator >(PokerGroup LP, PokerGroup RP)
{
bool IsGreater = false;
if (LP.type != RP.type && LP.type != PokerGroupType.炸弹 && LP.type != PokerGroupType.双王)
{
IsGreater = false;
}
else
{
if (LP.type == PokerGroupType.炸弹 && RP.type == PokerGroupType.炸弹) //LPRP都为炸弹
{
if (LP[0] > RP[0]) //比较大小
{
IsGreater = true;
}
else
{
IsGreater = false;
}
}
else
{
if (LP.type == PokerGroupType.炸弹) //只有LP为炸弹
{
IsGreater = true;
}
else
{
if (LP.type == PokerGroupType.双王) //LP为双王
{
IsGreater = true;
}
else
{
if (LP[0] > RP[0]) //LP为普通牌组
{
IsGreater = true;
}
else
{
IsGreater = false;
}
}
}
}
}
return IsGreater;
}
然后在接收其他玩家牌组的时候调用IsRule方法给牌组定义一个类型,自己出牌的时候也定义一个类型,再在出牌的时候比较俩牌组的大小。
制作者:剑锋冷月