1.编译运行

在这里插入图片描述

2.需求:

使用一个集合对象存储一副扑克牌, 将所由扑克牌的顺序打乱, 然后分发给用集合表示的三个玩家和底牌, 打印玩家和底牌的集合内容

3.步骤:

  • 1.造扑克牌:

将花色和数字分别进行组合,生成所有的普通牌,手动添加“大王”“小王”

  • 2.洗牌:

使用Collections工具类的shuffle()方法打乱牌的顺序

  • 3.发牌

遍历牌堆,将每一张牌分发到三个玩家手中,留三张牌为底牌

  • 4.看牌

分别打印每个玩家集合的内容

4. 代码块:

4.1 造扑克牌

分析:

1.定义一个双列集合,键:表示牌的编号,值:表示具体的牌,规则:编号越小牌越小 2.定义一个单列集合,用来存储所有牌的的编号 3.将花色和牌数进行组合

  • 4.1.1 定义扑克牌集合
			//定义一个双列集合,键:表示牌的编号,值:表示具体的牌,规则:编号越小牌越小
		Map<Integer,String> pokers = new HashMap<>();
			//定义一个单列集合,用来存储所有牌的的编号
		List<Integer> list =new ArrayList<>();		
  • 4.1.2,将牌的花色和牌数进行组合存入集合
			//普通牌52张
		String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
			//花色"♠","♣","♥","♦"
		String[] colors = {"♠","♣","♥","♦"};
			//用增强for循环将花色和牌数进行组合
		int num = 0;
        for (String number : nums) {
            for (String color : colors) {
                String poker = color+number;
                //将牌的编号和具体的牌放到双列集合中,
                pokers.put(num,poker);
                //将牌的编号放到单列集合中
                list.add(num);
                //每添加一张,编号自增1
                num++;
            }
        }
        //大小王
        //添加小王
        pokers.put(num,"🃏");
        list.add(num++);
        //添加大王
        pokers.put(num,"🃏");
        list.add(num++);

4.2 洗扑克牌

分析:

使用Collections工具类的shuffle()方法打乱牌堆集合的顺序

  • 4.2.1 将存入扑克牌的key集合list随机打乱顺序
Collections.shuffle(list);

4.3 发扑克牌

分析:

定义4个集合,分别表示3个玩家,底牌 具体的发牌动作,将索引和3取余,决定发给谁

  • 4.3.1 定义4个集合,分别表示3个玩家,底牌
			//底牌
		List<Integer> dipai = new ArrayList<>();
			//三个玩家
        List<Integer> zhaoyun = new ArrayList<>();
        List<Integer> caocao = new ArrayList<>();
        List<Integer> liubei = new ArrayList<>();
  • 4.3.2 具体的发牌动作,将索引和3取余,决定发给谁
			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){
            	//给第一位玩家
                zhaoyun.add(pokerNum);
            }else if(i%3 ==1){
            	//给第二位玩家
                caocao.add(pokerNum);
            }else if(i%3 ==2){
            	//给第三位玩家
                liubei.add(pokerNum);
            }
        }

4.4 看牌

分析:

对牌的编号进行升序排列 根据编号去双列集合中查找该编号对应的具体牌

  • 4.4.1写一个方法实现看牌
public  static String printPoker(List<Integer> nums,Map<Integer,String> pokers){
        //1.对牌的编号进行升序排列
        Collections.sort(nums);
        //2.遍历牌的编号集合,获取每一个编号
        StringBuilder sb = new StringBuilder();
        for (Integer num : nums) {
            //num就是要查找具体牌的编号
            //3.根据编号去双列集合中查找该编号对应的具体牌
            String poker =pokers.get(num);
            //4.将获取到的牌进行拼接
            sb.append(poker+" ");
        }
        //5.将最后的拼接的结果返回即可
        String str = sb.toString();
        //6.trim去除前后空格
        return str.trim();
    }
  • 4.4.2 将每个玩家的牌输出
		System.out.println("斗地主在线洗牌发牌:");
        System.out.println("赵云:"+printPoker(zhaoyun,pokers));
        System.out.println("曹操:"+printPoker(caocao,pokers));
        System.out.println("刘备:"+printPoker(liubei,pokers));
        System.out.println("底牌:"+printPoker(dipai,pokers));

5.源码

import java.util.*;

