需求 :使用一个集合对象存储一副扑克牌,将所有扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,并打印玩家和底牌的集合内容
步骤:
步骤:
1、─副扑克牌
将花色和数字分别进行组合,生成所有的普通牌手动添加“大王”、“小王”
1.1.创建数字数组:
String[]nums =
{“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“J”,“Q”,“K”,“A”,“2”};
1.2.创建花色数组:
String[] colors ={“方片”,“梅花”,“红桃”;“黑桃”};
1.3.将每一个花色分别和数字进行拼接
colors[i].concat(nums[]); (这里用循环嵌套)
2、洗牌
使用Collections工具类的shuffle()方法打乱牌的顺序
Collections.shuffle(list);
3、发牌
遍历牌堆,将每一张牌分发到三个玩家集合中留三张作为底牌
3.1定义4个集合,分别代表玩家和底牌
List<Integer> player1 = new ArrayList<>();
List<Integer> player2 = new ArrayList<>();
List<Integer> player3 = new ArrayList<>();
List<Integer> dipai = new ArrayList<>();
3.2具体的发牌动作,将索引和3取模,决定发给谁
3.3查看玩家,底牌编号
4.看牌(因为多个人需要重复下面步骤,所以可以直接写个看牌成员方法)
分别打印每个玩家集合的内容
4.1将玩家集合中的牌按自然顺序进行排序;
Collections.sort(List);
4.2打印玩家的牌
具体代码
import java.util.*;
public class SendPoker {
public static void main(String[] args) {
//买牌
//1.1定义一个双列集合Map,键表示牌的编号,值表示具体的牌, 规则编号越小牌越小
Map<Integer, String> pokers = new HashMap<>();
//1.2定义一个单例集合,用来存储所有牌的编号
List<Integer> list = new ArrayList<>();
//1.3具体的买牌动作
//普通牌,52
/*pokers.put(0, "♠3");
pokers.put(1, "♦3");
pokers.put(2, "♣3");
pokers.put(3, "♥3");*/
//使用循环嵌套
String[] colors = {"♠","♣","♦","♥"};
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
int num = 0; //牌的编号
for (String number : numbers) { //外循环,获取所有点数
for (String color : colors) { //内循环,获取所有花色
String pucker = color + number;
//System.out.println(pucker);
//将牌的编号,具体的牌放入双列集合
pokers.put(num, pucker);
//将牌的编号放入单列集合
list.add(num);
//每添加一张牌,编号自增1
num++;
}
}
//大小王
pokers.put(num, "小王");
list.add(num++); //先添加再自增
pokers.put(num, "大王");
list.add(num); //先添加再自增
//打印牌
System.out.println("所有牌:" + pokers);
System.out.println("牌的编号:" + list);
//2.洗牌,直接调用Collections类中的shuffle()
Collections.shuffle(list);
System.out.println("洗好牌,编号为:" + list);
//3.发牌
//3.1定义4个集合,分别代表玩家和底牌
List<Integer> player1 = new ArrayList<>();
List<Integer> player2 = new ArrayList<>();
List<Integer> player3 = new ArrayList<>();
List<Integer> dipai = new ArrayList<>();
//3.2具体的发牌动作,将索引和3取模,决定发给谁
for (int i = 0; i < list.size(); i++) {
//获取编号
Integer pokerNum = list.get(i);
//System.out.println(pokerNum);
//发牌
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 if (i % 3 ==2) {
player3.add(pokerNum);
}
}
//3.3查看玩家,底牌编号
/*System.out.println("player1:" + player1);
System.out.println("player2:" + player2);
System.out.println("player3:" + player3);
System.out.println("dipai:" + dipai);*/
//4、看牌
System.out.println("player1: " + printPoker(player1,pokers));
System.out.println("player2: " + printPoker(player2,pokers));
System.out.println("player3: " + printPoker(player3,pokers));
System.out.println("dipai : " + printPoker(dipai,pokers));
}
/*
定义一个方法用来看牌
方法名:printPoker
参数列表:List<Integer> Map<Integer,String>
返回值:String
*/
public static String printPoker(List<Integer> nums, Map<Integer,String> pokers) {
//1、对牌的序列升序
Collections.sort(nums);
StringBuilder sb = new StringBuilder();
//2、遍历牌的集合获取到每一个编号,增强for
for (Integer num : nums) {
// num就是要查找牌的具体编号
//根据编号去双列集合找对应的具体牌
String poker = pokers.get(num);
//将获取的牌进行拼接
sb.append(poker + " ");
}
//将最后结果返回
String str = sb.toString();
return str.trim();//两边掉空格
}
}