斗地主系列之洗牌和发牌
来源:互联网 发布:手机制作表格软件 编辑:程序博客网 时间: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
- 斗地主系列之洗牌和发牌
- 斗地主:洗牌发牌
- 斗地主算法之发牌,洗牌
- 斗地主算法之发牌,洗牌
- 模拟斗地主洗牌和发牌
- 斗地主洗牌+发牌+排序
- Java-斗地主洗牌发牌
- 斗地主洗牌发牌案例
- java斗地主 洗牌发牌
- 集合框架_模拟斗地主洗牌和发牌
- 用java模拟斗地主洗牌和发牌
- Java模拟斗地主洗牌、发牌和对牌排序
- 集合框架-模拟斗地主洗牌和发牌案例
- Java实现--模拟斗地主的洗牌和发牌
- java-模拟斗地主的洗牌和发牌
- 模拟斗地主洗牌和发牌(集合实现)
- 模拟斗地主洗牌和发牌,牌没有排序
- 【代码练习2】模拟斗地主洗牌和发牌
- UVa11296 - Counting Solutions to an Integral Equation(枚举技巧)
- 【矛与盾】调戏调试器:反断点技术
- linux 对安装包的管理(安装,卸载,查询等)
- 静态库报错
- java File类中的mkdir()和mkdirs()有什么区别
- 斗地主系列之洗牌和发牌
- 【Unity 3D】学习笔记二十四:unity游戏脚本(四)
- LA2565 Extraterrestrial Intelligence
- java4android第四十集java当中的数组
- 四创第一天上班的体会
- Maven2 根据项目生成模版项目,并使用该模板批量创建工程
- 聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Index)举例说明
- Undefined symbols for architecture armv7s
- HDU1226超级密码(宽搜+记忆化搜索)