需求分析:使用一个集合对象存储一副扑克牌,将所有扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,并打印玩家和底牌的集合内容。主要分为4步,买牌,洗牌,发牌,看牌,采用junit单元测试,需要导入junit的jar包。
具体步骤:

1.准备工作

//1.定义一个双列集合,键:表示牌的编号。值:表示牌具体的值
          Map<Integer,String> pokers=new HashMap<>();
         //2.定义一个单列集合,存放牌的编号
         List<Integer> list=new ArrayList<>();
         //普通牌52张,大小王另外添加
         int num=0;//表示牌的编号
           String[] colors={"♥","♠","♣","♦"};//四种花色的牌,红桃,黑桃,梅花,方片
           String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2",};//牌的数字

2.模拟买牌动作并洗牌

@Test
    public  void sendPoker(){
        for (String nums : numbers) {  //外循环,获取所有的颜色
            for (String color : colors) {  //内循环,获取所有的数字
                String poker=color+nums;  //拼接颜色和数字
                pokers.put(num,poker); //将牌的编号,具体的牌放到双列集合中
                list.add(num);//将牌的编号放到单列集合,num自增
                num++;
            }
        }
        //添加小王和大王
        pokers.put(num,"小王");
        list.add(num++);
        pokers.put(num,"大王");
        list.add(num++);
        System.out.println("买牌动作,查看所有的牌----------------------------");
        System.out.println("所有的牌:"+pokers);
        System.out.println("牌的编号:"+list);
       //2.洗牌
        Collections.shuffle(list);
        System.out.println("洗牌后:"+list);
     }

测试下买牌动作:

斗地主java源码 java斗地主发牌_List


总共有54张牌,每张牌对应一个编号和值。

3.模拟发牌动作。

洗牌的过程和简单,只需调用以下代码即,参数为你定义的集合名字,这个方法就是把一个集合中的顺序打乱。

Collections.shuffle(list);

具体的发牌代码:

@Test
     public void givePoker(){
        //1定义四个集合,表示三个玩家和底牌
        sendPoker();
        List<Integer> player1=new ArrayList<>();
        List<Integer> player2=new ArrayList<>();
        List<Integer> player3=new ArrayList<>();
        List<Integer> diPai=new ArrayList<>();
        //2具体的发牌动作,将索引和3取模,决定具体发给谁,按照player1,player2,player3的顺序发牌
        for(int i=0;i<list.size();i++){
            Integer pokerNum=list.get(i);
            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 {
                player3.add(pokerNum);
            }
        }
        //3.查看玩家牌的编号,还有底牌的编号
        System.out.println("发牌动作,查看玩家牌的编号和底牌的编号--------------------------------------------");
        System.out.println("player1的牌:"+player1);
        System.out.println("player2的牌"+player2);
        System.out.println("player3的牌"+player3);
        System.out.println("底牌:"+diPai);
        //4.查看玩家具体的牌和底牌
        System.out.println("查看牌,查看玩家具体的牌和底牌---------------------------------------");
        System.out.println("player1玩家的牌:"+printPoker(player1,pokers));
        System.out.println("player2玩家的牌:"+printPoker(player2,pokers));
        System.out.println("player3玩家的牌:"+printPoker(player3,pokers));
        System.out.println("底牌:"+printPoker(diPai,pokers));

     }

测试发牌动作和查看具体的牌:

斗地主java源码 java斗地主发牌_斗地主java源码_02

4.定义一个方法,获取具体的牌

public String printPoker(List<Integer> nums,Map<Integer,String> pokers){
        //将编号进行升序排序
        Collections.sort(nums);
        StringBuilder sb=new StringBuilder();
         for (Integer num : nums) { //遍历牌的编号集合,获取具体的牌
             String poker=pokers.get(num);//根据编号获取具体的牌
             sb.append(poker+" ");//加上空格分割
         }
         String str=sb.toString();
         return str.trim();//指定要删除首部和尾部空格的字符串返回值String。
     }