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 类(分组):
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("谢谢使用");
}
}
结果图:
- 理解需要详细阅读程序,写程序思路和条理很重要,在编写代码之前应当详细理清业务逻辑和相关功能的实现与设计!
如有错误,欢迎指正!