`
MouseLearnJava
  • 浏览: 467299 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java洗牌

    博客分类:
  • Java
阅读更多
如何得到一副洗过的牌的集合呢,如果用JAVA实现,最方便的就是调用Collections的方法shuffle来进行洗牌。一个很简单的随机产生纸牌的思路如下:

根据纸牌的张数(length),上千次产生0~ length-1的随机数,然后产生随机数对应位置的纸牌与第一张纸牌进行交换,经过上千次的交换,足以达到使纸牌乱序的效果。

该小程序能够产生一副或者多幅随即牌。

具体的程序如下.

package cards.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * <code>CardsUtil</code>是一个随机产生纸牌的工具类
 * <p>
 * 1. 利用Collections的方法shuffle来进行洗牌 2. 根据纸牌的长度(length),上千次产生0~ length-1的随机数,
 * 然后产生随机数的纸牌与第一张纸牌进行交换,经过上千次的交换 足以达到使纸牌乱序的效果。
 * </p>
 * 
 * @author Eric
 * @version 1.0
 * 
 */
public final class CardsUtil {

 /**
  * @param includeJoker
  *            是否需要包括大小王
  * @return
  */
 private static List<Card> initCards(boolean includeJoker) {
  List<Card> cardList = new ArrayList<Card>();
  for (int i = 1; i <= 13; i++) {
   cardList.add(new Card(i, CardType.SPADES));
   cardList.add(new Card(i, CardType.HEARTS));
   cardList.add(new Card(i, CardType.DIAMONDS));
   cardList.add(new Card(i, CardType.CLUBS));
  }
  if (includeJoker) {
   cardList.add(new Card(0, CardType.LITTLE_JOKER));
   cardList.add(new Card(0, CardType.BIG_JOKER));
  }
  return cardList;
 }

 /**
  * 
  * @param number
  *            牌的数量(2副,3副.....)
  * @param includeJoker
  *            是否需要包括大小王
  * @return
  */
 private static List<Card> initCards(int number, boolean includeJoker) {
  List<Card> cardList = new ArrayList<Card>();
  for (int i = 0; i < number; i++) {
   cardList.addAll(initCards(includeJoker));
  }
  return cardList;
 }

 /**
  * 调用Collections的shuffle方法来达到乱序的效果
  * 
  * @param list
  * @return
  */
 public static List<Card> shuffleByCollections(List<Card> list) {
  Collections.shuffle(list);
  return list;
 }

 /**
  * 根据纸牌的长度(length),上千次产生0~ length-1的随机数, 然后产生随机数的纸牌与第一张纸牌进行交换,经过上千次的交换
  * 足以达到使纸牌乱序的效果。 (此方法适用于一副牌的时候)
  * 
  * @param list
  * @param includeJoker
  * @return
  */
 public static List<Card> shuffle(List<Card> list, boolean includeJoker) {
  int seed = includeJoker ? 54 : 52;
  Random random = new Random();
  int randomNumber = 0;
  for (int i = 0; i < 1000; i++) {
   randomNumber = random.nextInt(seed);
   swapCard(list, randomNumber);
  }
  return list;
 }

 private static List<Card> swapCard(List<Card> list, int randomNumber) {
  Card temp = list.get(0);
  list.set(0, list.get(randomNumber));
  list.set(randomNumber, temp);
  return list;
 }

 /**
  * 根据纸牌的长度(length),上千次产生0~ length-1的随机数, 然后产生随机数的纸牌与第一张纸牌进行交换,经过上千次的交换
  * 足以达到使纸牌乱序的效果。 (此方法适用于一副牌或者多幅牌的时候)
  * 
  * @param list
  * @param number
  * @param includeJoker
  * @return
  */
 private static List<Card> shuffle(List<Card> list, int number,
   boolean includeJoker) {
  int seed = includeJoker ? 54 * number : 52 * number;
  Random random = new Random();
  int randomNumber = 0;
  for (int i = 0; i < 1000 * number; i++) {
   randomNumber = random.nextInt(seed);
   swapCard(list, randomNumber);
  }
  return list;
 }

 /**
  * 获取一副牌,洗牌后的结果
  * 
  * @param includeJoker
  * @return
  */
 public static List<Card> retrieveShuffledCards(boolean includeJoker) {
  return shuffle(initCards(includeJoker), includeJoker);
 }

 /**
  * 获取一副牌或者多副牌,洗牌后的结果
  * 
  * @param number
  * @param includeJoker
  * @return
  */
 public static List<Card> retrieveShuffledCards(int number,
   boolean includeJoker) {
  return shuffle(initCards(number, includeJoker), number, includeJoker);
 }

 /**
  * 调用Collectios 的shuffle方法, 获取一副牌,洗牌后的结果
  * 
  * @param includeJoker
  * @return
  */
 public static List<Card> retrieveShuffledCardsByCollections(
   boolean includeJoker) {
  List<Card> cardList = initCards(includeJoker);
  Collections.shuffle(cardList);
  return cardList;
 }

 /**
  * 调用Collectios 的shuffle方法, 获取一副牌或者多副牌,洗牌后的结果
  * 
  * @param number
  * @param includeJoker
  * @return
  */
 public static List<Card> retrieveShuffledCardsByCollections(int number,
   boolean includeJoker) {
  List<Card> cardList = initCards(number, includeJoker);
  Collections.shuffle(cardList);
  return cardList;
 }

}



package cards.util;

import java.util.HashMap;
import java.util.Map;

public enum CardType {

 SPADES("S", "黑桃"), HEARTS("H", "红桃"), DIAMONDS("D", "方块"), CLUBS("P", "梅花"), BIG_JOKER(
   "BJ", "大王"), LITTLE_JOKER("LJ", "小王"), UNKNOWN("U", "UNKNOWN");

 private static final Map<String, CardType> MAP = new HashMap<String, CardType>();
 static {
  for (CardType cardType : CardType.values()) {
   MAP.put(cardType.getCardTypeCode(), cardType);
  }
 }

 private String cardTypeCode = null;

 private String cardTypeDescription = null;

 public CardType getCardTypeByCode(String cardTypeCode) {
  return MAP.containsKey(cardTypeCode) ? MAP.get(cardTypeCode) : UNKNOWN;
 }

 /**
  * @return the cardTypeCode
  */
 public String getCardTypeCode() {
  return cardTypeCode;
 }

 /**
  * @param cardTypeCode
  *            the cardTypeCode to set
  */
 public void setCardTypeCode(String cardTypeCode) {
  this.cardTypeCode = cardTypeCode;
 }

 /**
  * @return the cardTypeDescription
  */
 public String getCardTypeDescription() {
  return cardTypeDescription;
 }

 /**
  * @param cardTypeDescription
  *            the cardTypeDescription to set
  */
 public void setCardTypeDescription(String cardTypeDescription) {
  this.cardTypeDescription = cardTypeDescription;
 }

 /**
  * @param cardTypeCode
  * @param cardTypeDescription
  */
 private CardType(String cardTypeCode, String cardTypeDescription) {
  this.cardTypeCode = cardTypeCode;
  this.cardTypeDescription = cardTypeDescription;
 }

}


package cards.util;

import java.io.Serializable;

public class Card implements Serializable {

 private static final long serialVersionUID = 4709869689433952388L;

 // 纸牌的点数
 private int points = 0;
 // 纸牌类型
 private CardType cardType = null;

 public Card() {
 }

 /**
  * @param points
  * @param cardType
  */
 public Card(int points, CardType cardType) {
  this.points = points;
  this.cardType = cardType;
 }

 /**
  * @return the points
  */
 public int getPoints() {
  return points;
 }

 /**
  * @param points
  *            the points to set
  */
 public void setPoints(int points) {
  this.points = points;
 }

 /**
  * @return the cardType
  */
 public CardType getCardType() {
  return cardType;
 }

 /**
  * @param cardType
  *            the cardType to set
  */
 public void setCardType(CardType cardType) {
  this.cardType = cardType;
 }

}


package cards.util;

import java.util.List;

public class CardsTest {

 public static void main(String[] args) {

  boolean includeJoker = true;//true代表包括大小王,false则不包括
  int number = 1;//number代表几幅牌,默认为一副牌
  System.out.println("************** 一副牌(包括大小王)洗牌后的结果 (start)******************");
  printCards(CardsUtil.retrieveShuffledCards(number, includeJoker));
  System.out.println("************** 一副牌(包括大小王)洗牌后的结果 (end)******************");
  System.out.println();
  includeJoker = false;
  System.out.println("************** 一副牌(不包括大小王)洗牌后的结果 (start)******************");
  printCards(CardsUtil.retrieveShuffledCards(number, includeJoker));
  System.out.println("************** 一副牌(不包括大小王)洗牌后的结果 (end)******************");
  System.out.println();
  includeJoker = true;
  number=2;
  System.out.println("************** 两副牌(包括大小王)洗牌后的结果 (start)******************");
  printCards(CardsUtil.retrieveShuffledCards(number, includeJoker));
  System.out.println("************** 两副牌(包括大小王)洗牌后的结果 (end)******************");
  System.out.println();
  includeJoker = false;
  System.out.println("************** 两副牌(不包括大小王)洗牌后的结果 (start)******************");
  printCards(CardsUtil.retrieveShuffledCards(number, includeJoker));
  System.out.println("************** 两副牌(不包括大小王)洗牌后的结果 (end)******************");
  System.out.println();
  
 }

 private static void printCards(List<Card> list) {
  for (Card card : list) {
   System.out.print(card.getCardType().getCardTypeDescription());
   System.out.print(" ");
   System.out.println(card.getPoints());
  }
 }

}


几个测试的结果如下:

************** 一副牌(包括大小王)洗牌后的结果 (start)******************
方块 12
梅花 9
红桃 1
梅花 1
红桃 6
黑桃 8
红桃 4
黑桃 6
方块 3
方块 1
黑桃 3
红桃 2
红桃 13
方块 8
梅花 3
红桃 7
方块 2
梅花 2
方块 11
梅花 4
方块 13
方块 7
梅花 11
红桃 8
红桃 5
方块 9
方块 10
红桃 3
方块 4
梅花 8
黑桃 4
黑桃 10
黑桃 9
梅花 6
黑桃 7
黑桃 2
方块 5
黑桃 11
红桃 12
红桃 11
大王 0
梅花 5
梅花 13
黑桃 13
梅花 7
梅花 10
梅花 12
红桃 9
黑桃 5
黑桃 1
红桃 10
方块 6
小王 0
黑桃 12
************** 一副牌(包括大小王)洗牌后的结果 (end)******************

************** 一副牌(不包括大小王)洗牌后的结果 (start)******************
方块 3
方块 4
红桃 1
红桃 6
方块 5
方块 7
方块 1
黑桃 3
方块 2
梅花 3
红桃 12
梅花 12
方块 12
黑桃 4
方块 11
黑桃 12
黑桃 8
红桃 8
梅花 7
红桃 10
方块 6
梅花 2
黑桃 6
红桃 11
黑桃 7
黑桃 2
梅花 1
梅花 13
红桃 9
梅花 5
黑桃 5
方块 9
方块 13
黑桃 11
方块 8
梅花 9
梅花 6
梅花 4
梅花 8
黑桃 1
红桃 13
黑桃 10
红桃 3
红桃 2
红桃 5
红桃 4
红桃 7
方块 10
黑桃 13
梅花 11
黑桃 9
梅花 10
************** 一副牌(不包括大小王)洗牌后的结果 (end)******************

************** 两副牌(包括大小王)洗牌后的结果 (start)******************
方块 5
梅花 6
梅花 12
红桃 6
方块 4
红桃 11
黑桃 8
梅花 6
梅花 5
红桃 6
红桃 7
红桃 2
梅花 11
梅花 4
梅花 10
梅花 1
黑桃 8
小王 0
方块 7
黑桃 9
红桃 4
方块 1
红桃 8
黑桃 10
红桃 1
梅花 7
梅花 13
方块 10
方块 10
红桃 3
方块 11
大王 0
方块 13
方块 6
方块 3
黑桃 3
方块 1
黑桃 7
方块 4
方块 2
黑桃 6
红桃 4
方块 9
红桃 13
梅花 10
方块 13
黑桃 10
黑桃 4
方块 7
大王 0
红桃 10
方块 8
梅花 9
梅花 2
方块 12
红桃 12
方块 6
黑桃 7
红桃 5
方块 12
黑桃 11
红桃 2
黑桃 3
黑桃 4
红桃 10
梅花 8
黑桃 6
小王 0
黑桃 12
黑桃 13
红桃 5
红桃 13
梅花 3
方块 5
方块 2
方块 3
黑桃 13
红桃 7
梅花 4
黑桃 2
梅花 3
方块 9
黑桃 1
梅花 13
黑桃 11
红桃 9
梅花 11
方块 8
梅花 7
梅花 5
方块 11
红桃 12
梅花 2
黑桃 2
梅花 1
黑桃 5
红桃 3
黑桃 5
红桃 11
黑桃 12
红桃 1
黑桃 1
梅花 8
黑桃 9
梅花 9
梅花 12
红桃 8
红桃 9
************** 两副牌(包括大小王)洗牌后的结果 (end)******************

************** 两副牌(不包括大小王)洗牌后的结果 (start)******************
梅花 10
红桃 6
梅花 13
红桃 12
方块 6
红桃 10
红桃 3
梅花 7
方块 13
红桃 9
黑桃 13
梅花 1
黑桃 3
黑桃 5
方块 12
梅花 12
红桃 12
梅花 6
方块 10
黑桃 1
红桃 8
黑桃 10
红桃 11
梅花 5
红桃 8
梅花 3
红桃 1
梅花 2
红桃 13
方块 8
梅花 4
梅花 12
方块 5
黑桃 4
梅花 5
红桃 7
红桃 3
黑桃 4
梅花 9
梅花 10
方块 12
黑桃 5
方块 9
梅花 6
梅花 3
黑桃 11
方块 8
红桃 2
方块 10
方块 1
梅花 11
黑桃 7
黑桃 8
红桃 4
方块 5
黑桃 12
梅花 2
黑桃 8
方块 2
红桃 5
红桃 13
方块 11
梅花 8
黑桃 3
红桃 7
黑桃 9
方块 2
黑桃 10
梅花 8
方块 9
梅花 11
红桃 6
黑桃 12
方块 13
红桃 2
方块 7
梅花 7
方块 7
黑桃 11
红桃 1
黑桃 2
黑桃 7
方块 11
梅花 9
黑桃 1
方块 3
黑桃 2
梅花 13
红桃 9
方块 4
方块 1
黑桃 13
红桃 11
梅花 4
红桃 4
方块 4
梅花 1
方块 3
黑桃 6
黑桃 9
红桃 5
红桃 10
黑桃 6
方块 6
************** 两副牌(不包括大小王)洗牌后的结果 (end)******************




分享到:
评论
1 楼 keepgoing 2013-08-27  

相关推荐

    java洗牌游戏

    在Java编程语言中,"java洗牌游戏"通常是指创建一个程序来模拟扑克牌的洗牌过程。这个项目非常适合初学者学习,因为它涉及到基础的数组操作、随机数生成以及简单的图形用户界面(GUI)设计。下面我们将深入探讨相关...

    java洗牌代码

    在Java编程语言中,"洗牌"是一种常见的算法,它常用于模拟扑克牌游戏或者其他需要随机排列元素的场景。这个过程通常涉及到数组或集合的随机排序。在这个问题中,我们关注的是如何使用`java.util.Random`类来实现这一...

    java 洗牌发牌代码

    根据给定的信息,我们可以分析并总结出以下与Java洗牌发牌代码相关的知识点: ### Java洗牌发牌程序概述 这段代码实现了一个简单的洗牌发牌功能,使用Java语言编写。程序的目标是模拟扑克牌游戏中的洗牌和发牌过程...

    Java洗牌游戏代码

    洗牌程序 将数组元素打乱的算法代码,初学Java的朋友可以参考一下思路,还是很有帮助的,内容比较简单,老师也可以用来教学生。

    java 洗牌发牌

    挺容易理解的 关于洗牌发牌的简易代码

    JAVA洗牌器

    这是一个自动洗牌的jar程序,可以自行输入卡牌来随机抽取

    Java洗牌问题

    Java的洗牌问题,包括其中的一个取4张牌和为24的组合的所有可能次数!

    Java模拟人工洗牌

    ### Java模拟人工洗牌知识点解析 #### 一、概述 本篇主要介绍如何利用Java语言实现一种模拟人工洗牌的功能。在程序设计中,洗牌算法通常用来随机化一组元素的顺序,使得每次运行程序时都能得到不同的结果,这对于...

    Java实现模拟洗牌的程序

    在Java编程中,模拟洗牌是一个常见的练习,它涉及到数组操作和随机数生成。这个程序主要包含三个核心类:`Handler`、`Card`和`CardColor`。下面将详细解释这些类及其功能。 首先,`Card`类代表扑克牌,它通常包括牌...

    java模拟人工洗牌代码

    编写一个模拟人工洗牌的程序,将洗好的牌分别发给四个人。 使用结构card 来描述一张牌,用随机方法来模拟人工洗牌的过程,最后将洗好的52张牌顺序分别发给四个人。 设计要求: 1)要求使用java类包中的Math.Random()...

    Java模拟扑克牌洗牌发牌过程

    在本文中,我们将深入探讨如何使用Java编程语言来模拟扑克牌的洗牌和发牌过程。这个过程涉及到了数组、随机数生成、以及基本的算法设计。首先,我们需要理解扑克牌的基本规则和结构。 扑克牌通常包含52张牌,分为四...

    斗地主洗牌发牌java小程序

    一个实现斗地主洗牌发牌的java小程序,主要用了hashmap,Arraylist等java常用类,适合初学者学习

    java模拟人工洗牌(改进版)

    编写一个模拟人工洗牌的程序,将洗好的牌分别发给四个人。 使用结构card 来描述一张牌,用随机方法来模拟人工洗牌的过程,最后将洗好的52张牌顺序分别发给四个人。 设计要求: 1)要求使用java类包中的Math.Random()...

    java模拟斗地主洗牌发牌-可拓展

    2)、洗牌:将Map集合的键放在List中,在使用Collections.shuffle()进行洗牌 3)、发牌:发给三个人,就是三个List加一个底牌的List 4)、看牌:将三人的List和底牌List的值进行排序(从大到小)

    java斗地主发牌小程序

    2. **随机洗牌**:洗牌的关键在于随机性,以确保每次游戏开始时牌的顺序都是不确定的。在Java中,我们可以使用`java.util.Random`类的`nextInt()`方法来实现。将所有牌放入一个列表,然后使用Fisher-Yates(也称为...

    自己写的一个洗扑克牌的java程序.pdf

    通过编写和理解这个Java洗牌程序,初学者不仅可以提升对Java编程的理解,还能学习到如何在实际开发中运用随机算法,以及如何通过单元测试保证代码质量。这个示例虽然简单,但却是一个将理论知识应用到实际编程实践中...

    java人工洗牌

    ### Java人工洗牌知识点解析 在给定的代码示例中,我们看到了一个典型的Java程序,用于模拟洗牌和发牌的过程。这个程序涉及到几个关键的Java概念和技术点,包括面向对象编程(OOP)、数组、字符串操作、随机数生成...

    斗地主洗牌发牌算法

    在Java中,可以使用ArrayList存储牌,并结合Collections.shuffle()方法实现洗牌。例如: ```java import java.util.ArrayList; import java.util.Collections; public class Game { private ArrayList&lt;Integer&gt; ...

    java模拟斗地主的洗牌发牌.rar

    在Java编程语言中,模拟斗地主游戏的洗牌、发牌和看牌过程是一项有趣的实践,这有助于加深对集合框架的理解。在这个项目中,主要使用了三种集合类:HashMap、ArrayList和TreeSet,它们各自有其独特的特性和用途。 ...

Global site tag (gtag.js) - Google Analytics