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


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

    案例分析:

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

    总结:

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

  • 相关阅读:
    打印机常识
    网络禁用和启用,及禁止软件软件访问网络
    局域网高级共享改写
    电脑桌面搬家
    电脑硬件的基本组装
    c#中Linq查询语句
    c#中Lamdba匿名函数查询语句
    C#中静态和非静态的区别
    c#中的面向对象
    Laravel 表单验证规则:required、present、filled 和 nullable
  • 原文地址:https://www.cnblogs.com/YangGC/p/8640495.html
Copyright © 2020-2023  润新知