C#网络版斗地主——出牌算法和规则

源码在上一篇文章: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的值是一个枚举类型

 

 

Code

 

 

当玩家出牌时,首先应判断玩家的牌组类型。

我判断牌组类型的方法是根据玩家所出牌组张数的不同来做出不同的处理。比如,玩家出的牌只有一张,那么肯定是个子。如果有两张肯定是对子。如果有三张,肯定是三个。如果有6张呢?就有三种情况了:1、顺子。2、连对。、3、飞机。由于顺子,连对,飞机这三种牌可以有很多组合,顺子可以有6张顺子或者7张顺子,连对可以有4连对或者5连对。飞机可以有2连飞机,三连飞机。所以就需要写几个方法分别判断牌组是否为顺子,连对,飞机了。

顺子和对子很好判断,飞机就麻烦点了,由于飞机可以随便带一张或几张牌,如果带的牌的点数比飞机本身的点数大,那么大的那张牌就被排序到飞机前面了,这样对比较牌组的大小很不方便。所以还要有一个对飞机带翅膀这样的牌组进行排序的方法。

判断牌组类型的代码如下:

 

 

Code

 

 

无序的牌组通过以上代码的洗礼,已经变成了非常容易比较的牌组了。

比较牌组的大小就非常简单了。首先排除特殊牌组炸弹,双王。

然后再比较普通牌组的第一张牌就可以了。下面是牌组比较的代码,重写了PokerGroup的大于号运算符

 

 

Code

然后在接收其他玩家牌组的时候调用IsRule方法给牌组定义一个类型,自己出牌的时候也定义一个类型,再在出牌的时候比较俩牌组的大小。

posted @ 2009-06-08 14:48  猪笨无罪  阅读(8208)  评论(7编辑  收藏  举报