集合经典案例:斗地主发牌功能实现

集合经典案例:斗地主发牌功能实现

案例分析:

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

总结:

本题单双列集合的恰当使用,大大减少了代码量,编号思想乃为本案例精髓,之后有需要编号的解决方式,可以参考本案例的思想

原文地址:https://www.cnblogs.com/YangGC/p/8640495.html