zoukankan      html  css  js  c++  java
  • 集合经典案例:斗地主发牌功能实现

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

    案例分析:

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

    总结:

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

  • 相关阅读:
    POJ 1401 Factorial
    POJ 2407 Relatives(欧拉函数)
    POJ 1730 Perfect Pth Powers(唯一分解定理)
    POJ 2262 Goldbach's Conjecture(Eratosthenes筛法)
    POJ 2551 Ones
    POJ 1163 The Triangle
    POJ 3356 AGTC
    POJ 2192 Zipper
    POJ 1080 Human Gene Functions
    POJ 1159 Palindrome(最长公共子序列)
  • 原文地址:https://www.cnblogs.com/YangGC/p/8640495.html
Copyright © 2011-2022 走看看