/*
案例:模拟斗地主发牌
    需求:使用一个集合对象存储一副扑克牌,将所由扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,应打印玩家和底牌的集合内容
    步骤:1.买一副扑克牌:将花色和数字分别进行组合,生成所有的普通牌
            手动添加“大王”“小王”
         2.洗牌
            使用Collections工具类的shuffle()方法打乱牌的顺序
         3.发牌
            遍历牌堆,将每一张牌分发到三个玩家手中
            留三张牌为底牌
         4.看牌
            分别打印每个玩家集合的内容

 */
public class Test {
    public static void main(String[] args) {
        //1.买牌
        //1.1定义一个双列集合,键:表示牌的编号,值:表示具体的牌,规则:编号越小牌越小
        Map<Integer,String> pokers = new HashMap<>();

        //1.2定义一个单列集合,用来存储所有牌的的编号
        List<Integer> list =new ArrayList<>();
        //1.3具体的买牌动作

        //普通牌52张
        String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        String[] colors = {"♠","♣","♥","♦"};
        //通过循环嵌套获取普通牌
        int num = 0;
        for (String number : nums) {
            for (String color : colors) {
                String poker = color+number;
                //将牌的编号和具体的牌放到双列集合中,
                pokers.put(num,poker);
                //将牌的编号放到单列集合中
                list.add(num);
                //每添加一张,编号自增1
                num++;
            }
        }
        //大小王
        //添加小王
        pokers.put(num,"🃏");
        list.add(num++);
        //添加大王
        pokers.put(num,"🃏");
        list.add(num++);
        //打印牌
       /* System.out.println("所有的牌:"+pokers);
        System.out.println("编号:"+list);*/
        
//        步骤2,3:洗牌和发牌
//        分析:
//        1.使用Collections工具类的shuffle()方法打乱牌堆集合的顺序
//        2.分别创建三个玩家集合对象和底牌集合对象
//        3.遍历牌堆的每一张牌,分别将索引对3取模的值为0.1.2的牌放到三个玩家集合中,将最后三张 存放到底牌集合中
        //洗牌
        Collections.shuffle(list);
        //System.out.println("洗好牌后的编号:"+list);
        //发牌
        //3.1定义4个集合,分别表示3个玩家,底牌
        List<Integer> dipai = new ArrayList<>();
        List<Integer> zhaoyun = new ArrayList<>();
        List<Integer> caocao = new ArrayList<>();
        List<Integer> liubei = new ArrayList<>();
        //3.2具体的发牌动作,将索引和3取余,决定发给谁
        for(int i= 0;i<list.size();i++){
            //获取编号
            Integer pokerNum = list.get(i);
            if(i>=list.size()-3){
                //底牌i
                dipai.add(pokerNum);
            }else if(i%3 ==0){
                zhaoyun.add(pokerNum);
            }else if(i%3 ==1){
                caocao.add(pokerNum);
            }else if(i%3 ==2){
                liubei.add(pokerNum);
            }
        }
        //查看具体的牌
        System.out.println("-------------------------------");
        System.out.println("斗地主在线洗牌发牌:");
        System.out.println("赵云:"+printPoker(zhaoyun,pokers));
        System.out.println("曹操:"+printPoker(caocao,pokers));
        System.out.println("刘备:"+printPoker(liubei,pokers));
        System.out.println("底牌:"+printPoker(dipai,pokers));
    }

    /*4.定义一个方法看牌
        方法名:printPoker
           参数列表:List<Integer>,Map<Integer,String>;
             返回值:String*/
    public  static String printPoker(List<Integer> nums,Map<Integer,String> pokers){
        //1.对牌的编号进行升序排列
        Collections.sort(nums);
        //2.遍历牌的编号集合,获取每一个编号
        StringBuilder sb = new StringBuilder();
        for (Integer num : nums) {
            //num就是要查找具体牌的编号
            //3.根据编号去双列集合中查找该编号对应的具体牌
            String poker =pokers.get(num);
            //4.将获取到的牌进行拼接
            sb.append(poker+" ");
        }
        //5.将最后的拼接的结果返回即可
        String str = sb.toString();
        return str.trim();
    }
}

6.底牌发牌思路

1.谁拿到中间的牌谁是地主 用i==27来看地主牌的走向,问题是地主会一直是第三位玩家,

2.指定一张牌,谁拿到这张牌谁就是地主 指定一张牌的编号,根据编号随机在集合中的位置,问题是有可能出现在底牌中