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

扑克测试题需求说明

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

需求说明:

  • 封装一个扑克牌的类,编写构建一副扑克牌的方法,对指定的扑克牌有排序、洗牌以及对指定的扑克牌有分组排序(按花色分组排序,每组内按大小排序)的方法;从指定的扑克牌中抽取一张牌的方法。
    Java系列(42)——扑克测试题
    Java系列(42)——扑克测试题
  • 类的建立
    Java系列(42)——扑克测试题

示例代码:

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;
	}		
}

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;
	}	
}

ColorGroup 类(分组):
Java系列(42)——扑克测试题

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";
	}		
}

主类(测试):

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("谢谢使用");
	}
}

结果图:
Java系列(42)——扑克测试题
Java系列(42)——扑克测试题
Java系列(42)——扑克测试题
Java系列(42)——扑克测试题

  • 理解需要详细阅读程序,写程序思路和条理很重要,在编写代码之前应当详细理清业务逻辑和相关功能的实现与设计!

如有错误,欢迎指正!