斗地主系列之洗牌和发牌

来源:互联网 发布:手机制作表格软件 编辑:程序博客网 时间:2024/04/28 00:56

1.一些说明:

  大家都知道,斗地主的一副牌有54张,三位玩家,每位17张牌,3张底牌(17*3+3 = 54)。

所以,我们定义一个List:

List cards = new ArrayList<int>();

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张牌初始化,比较简单,在这就不介绍了,下面主要介绍洗牌和发牌。


2.洗牌:

  洗牌的核心思想:就是把牌随机的洗乱,以达到完全随机的状态。

  我们先参考下面的二篇博文:

  (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<SWAP_COUNT;i++ ){        Collections.shuffle(cards);        }}

3.发牌:

      我们看了上面的二篇博文,觉得依照一定的发牌策略和规则,分别给三个玩家发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


0 0
原创粉丝点击