C#网络版斗地主——出牌算法和规则
2009-06-10 08:32:02 来源:WEB开发网当玩家出牌时,首先应判断玩家的牌组类型。
我判断牌组类型的方法是根据玩家所出牌组张数的不同来做出不同的处理。比如,玩家出的牌只有一张,那么肯定是个子。如果有两张肯定是对子。如果有三张,肯定是三个。如果有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方法给牌组定义一个类型,自己出牌的时候也定义一个类型,再在出牌的时候比较俩牌组的大小。
更多精彩
赞助商链接