`
xiaolongfeixiang
  • 浏览: 236434 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

一个简单的计算机发牌程序

阅读更多

共有4个文件组成:

1、Suit.java

2、Rank.java

3、Card.java

4、CardDeal.java

 

 

Suit.java用来定义牌的套数。ENUM中的排列顺序,决定了对Card排序时的优先级。

 

package app.xjtu;

/**
 * 定义牌的套数,共有“桃”“杏”“梅花”“方块”四套
 */
public enum Suit {
	HEARTS("桃"),SPADES("杏"),CLUBS("梅花"),DIAMONDS("方块");
	
	private String info;
	
	Suit(String info){
		this.info = info;
	}
	
	@Override
	public String toString() {
		return info;
	}
}

 

 

Rank.java定义了每套牌的牌面。(这里省略了2张特殊的牌)。ENUM中的排列顺序,决定了对Card排序时的优先级。

package app.xjtu;

/**
 * 定义每套牌的牌面
 */
public enum Rank{

	ACE("A"),DEUCE("2"),THREE("3"),FOUR("4"),FIVE("5"),SIX("6"),SEVEN("7"),
	EIGHT("8"),NINE("9"),TEN("10"),JACK("J"),QUEEN("Q"),KING("K");
	

	private String info;
	
	Rank(String info){
		this.info = info;
	}
	
	@Override
	public String toString() {
		return info;
	}
	
}

 

Card.java定义了一张牌。

package app.xjtu;

import java.util.ArrayList;
import java.util.List;

public class Card implements Comparable<Card> {
	private final Rank rank;
	private final Suit suit;

	private Card(Rank rank, Suit suit) {
		this.rank = rank;
		this.suit = suit;
	}

	private static final List<Card> protoDeck = new ArrayList<Card>();

	/**
	 * 完成对一副新扑克的制作
	 */
	static {
		for (Suit suit : Suit.values()) {
			for (Rank rank : Rank.values()) {
				protoDeck.add(new Card(rank, suit));
			}
		}
	}

	/**
	 * @return 返回一副整齐的扑克
	 */
	public static ArrayList<Card> newDeck() {
		return new ArrayList<Card>(protoDeck);
	}

	/**
	 * 排序:
	 * 1、不同级,按桃、杏、梅、方的顺序排列
	 * 2、同级,则按A 2 3 4 5 6 7 8 9 10 J Q K的顺序排列 
	 */
	@Override
	public int compareTo(Card o) {
		if(this.equals(o)){
			return 0;
		}else{
			if(this.suit.equals(o.suit)){
				return this.rank.compareTo(o.rank);
			}else{
				return this.suit.compareTo(o.suit);
			}
		}
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Card) {
			Card other = (Card) obj;
			if (this.rank.equals(other.rank) && this.suit.equals(other.suit))
				return true;
			else
				return false;
		} else {
			return false;
		}
	}
	
	@Override
	public String toString() {
		return this.suit+":"+this.rank;
	}
}

 

CardDeal.java包装了对Card的基本操作:

 

 

package app.xjtu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CardDeal {
	
	/**
	 * 得到一副牌(可以是整齐的、也可以是洗过的)
	 * @param shuffle 是否洗牌。
	 * @return 一副牌
	 */
	public static  List<Card> getProtoDeck(boolean shuffle){
		List<Card> deck =  Card.newDeck();
		if(shuffle){
			Collections.shuffle(deck);
		}
		 return deck;
	}

	/**
	 * 对指定的牌,洗牌。
	 * @param deck 要洗的牌
	 */
	public static void shuffle(List<Card> deck){
		Collections.shuffle(deck);
	}
	
	/**
	 * 发牌给所有人。在牌数不均时,玩家序号大的,多得1张牌。
	 * @param deck	所有的牌
	 * @param n	参与的玩家
	 * @return	玩家的序号和玩家的牌,所组成的Map类型。
	 */
	public static Map<Integer, ArrayList<Card>> deal(List<Card> deck, int n) {

		Map<Integer, ArrayList<Card>> map = new HashMap<Integer, ArrayList<Card>>();

		int key = n;
		int deckSize = deck.size();
		// 每人至少有这么多的牌
		int perHand = (deckSize - 1) / n;

		do {
			deckSize = deck.size();
			List<Card> handView = deck.subList(deckSize - perHand, deckSize);
			ArrayList<Card> hand = new ArrayList<Card>(handView);
			map.put(key, hand);
			handView.clear();
			key--;
		} while (key > 0);

		// 发多余的牌
		for (int i = 0; i < deck.size(); i++) {
			map.get(n - i).add(deck.get(i));
		}
		return map;
	}
	
	/**
	 * 对一系列的Card进行排序
	 * @param cards 要排序的Card集合
	 */
	public static void sortCards(List<Card> cards){
		Collections.sort(cards);
	}
}

 

 

 

测试程序:

package app.xjtu;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class TestCard {

	public static void main(String[] args) {

		// 获得一副牌
		List<Card> deck = CardDeal.getProtoDeck(false);
		// 要求洗牌
		CardDeal.shuffle(deck);
		// 发牌
		Map<Integer,ArrayList<Card>> hands = CardDeal.deal(deck, 5);
		// 查看每个人的牌
		
		for(Entry<Integer,ArrayList<Card>> hand : hands.entrySet()){
			// 排列得到的牌
			CardDeal.sortCards(hand.getValue());
			// 输出每个玩家的牌
			System.out.println("玩家 "+hand.getKey()+" : (共有"+hand.getValue().size()+")的牌 :");
			System.out.println(hand.getValue());
		}
	}

}

 

测试结果信息:



 

  • 大小: 9.9 KB
0
0
分享到:
评论
1 楼 soliucheng 2011-09-08  
阿龙,人才啊。

相关推荐

    一个扑克牌游戏斗地主发牌程序

    ### 标题:“一个扑克牌游戏斗地主发牌程序” 该标题表明这是一个针对斗地主游戏发牌逻辑的程序设计案例。斗地主是一种流行的扑克牌游戏,在中国尤其受欢迎。其基本玩法包括三名玩家轮流叫分确定“地主”,然后进行...

    经典桥牌发牌程序(vc++ 2008)

    在这个经典桥牌发牌程序中,我们主要关注的是如何通过编程实现公正、随机的发牌过程。这个程序是用Microsoft Visual C++ 2008编写的,这是一款强大的C++集成开发环境,提供了丰富的库支持和调试工具。 首先,`...

    C语言编写的扑克牌发牌程序

    本项目是使用C语言实现的一个扑克牌发牌程序,它涉及到计算机科学中的几个关键概念,包括随机数生成、数组操作以及算法设计。 首先,让我们深入了解一下随机数在编程中的应用。在本程序中,随机数被用来模拟扑克牌...

    斗地主发牌程序

    这是一个用C++语言编写的斗地主发牌程序,旨在模拟斗地主游戏中的发牌过程。斗地主是一种流行于中国的扑克牌游戏,通常由三名玩家参与,每名玩家会分得一定数量的牌,剩余的牌作为底牌。 ### 2. 关键数据结构与变量...

    java实现模拟发牌

    java实现模拟发牌算法,纯java代码 有注释

    发牌游戏程序

    只是一个关于计算机洗牌发牌简单易懂的程序,C实现的,运行很好,仅供参考

    随机发牌源程序 vc++6.0

    通常,一个简单的实现可能会包括以下几个部分: 1. 定义扑克牌的枚举或结构体。 2. 初始化52张牌的数组。 3. 使用`srand(time(NULL))`设置随机数种子。 4. 应用Fisher-Yates洗牌算法对牌数组进行洗牌。 5. 模拟发牌...

    CSharp斗地主随机发牌程序

    发牌程序首先创建一个`Random`对象,然后利用它的`Next`方法生成0到特定范围内的整数,来决定每张牌的归属。 接下来,我们需要一个数据结构来存储和管理牌。通常可以使用数组或列表(`List&lt;T&gt;`)来实现。在C#中,...

    发牌程序_终极应用举例

    这个名为"发牌程序_终极应用举例"的压缩包很可能是包含了一个用于实现随机发牌功能的源代码示例。让我们深入探讨一下这个主题。 首先,我们需要理解“发牌”在计算机编程中的概念。在编程中,发牌过程通常涉及到...

    模拟洗牌与发牌程序用C++写的

    下面是一个简化的C++代码示例,展示了如何实现洗牌和发牌功能: ```cpp #include #include #include #include // 定义扑克牌结构体 struct Card { int value; std::string suit; }; // 初始化一副扑克牌 ...

    VB6编写的斗地主发牌程序,用于练习斗地主的各项技术

    本文将深入探讨一个使用VB6编写的斗地主发牌程序,以此为切入点,讲解相关编程技术和斗地主游戏的逻辑。 首先,斗地主是一种广受欢迎的扑克牌游戏,其规则复杂且策略性强。在这个VB6程序中,开发者通过编程实现了发...

    C++扑克牌的洗牌发牌游戏设计 程序设计:扑克牌的洗牌发牌游戏 .zip

    在本项目中,我们将探讨如何使用C++编程语言设计一个扑克牌的洗牌和发牌游戏。这个程序设计任务涉及到许多关键的计算机科学概念,包括数据结构、算法、随机数生成以及面向对象编程。 首先,我们需要创建扑克牌的...

    随机发52张牌并排序

    在C语言中,可以创建一个二维数组来表示牌的分配,如`int cards[4][13]`,其中每个子数组代表一个人手中的牌,长度13是因为每个人平均获得13张牌。我们可以使用循环结构和索引来分别填充这四个子数组。 然后,对于...

    随机洗牌程序 C源代码

    本篇将详细解析一个基于C语言实现的随机洗牌程序。首先,我们需要理解C语言的基本语法和随机数生成机制。 C语言是计算机科学中的基础编程语言,以其简洁和高效著称。在这个随机洗牌程序中,我们将用到数组、循环和...

    数据结构课程设计之随机发牌

    在牌类游戏中,随机发牌是一个核心功能,它需要确保每一轮发牌后,每名玩家得到的牌都是随机且无重复的。在VC6.0环境下实现这样的功能,开发者可能使用了C++语言,因为这是微软提供的一个经典IDE,适合进行Windows...

    C语言自动发牌系统

    在本项目中,我们探讨的是一个用C语言编写的自动发牌系统,特别针对四人桥牌游戏。四人桥牌是桥牌的一种形式,需要四个玩家分为两对进行合作,其策略性和技巧性极强。自动发牌系统在这个游戏中起到了关键作用,它能...

    纸牌程序,只有源代码,没有文档

    标题中的“纸牌程序”指的是一个计算机程序,它模拟了我们常见的纸牌游戏,可能是单人版的接龙或者其他的纸牌玩法。由于标题提到“只有源代码,没有文档”,这意味着这个程序没有配套的用户手册或开发文档,使用者...

    扑克牌洗牌程序

    标题中的“扑克牌洗牌程序”是指一个计算机程序,它模拟了实际扑克游戏中洗牌的过程。这个程序由C#编程语言编写,并在Visual Studio 2005(简称VS2005)集成开发环境中开发。C#是一种面向对象的编程语言,广泛应用于...

    FAPAI.rar_发牌_斗地主

    在"www.pudn.com.txt"和"发牌程序"这两个文件中,"www.pudn.com.txt"可能是一个链接或者说明文件,通常不包含代码,而"发牌程序"很可能是包含实际代码的文件,可能用C++、Python、Java等语言编写,实现了上述的发牌...

    C语言课程设计 扑克牌自动发牌

    【C语言课程设计 - 扑克牌自动发牌】是一个典型的程序设计任务,旨在通过实现自动发牌功能来让学生掌握C语言中的数组、指针和函数等核心概念。以下是关于这个项目的详细说明: 1. **问题重述**: 扑克牌自动发牌...

Global site tag (gtag.js) - Google Analytics