大家都知道,斗地主的一副牌有54张,三位玩家,每位17张牌,3张底牌(17*3+3 = 54)。
所以,我们定义一个List:
List cards = new ArrayList
cards.get(0)-----cards.get(12) 方块3,方块4---------方块K,方块A,方块2
cards.get(13)-----cards.get(25) 梅花3,梅花4---------梅花K,梅花A,梅花2
cards.get(26)-----cards.get(38) 红心3,红心4---------红心K,红心A,红心2
cards.get(39)-----cards.get(51) 黑桃3,黑桃4---------黑桃K,黑桃A,黑桃2
cards.get(52), cards.get(53) 小王,大王
我们要做的是:
(1)先给List cards 初始化54张牌,
(2)然后,洗牌,其核心思想,是把这54张牌随机交换二张牌的位置,将牌完全洗乱.
(3)再按照一定的发牌策略,将这54张牌,分别给三位玩家发17张牌,再留3张底牌。
对54张牌初始化,比较简单,在这就不介绍了,下面主要介绍洗牌和发牌。
洗牌的核心思想:就是把牌随机的洗乱,以达到完全随机的状态。
我们先参考下面的二篇博文:
(1)http://blog.csdn.net/fansunion/article/details/12649315
(2)http://blog.csdn.net/wojiushi3344/article/details/7522245
大家应该心里有数了,应该怎么做了。
下面是我选择的方法,这个方法主要是可以方便以后在服务端来配置交换次数。
private void xiPai(List cards) {
// TODO Auto-generated method stub
//洗牌,交换SWAP_COUNT次 ,SWAP_COUNT,我们后面可以在服务端配置
for(int i = 0;i
我们看了上面的二篇博文,觉得依照一定的发牌策略和规则,分别给三个玩家发17张,最后3张为底牌就OK了。呵呵,其实一开始我也是这么做的,后来,想一想,我们为什么要按一定的发牌策略和规则发牌呢?是不是主要还是为了随机呢?好,如果我们在洗牌时,做到了足够随机,那么我们是不是就可以这样发牌,我们把1到17张牌发给玩家1,18到34张牌发给玩家2,35到51张牌发给玩家3,最后三张做底牌。答案当然是可以的,那们发牌就简单了。
但是,各位,我们是不是还会有这样的要求:
(1)给玩家自己发一手好牌(如几个炸弹,几张大牌),(大牌为(4个2,2个王))
(2)设定几个炸弹,随机的发给三个玩家
(3)随机的给三位玩家发牌
(4)在特定时候,减少炸弹的出现概率,大牌同时出现的概率。
并且要求这些参数,可以在服务器配置。有没有好的发牌方法呢:
解决方案:
(1)设定好牌炸弹List(goodBombsList),好牌大牌List(goodKeyPaisList),根据要求分别给goodBombsList,和goodKeyPaisList分配牌,并发给玩家自己。
(2)设定炸弹List(bombsList),根据要求给bombsList赋值(这个要注意设定炸弹的数目,不能太多,炸弹为1,2,3,4,5,6为佳),然后随机的把这些炸弹发给三个玩家,发牌的时候要注意随时判断玩家手中的牌是否还能分配炸弹。
(3)随机把总共54张牌洗乱得到allCardsList,再从allCardsList中将goodBombsList,goodKeyPaisList,bombsList中的牌都删除,再把剩下的牌发给三个玩家和底牌。
(4)如果在特定时条件下,调整减少炸弹和几张大牌同时出现的概率。
并且这些概率值,我们都采用成员变量的方式,提供set和get方法,以方便后面的设置。
因为我的需求,我说一下我的解决方案吧:
(1)给玩家自己发好牌:
设定好牌炸弹List(goodBombsList),好牌大牌List(goodKeyPaisList),根据要求分别给goodBombsList,和goodKeyPaisList分配牌,并发给玩家自己。
随机把总共54张牌洗乱得到allCardsList,再从allCardsList中将goodBombsList,goodKeyPaisList中的牌都删除,再把剩下的牌发给三个玩家和底牌。
(2)完全随机发牌:
随机把总共54张牌洗乱得到allCardsList,再把allCardsList的牌完全随机的发给三个玩家和底牌。
如果在特定时条件下,调整减少炸弹和几张大牌同时出现的概率。
参考文献:
1. 斗地主算法的设计与实现
http://blog.csdn.net/column/details/doudizhu.html
2. 棋牌游戏开发
http://blog.csdn.net/column/details/iphoebe.html