需求分析:使用一个集合对象存储一副扑克牌,将所有扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,并打印玩家和底牌的集合内容。主要分为4步,买牌,洗牌,发牌,看牌,采用junit单元测试,需要导入junit的jar包。
具体步骤:
1.准备工作
//1.定义一个双列集合,键:表示牌的编号。值:表示牌具体的值
Map<Integer,String> pokers=new HashMap<>();
//2.定义一个单列集合,存放牌的编号
List<Integer> list=new ArrayList<>();
//普通牌52张,大小王另外添加
int num=0;//表示牌的编号
String[] colors={"♥","♠","♣","♦"};//四种花色的牌,红桃,黑桃,梅花,方片
String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2",};//牌的数字
2.模拟买牌动作并洗牌
@Test
public void sendPoker(){
for (String nums : numbers) { //外循环,获取所有的颜色
for (String color : colors) { //内循环,获取所有的数字
String poker=color+nums; //拼接颜色和数字
pokers.put(num,poker); //将牌的编号,具体的牌放到双列集合中
list.add(num);//将牌的编号放到单列集合,num自增
num++;
}
}
//添加小王和大王
pokers.put(num,"小王");
list.add(num++);
pokers.put(num,"大王");
list.add(num++);
System.out.println("买牌动作,查看所有的牌----------------------------");
System.out.println("所有的牌:"+pokers);
System.out.println("牌的编号:"+list);
//2.洗牌
Collections.shuffle(list);
System.out.println("洗牌后:"+list);
}
测试下买牌动作:
总共有54张牌,每张牌对应一个编号和值。
3.模拟发牌动作。
洗牌的过程和简单,只需调用以下代码即,参数为你定义的集合名字,这个方法就是把一个集合中的顺序打乱。
Collections.shuffle(list);
具体的发牌代码:
@Test
public void givePoker(){
//1定义四个集合,表示三个玩家和底牌
sendPoker();
List<Integer> player1=new ArrayList<>();
List<Integer> player2=new ArrayList<>();
List<Integer> player3=new ArrayList<>();
List<Integer> diPai=new ArrayList<>();
//2具体的发牌动作,将索引和3取模,决定具体发给谁,按照player1,player2,player3的顺序发牌
for(int i=0;i<list.size();i++){
Integer pokerNum=list.get(i);
if(i>=list.size()-3){
diPai.add(pokerNum);//最后三张牌留作底牌
}
else if(i%3==0){
player1.add(pokerNum);
}
else if(i%3==1){
player2.add(pokerNum);
}
else {
player3.add(pokerNum);
}
}
//3.查看玩家牌的编号,还有底牌的编号
System.out.println("发牌动作,查看玩家牌的编号和底牌的编号--------------------------------------------");
System.out.println("player1的牌:"+player1);
System.out.println("player2的牌"+player2);
System.out.println("player3的牌"+player3);
System.out.println("底牌:"+diPai);
//4.查看玩家具体的牌和底牌
System.out.println("查看牌,查看玩家具体的牌和底牌---------------------------------------");
System.out.println("player1玩家的牌:"+printPoker(player1,pokers));
System.out.println("player2玩家的牌:"+printPoker(player2,pokers));
System.out.println("player3玩家的牌:"+printPoker(player3,pokers));
System.out.println("底牌:"+printPoker(diPai,pokers));
}
测试发牌动作和查看具体的牌:
4.定义一个方法,获取具体的牌
public String printPoker(List<Integer> nums,Map<Integer,String> pokers){
//将编号进行升序排序
Collections.sort(nums);
StringBuilder sb=new StringBuilder();
for (Integer num : nums) { //遍历牌的编号集合,获取具体的牌
String poker=pokers.get(num);//根据编号获取具体的牌
sb.append(poker+" ");//加上空格分割
}
String str=sb.toString();
return str.trim();//指定要删除首部和尾部空格的字符串返回值String。
}