斗地主算法的设计与实现 五 --洗牌和发牌
本篇简要介绍如何洗牌和发牌。
这2个算法都很简单,有兴趣的同学可以写得更好一点。
关键点说明
a.洗牌算法的思路就是,构造54张牌,打乱牌N次,这个算法可能不够随机。
b.发牌算法的思路就是,从洗好的牌中,按规律发给3个玩家,比如1好玩家就取第1、4、7等17张牌。
c.3个玩家,谁取到id为1的这张牌,谁就是“地主”。
1.初始化
/** * 初始化 */ private void deal() { shuffle(); divide(); }
2.洗牌
/** * 洗牌 */ private void shuffle() { for (int i = 0; i < 54; i++) { Card card = new Card(i + 1); allCards.add(card); } System.out.println("洗牌之前:"); CardUtil.printCards(allCards); // 洗牌,交换1000次 for (int i = 0; i <= 1000; i++) { Collections.shuffle(allCards);// 打乱牌的位置 } System.out.println("洗牌之后:"); CardUtil.printCards(allCards); }
3.发牌
//发牌 private void divide() { // 1号玩家的牌 for (int j = 0; j < 17; j++) { Card card = allCards.get(j * 3); myCards.add(card); if (myCards.get(j).id == 1) { diZhu = 1; } } // 2号玩家的牌 for (int j = 0; j < 17; j++) { Card card = allCards.get(j * 3 + 1); rightCards.add(card); if (rightCards.get(j).id == 1) { diZhu = 2; } } // 3号玩家的牌 for (int j = 0; j < 17; j++) { Card card = allCards.get(j * 3 + 2); leftCards.add(card); if (leftCards.get(j).id == 1) { diZhu = 3; } } for (int i = 51; i < 54; i++) { Card card = allCards.get(i); topCards.add(card); Card card2 = new Card(card.id); copyOfTopCards.add(card2); } CardUtil.sortCards(myCards); CardUtil.sortCards(leftCards); CardUtil.sortCards(rightCards); }
4.打印牌
/** * 打印牌 */ private void printCards() { System.out.println("玩家1的牌:"); CardUtil.printCards(myCards); System.out.println("玩家2的牌:"); CardUtil.printCards(leftCards); System.out.println("玩家3的牌:"); CardUtil.printCards(rightCards); System.out.println("底牌:"); CardUtil.printCards(topCards); }
5.运行洗牌发牌程序
public static void main(String[] args) { DealingDevice one = new DealingDevice(); one.printCards(); logger.info("没有排序的牌:"); ArrayList<Card> allCards2 = one.getAllCards(); CardUtil.printCards(allCards2); logger.info("排序之后的牌:"); CardUtil.sortCards(allCards2); CardUtil.printCards(allCards2); }
6.程序运行结果
洗牌之前:
方块A(A0.gif) 方块2(20.gif) 方块3(30.gif) 方块4(40.gif) 方块5(50.gif) 方块6(60.gif) 方块7(70.gif) 方块8(80.gif) 方块9(90.gif) 方块10(100.gif) 方块J(J0.gif) 方块Q(Q0.gif) 方块K(K0.gif) 梅花A(A1.gif) 梅花2(21.gif) 梅花3(31.gif) 梅花4(41.gif) 梅花5(51.gif) 梅花6(61.gif) 梅花7(71.gif) 梅花8(81.gif) 梅花9(91.gif) 梅花10(101.gif) 梅花J(J1.gif) 梅花Q(Q1.gif) 梅花K(K1.gif) 红桃A(A2.gif) 红桃2(22.gif) 红桃3(32.gif) 红桃4(42.gif) 红桃5(52.gif) 红桃6(62.gif) 红桃7(72.gif) 红桃8(82.gif) 红桃9(92.gif) 红桃10(102.gif) 红桃J(J2.gif) 红桃Q(Q2.gif) 红桃K(K2.gif) 黑桃A(A3.gif) 黑桃2(23.gif) 黑桃3(33.gif) 黑桃4(43.gif) 黑桃5(53.gif) 黑桃6(63.gif) 黑桃7(73.gif) 黑桃8(83.gif) 黑桃9(93.gif) 黑桃10(103.gif) 黑桃J(J3.gif) 黑桃Q(Q3.gif) 黑桃K(K3.gif) 小王XiaoWang(smallJoker.gif) 大王DaWang(bigJoker.gif)
洗牌之后:
红桃7(72.gif) 红桃J(J2.gif) 方块J(J0.gif) 大王DaWang(bigJoker.gif) 黑桃5(53.gif) 梅花Q(Q1.gif) 黑桃2(23.gif) 梅花6(61.gif) 红桃2(22.gif) 方块K(K0.gif) 红桃5(52.gif) 红桃6(62.gif) 梅花4(41.gif) 黑桃K(K3.gif) 梅花J(J1.gif) 梅花9(91.gif) 红桃3(32.gif) 方块10(100.gif) 方块8(80.gif) 方块Q(Q0.gif) 黑桃10(103.gif) 黑桃9(93.gif) 红桃4(42.gif) 方块9(90.gif) 黑桃3(33.gif) 黑桃6(63.gif) 黑桃7(73.gif) 梅花K(K1.gif) 红桃8(82.gif) 梅花5(51.gif) 方块2(20.gif) 红桃9(92.gif) 红桃Q(Q2.gif) 小王XiaoWang(smallJoker.gif) 红桃A(A2.gif) 梅花A(A1.gif) 梅花8(81.gif) 方块5(50.gif) 方块4(40.gif) 方块3(30.gif) 方块6(60.gif) 黑桃4(43.gif) 黑桃J(J3.gif) 梅花3(31.gif) 梅花2(21.gif) 梅花7(71.gif) 方块7(70.gif) 方块A(A0.gif) 红桃K(K2.gif) 黑桃Q(Q3.gif) 红桃10(102.gif) 梅花10(101.gif) 黑桃8(83.gif) 黑桃A(A3.gif)
玩家1的牌:
方块3(30.gif) 黑桃3(33.gif) 梅花4(41.gif) 梅花7(71.gif) 红桃7(72.gif) 方块8(80.gif) 梅花8(81.gif) 梅花9(91.gif) 黑桃9(93.gif) 黑桃J(J3.gif) 方块K(K0.gif) 梅花K(K1.gif) 红桃K(K2.gif) 方块2(20.gif) 黑桃2(23.gif) 小王XiaoWang(smallJoker.gif) 大王DaWang(bigJoker.gif)
玩家2的牌:
方块 4(40.gif) 黑桃4(43.gif) 梅花5(51.gif) 红桃6(62.gif) 黑桃7(73.gif) 方块9(90.gif) 方块10(100.gif) 红桃10(102.gif) 黑桃10(103.gif) 方块J(J0.gif) 梅花J(J1.gif) 梅花Q(Q1.gif) 红桃Q(Q2.gif) 方块A(A0.gif) 梅花A(A1.gif) 梅花2(21.gif) 红桃2(22.gif)
玩家3的牌:
梅花3(31.gif) 红桃3(32.gif) 红桃4(42.gif) 方块5(50.gif) 红桃5(52.gif) 黑桃5(53.gif) 方块6(60.gif) 梅花6(61.gif) 黑桃6(63.gif) 方块7(70.gif) 红桃8(82.gif) 红桃9(92.gif) 红桃J(J2.gif) 方块Q(Q0.gif) 黑桃Q(Q3.gif) 黑桃K(K3.gif) 红桃A(A2.gif)
底牌:
梅花10(101.gif) 黑桃8(83.gif) 黑桃A(A3.gif)
红桃7(72.gif) 十月 11, 2013 1:16:41 下午 cn.fansunion.ddz.client.DealingDevice main
INFO: 没有排序的牌:
红桃J(J2.gif) 方块J(J0.gif) 大王DaWang(bigJoker.gif) 黑桃5(53.gif) 梅花Q(Q1.gif) 黑桃2(23.gif) 梅花6(61.gif) 红桃2(22.gif) 方块K(K0.gif) 红桃5(52.gif) 红桃6(62.gif) 梅花4(41.gif) 黑桃K(K3.gif) 梅花J(J1.gif) 梅花9(91.gif) 红桃3(32.gif) 方块10(100.gif) 方块8(80.gif) 方块Q(Q0.gif) 黑桃10(103.gif) 黑桃9(93.gif) 红桃4(42.gif) 方块9(90.gif) 黑桃3(33.gif) 黑桃6(63.gif) 黑桃7(73.gif) 梅花K(K1.gif) 红桃8(82.gif) 梅花5(51.gif) 方块2(20.gif) 红桃9(92.gif) 红桃Q(Q2.gif) 小王XiaoWang(smallJoker.gif) 红桃A(A2.gif) 梅花A(A1.gif) 梅花8(81.gif) 方块5(50.gif) 方块4(40.gif) 方块3(30.gif) 方块6(60.gif) 黑桃4(43.gif) 黑桃J(J3.gif) 梅花3(31.gif) 梅花2(21.gif) 梅花7(71.gif) 方块7(70.gif) 方块A(A0.gif) 红桃K(K2.gif) 黑桃Q(Q3.gif) 红桃10(102.gif) 梅花10(101.gif) 黑桃8(83.gif) 黑桃A(A3.gif)
十月 11, 2013 1:16:41 下午 cn.fansunion.ddz.client.DealingDevice main
INFO: 排序之后的牌:
方块3(30.gif) 梅花3(31.gif) 红桃3(32.gif) 黑桃3(33.gif) 方块4(40.gif) 梅花4(41.gif) 红桃4(42.gif) 黑桃4(43.gif) 方块5(50.gif) 梅花5(51.gif) 红桃5(52.gif) 黑桃5(53.gif) 方块6(60.gif) 梅花6(61.gif) 红桃6(62.gif) 黑桃6(63.gif) 方块7(70.gif) 梅花7(71.gif) 红桃7(72.gif) 黑桃7(73.gif) 方块8(80.gif) 梅花8(81.gif) 红桃8(82.gif) 黑桃8(83.gif) 方块9(90.gif) 梅花9(91.gif) 红桃9(92.gif) 黑桃9(93.gif) 方块10(100.gif) 梅花10(101.gif) 红桃10(102.gif) 黑桃10(103.gif) 方块J(J0.gif) 梅花J(J1.gif) 红桃J(J2.gif) 黑桃J(J3.gif) 方块Q(Q0.gif) 梅花Q(Q1.gif) 红桃Q(Q2.gif) 黑桃Q(Q3.gif) 方块K(K0.gif) 梅花K(K1.gif) 红桃K(K2.gif) 黑桃K(K3.gif) 方块A(A0.gif) 梅花A(A1.gif) 红桃A(A2.gif) 黑桃A(A3.gif) 方块2(20.gif) 梅花2(21.gif) 红桃2(22.gif) 黑桃2(23.gif) 小王XiaoWang(smallJoker.gif) 大王DaWang(bigJoker.gif)
相关阅读
斗地主算法的设计与实现
面向对象实现斗地主程序的核心算法,包括洗牌、发牌、判断牌型、比较牌的大小、游戏规则等。
原文参见: http://FansUnion.cn/articles/2735
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
斗地主算法的设计与实现 五 --洗牌和发牌相关推荐
- Java斗地主算法的设计与实现_斗地主算法的设计与实现–洗牌和发牌
本篇将给出斗地主算法的源码,介绍斗地主这个项目的一些基本情况. 下载地址:http://download.csdn.net/detail/fansunion/6387589 特别说明:斗地主项目的主要 ...
- 斗地主算法的设计与实现(三)--如何比较两手牌的大小
本篇主要讲解斗地主中如何比较两手牌的大小. 友情提示:本篇是接着以下两篇文章就讲解的,建议先看看下面这2篇. 斗地主算法的设计与实现--如何判断一手牌的类型(单,对子,三不带,三带一,四代二等) 斗地 ...
- java斗地主比大小_斗地主算法的设计与实现(三)--如何比较两手牌的大小
本篇主要讲解斗地主中如何比较两手牌的大小. 友情提示:本篇是接着以下两篇文章就讲解的,建议先看看下面这2篇. 牌型比较 火箭最大:炸弹次之:再次是一般牌型(单牌.对牌.三张牌.三带一.单顺.双顺.三顺 ...
- 斗地主棋牌类游戏中的洗牌和发牌算法
前言 洗牌和发牌是棋牌类游戏中,非常重要的两个关键节点,而这两个关键节点涉及的算法,很多同学非常感兴趣,今天,我们就以NodeJS环境为例,通过JS代码给大家解说洗牌和发牌算法. 一. 洗牌算法 1. ...
- 斗地主系列之洗牌和发牌
1.一些说明: 大家都知道,斗地主的一副牌有54张,三位玩家,每位17张牌,3张底牌(17*3+3 = 54). 所以,我们定义一个List: List cards = new ArrayList&l ...
- 编程模拟洗牌和发牌过程c语言,洗牌发牌模拟系统课程设计报告.doc
集美大学诚毅学院 <高级语言程序设计>课程设计 实验报告 题目:洗牌和发牌模拟 专业:计算机科学与技术 班级: 姓名: 成绩: 指导教师: 完成日期:2008 年 6月 26 日 一.目的 ...
- 洗牌、发牌算法 (打乱扑克牌顺序)
#include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b ...
- Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)
Algorithm:C+语言实现之数组相关算法(和为定值的两个数.和为定值的m个数.荷兰国旗.长度为2n的洗牌算法.任意长度数组的洗牌算法) 目录 数组 1.寻找和为定值的两个数 2.和为定值的m个数 ...
- Java中使用HashMap,TreeSet和List来实现模拟斗地主的洗牌和发牌的小例子
模拟斗地主洗牌,发牌 使用HashMap,TreeSet和List来实现 效果如下图所示: 详细实现代码如下: package star.july.tags;import java.util.Arr ...
最新文章
- RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)
- codeforces round #576 div2 D Welfare State(线段树)[单点修改+区间修改]
- 陈程杰、夏瑞:数据分析工具TBtools介绍和操作视频+公众号/社群
- php判断版本根据版本调用不同,C#_C#自动判断Excel版本使用不同的连接字符串,用OLEDB通过设置连接字符串可 - phpStudy...
- MQTT再学习 -- 漫谈MQTT协议
- 《Flex 第一步》
- 你可能没看懂Supercell的新游戏
- 猴子吃桃问题(南阳ACM324)
- [C++11]委托构造函数
- vivo 5G手机日产量10万台 3月销量同比增长超10%
- 解决linux下javac -version和java -version版本显示不一致
- 关于Java中的final关键字
- atitit.404错误的排查流程总结
- 计算机图形学完整笔记(三):裁剪
- 基于R软件的网状meta分析
- mybatis源码详解
- iOS界面调试工具Reveal
- windows下解决弹窗广告
- 设置Windows控制台颜色
- 只会写代码,不如去种田