本系列博客汇总在这里:Java系列_汇总


Java系列(42)——扑克测试题_java
注:上图来源于百度百科

一、需求说明
  1. 封装一个扑克牌的类,编写构建一副扑克牌的方法,对指定的扑克牌有排序、洗牌以及对指定的扑克牌有分组排序(按花色分组排序,每组内按大小排序)的方法;从指定的扑克牌中抽取一张牌的方法。
  2. 排序规则
    Java系列(42)——扑克测试题_ide_02
  3. 花色数据表示
    Java系列(42)——扑克测试题_初始化_03
二、类的建立

Java系列(42)——扑克测试题_ide_04

三、参考源码
  1. APoker 类(单张扑克):
    package cn.tx.poker;
    
    public class APoker implements Comparable<APoker>
    {
    	/**
    	  *  花色值
    	 */
    	private int color;
    	
    	/**
    	  *  花色符号
    	 */
    	private String colorText;
    	
    	/**
    	  *  牌值
    	 */
    	private int value;
    	
    	/**
    	  *  牌值符号
    	 */	
    	private String valueText;
    
    	public int getColor()
    	{
    		return color;
    	}
    
    	public void setColor(int color)
    	{
    		this.color = color;
    	}
    
    	public String getColorText()
    	{
    		return colorText;
    	}
    
    	public void setColorText(String colorText)
    	{
    		this.colorText = colorText;
    	}
    
    	public int getValue()
    	{
    		return value;
    	}
    
    	public void setValue(int value)
    	{
    		this.value = value;
    	}
    
    	public String getValueText()
    	{
    		return valueText;
    	}
    
    	public void setValueText(String valueText)
    	{
    		this.valueText = valueText;
    	}
    
    	public APoker(int color, String colorText, int value, String valueText)
    	{
    		super();
    		this.color = color;
    		this.colorText = colorText;
    		this.value = value;
    		this.valueText = valueText;
    	}
    
    	@Override
    	public String toString()
    	{
    		return "\n"+"APoker [  花色 = " + colorText + ",点数 = " + valueText + "\t]";
    	}
    
    	/*
    	  *   重写比较的方法
    	 * @see java.lang.Comparable#compareTo(java.lang.Object)
    	 */
    	@Override
    	public int compareTo(APoker o)
    	{
    		//先根据花色来比较
    		int val = o.color - this.color ;	
    		if(val == 0)
    		{
    			//如果花色相同使用值来比较
    			val = this.value - o.value;
    		}
    		return val;
    	}		
    }
    
  2. Poker 类(一副扑克):
    package cn.tx.poker;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;
    
    public class Pokers
    {
    	/**
    	  *   扑克张数
    	 */
    	private int pokerCount;
    	
    	/**
    	  *  花色数量
    	 */
    	private int colorCount;
    	
    	/**
    	  *  扑克的集合
    	 */
    	private List<APoker> aList;
    	
    	/**
    	  * 存储组的集合
    	 */
    	private List<ColorGroup> cgList;
    
    	public int getPokerCount()
    	{
    		return pokerCount;
    	}
    
    	public void setPokerCount(int pokerCount)
    	{
    		this.pokerCount = pokerCount;
    	}
    
    	public int getColorCount()
    	{
    		return colorCount;
    	}
    
    	public void setColorCount(int colorCount)
    	{
    		this.colorCount = colorCount;
    	}
    
    	public List<APoker> getaList()
    	{
    		return aList;
    	}
    
    	public void setaList(List<APoker> aList)
    	{
    		this.aList = aList;
    	}		
    	
    	/**
    	 * 
    	 * 描述:创建扑克牌的方法
    	 * @return
    	 */
    	public List<APoker> createPoker()
    	{
    		//初始化扑克牌的数量
    		pokerCount = 54;
    		//初始化花色的数量
    		colorCount = 5;
    		//创建扑克集合
    		aList = new ArrayList<APoker>();
    		/*
    		 ♚ ♥ ♦ ♠ ♣
    		 1  2 3 4  5
    		 
    		 A 2 3 4 5 6 7 8 9 10 J  Q  K    S     B
    		 1 2 3 4 5 6 7 8 9 10 11 12 13	14   15
    		*/
    		
    		//循环非王花色
    		for(int i = 2;i <= 5; i++)
    		{
    			//循环非王花色里面的值
    			for(int j = 1; j <= 13;j++)
    			{
    				//花色的符号
    				String colorText = null;
    				//值的符号
    				String valueText = null;
    				
    				//给花色赋值的一个过程
    				colorText = findColorText(i);
    				
    				//给扑克的值赋值符号
    				valueText = findValueText(j);
    								
    				//创建一张扑克对象
    				APoker ap = new APoker(i, colorText, j, valueText);
    				
    				//把每一张扑克对象放入扑克盒
    				aList.add(ap);							
    			}					
    		}
    		
    		//创建小王
    		APoker ap1 = new APoker(1, "♚", 14, "S");
    		
    		//创建大王
    		APoker ap2 = new APoker(1, "♚", 15, "B");
    		
    		//把大小王对象放入扑克盒
    		aList.add(ap1);
    		aList.add(ap2);
    		
    		return aList;
    	}
    	
    	/**
    	 * 
    	 * 描述:洗牌
    	 * @return
    	 */
    	public List<APoker> shufflePoker()
    	{
    		Collections.shuffle(this.aList);
    		return aList;
    	}
    	
    	/**
    	 * 
    	 * 描述:随机抽取一张牌
    	 * @return
    	 */
    	public APoker getRandomPoker()
    	{
    		Random r = new Random();
    		//获取随机索引
    		int index = r.nextInt(this.pokerCount);
    		return aList.get(index);
    	}
    	
    	/**
    	 * 
    	 * 描述:排序
    	 * @return
    	 */
    	public List<APoker> sortPoker()
    	{
    		Collections.sort(aList);
    		return aList;
    	}
    	
    	public List<ColorGroup> sortGroup()
    	{
    		//创建大集合
    		cgList = new ArrayList<ColorGroup>();
    		
    		//遍历扑克牌
    		for(APoker ap : aList)
    		{
    			//获得扑克的花色
    			int color = ap.getColor();
    			//根据花色找组
    			ColorGroup cg = this.findGroup(color);
    			if(cg == null)
    			{
    				//创建一个组
    				ColorGroup cGroup = new ColorGroup();
    				cGroup.setColor(color);
    				
    				//设置花色符号
    				cGroup.setColorText(findColorText(color));
    				//把扑克加入组中
    				cGroup.getApList().add(ap);
    				
    				//把组加入组集合
    				cgList.add(cGroup);
    			}
    			else
    			{
    				cg.getApList().add(ap);
    			}
    			
    		}
    		
    		//获得扑克组中的扑克牌数量
    		for(ColorGroup cg2 : cgList)
    		{
    			//获得组中的集合
    			List<APoker> aList = cg2.getApList();
    			//对组中的集合排序
    			Collections.sort(aList);
    			//获得组的张数
    			cg2.setPokerCount(aList.size());
    		}
    		
    		Collections.sort(cgList);
    		
    		return cgList;
    	}
    	
    	//根据花色找组
    	public ColorGroup findGroup(int color)
    	{	
    		//定义一个组的对象
    		ColorGroup cg1 = null;
    		//遍历组集合
    		for(ColorGroup cg : cgList)
    		{
    			//如果传递过来的花色和其中一个花色匹配
    			if(color == cg.getColor())
    			{
    				cg1 = cg;
    				break;
    			}			
    		}		
    		return cg1;
    	}
    	
    	/**
    	 * 
    	 * 描述:根据花色值找花色的符号
    	 * @param color
    	 * @return
    	 */
    	public String findColorText(int color)
    	{
    		String colorText = null;
    		switch (color)
    		{
    			case 1: colorText = "♚"; break;
    			case 2: colorText = "♥"; break;
    			case 3: colorText = "♦"; break;
    			case 4: colorText = "♠"; break;
    			case 5: colorText = "♣"; break;
    			default:				 break;
    		}
    		return colorText;
    	}
    	
    	public String findValueText(int value)
    	{
    		String valueText = null;
    		switch (value)
    		{		
    			case 1:  valueText = "A"; break;
    			case 11: valueText = "J"; break;
    			case 12: valueText = "Q"; break;
    			case 13: valueText = "K"; break;
    			default: valueText = value+"";break;
    		}
    		return valueText;
    	}	
    }
    
  3. ColorGroup 类(分组):
    Java系列(42)——扑克测试题_ide_05
    package cn.tx.poker;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ColorGroup implements Comparable<ColorGroup>
    {
    	/**
    	  *  组内的扑克数
    	 */
    	private int pokerCount;
    	
    	/**
    	  *  组的花色
    	 */
    	private int color;
    	
    	/**
    	  *  花色符号
    	 */
    	private String colorText;
    	
    	/**
    	  *  组内的扑克
    	 */
    	private List<APoker> apList = new ArrayList<APoker>();
    
    	public int getPokerCount()
    	{
    		return pokerCount;
    	}
    
    	public void setPokerCount(int pokerCount)
    	{
    		this.pokerCount = pokerCount;
    	}
    
    	public int getColor()
    	{
    		return color;
    	}
    
    	public void setColor(int color)
    	{
    		this.color = color;
    	}
    
    	public String getColorText()
    	{
    		return colorText;
    	}
    
    	public void setColorText(String colorText)
    	{
    		this.colorText = colorText;
    	}
    
    	public List<APoker> getApList()
    	{
    		return apList;
    	}
    
    	public void setApList(List<APoker> apList)
    	{
    		this.apList = apList;
    	}
    
    	@Override
    	public int compareTo(ColorGroup o)
    	{		
    		return this.getColor() - o.getColor();
    	}
    
    	@Override
    	public String toString()
    	{
    		return "\n本组扑克数量 = " + pokerCount + ", 本组花色 = " + colorText +"\n"+ apList + "\n";
    	}		
    }
    
  4. 主类(测试)
    package cn.tx.poker;
    
    import java.util.List;
    import java.util.Scanner;
    
    public class Test
    {
    
    	public static void main(String[] args)
    	{	
    		//创建一副扑克牌的对象
    		Pokers p = new Pokers();
    		p.createPoker();
    		
    		boolean b = true;
    		Scanner sc = new Scanner(System.in);	
    		while(b)
    		{			
    			System.out.println("请选择:");
    			System.out.println("1...洗牌");
    			System.out.println("2...随机抽取一张");
    			System.out.println("3...排序");
    			System.out.println("4...分组排序");
    			System.out.println("0...退出");
    			
    			int val = sc.nextInt();
    			switch(val)
    			{
    				case 1:System.out.println(p.shufflePoker());break;
    				case 2:System.out.println(p.getRandomPoker());break;
    				case 3:System.out.println(p.sortPoker());break;
    				case 4:System.out.println(p.sortGroup());break;
    				
    				default: b = false;break;
    			}	
    			if(b!=false){System.out.println("\n");}			
    		}
    		System.out.println("谢谢使用");
    	}
    }
    
  5. 结果图
    Java系列(42)——扑克测试题_ide_06
    Java系列(42)——扑克测试题_赋值_07
    Java系列(42)——扑克测试题_赋值_08
    Java系列(42)——扑克测试题_java_09
    理解需要详细阅读程序,写程序思路和条理很重要,在编写代码之前应当详细理清业务逻辑和相关功能的实现与设计!

如有错误,欢迎指正!