集合经典案例:斗地主发牌功能实现
集合经典案例:斗地主发牌功能实现
案例分析:
1,生成牌
利用单列集合,存储花色和牌面点数--->用双for循环组合每张牌面(花色+点数)
双列map集合,存储每种组合的牌面(key值存序号,value值存储牌面值, 便于后期整理牌面时,利用序号,使牌面按顺序排列)
2.发牌-->整理扑克
利用双列map集合的keySet()方法获取所有的key值,然后存到单列集合中(利用其构造方法,可一次添加)
用collections单列集合大管家(工具类)的shuffle方法,打乱,然后利用个数(for循环的值是单列集合的下标)依次发牌(单列集合中的值)
发完后,利用单列集合大管家collections的sort方法,进行排序,发牌功能就完毕了.....
3.每个玩家的牌打印
遍历每个玩家手中的序号,使用双列map集合中的get(key)方法,获取每一张牌面
打印输出!!!
代码实现:
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Set; public class Test { public static void main(String[] args) { /* 思路分析: 1,生成牌:用map集合保存54张牌,且从1-54数字对应起来*/ List<String> color = new ArrayList<>(); List<String> point = new ArrayList<>(); Collections.addAll(color, "♥","♠","♣","♦"); Collections.addAll(point,"A","2","3","4","5","6","7","8","9","10","J","Q","K"); HashMap<Integer,String> poker = new HashMap<>(); poker.put(0, "大王"); poker.put(1, "小王"); int serialNum = 2; for (String d : point) { for (String c : color) { poker.put(serialNum,c + d); serialNum++; } }//一副扑克牌生成完成 // System.out.println(poker);//输出验证 //2,利用序号->洗牌->发牌 // //获取双列map集合中的所有key值 Set<Integer> key = poker.keySet(); //利用有参构造方法来初始化单列List集合 List<Integer> pokerNum = new ArrayList(key); //System.out.println(pokerNum);//获取所有key值完毕 Collections.shuffle(pokerNum); //利用三个玩家容器和一个底牌容器存储(容器使用单列集合,便于排序,利用序号(也就是双列集合中key值)取对应的牌面就行了) List<Integer> player1 = new ArrayList<>(); List<Integer> player2 = new ArrayList<>(); List<Integer> player3 = new ArrayList<>(); List<Integer> lastPoker = new ArrayList<>(); for (int i = 0; i < pokerNum.size(); i++) { if(i >= 51) { //注意要添加的值是扑克打乱后的值,非遍历的序号值 lastPoker.add(pokerNum.get(i)); }else if(i % 3 == 1){ player1.add(pokerNum.get(i)); }else if(i % 3 == 2) { player2.add(pokerNum.get(i)); }else { player3.add(pokerNum.get(i)); } }//发牌完毕,整理牌面 Collections.sort(lastPoker); Collections.sort(player1); Collections.sort(player2); Collections.sort(player3); //3.利用玩家获得牌面的序号,取牌 //每个玩家遍历一次 System.out.print("底牌:"); for (Integer i : lastPoker) { String str = poker.get(i); System.out.print(str+" "); } System.out.println(); System.out.print("玩家1:"); for (Integer i : player1) { String str = poker.get(i); System.out.print(str+" "); } System.out.println(); System.out.print("玩家2:"); for (Integer i : player2) { String str = poker.get(i); System.out.print(str+" "); } System.out.println(); System.out.print("玩家3:"); for (Integer i : player3) { String str = poker.get(i); System.out.print(str+" "); } } }
总结:
本题单双列集合的恰当使用,大大减少了代码量,编号思想乃为本案例精髓,之后有需要编号的解决方式,可以参考本案例的思想