案例:模拟斗地主发牌
需求:使用一个集合对象存储一副扑克牌,将所有扑克牌的顺序打乱,然后分发给用集合表示的三个
玩家和底牌,并打印玩家和底牌的集合内容
步骤
1.买牌 四个花,52张牌。
将花色和数字分别进行组合,生成所有的普通牌,手动添加“小王”,“大王”
2.洗牌和发牌
使用Collections攻击类的shuffle()方法打乱牌的顺序
3.看牌
遍历牌推,将每一张牌分发到三个玩家集合中
留三张作为底牌
4.看牌
分别打印每个玩家集合的内容
1.买牌
花色和数字分别进行组合,生成所有的普通牌,手动添加“小王”,“大王”
//1.买牌 //1.1定义一个双列集合,键:表示牌的编号 值:表示具体的牌 规则,编号越小,牌越小 Map<Integer,String> map = new HashMap<>(); //1.2定义一个单列集合,用来存储所有牌的编号 List<Integer> list = new ArrayList<>(); //1.3定义两个数组用来放牌 String[] colors = {"♥","♠","♦","♣"}; //花色 String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; //牌 //1.3用循环嵌套,获取每一张牌(一个花色有四张牌) int num = 0; for (String number : nums) { //外循环一次,内循环一圈 外循环:获取所有的牌 for (String color : colors) { //内循环: 获取所有的花色 String poker = number+color; //拼接字符串 map.put(num,poker); //添加到双列集合中 list.add(num); //添加到单列集合中 num++; //编号自增一 } } map.put(num,"小王"); //添加小王 list.add(num++); //先运算 在自增 map.put(num,"大王"); //添加大王 list.add(num++); //先运算 在自增 System.out.println("所有的牌:"+map); System.out.println("所有的编号:"+ list);
2.洗牌和发牌
洗牌
2.1使用Collections攻击类的shuffle()方法打乱牌的顺序
2.2分别创建三个玩家集合对象和底牌集合对象
2.3遍历牌推的每一张牌,分别将索引对3取模的值为0,1,2的牌存放到三个玩家集合中,将最后三张存放到底牌集合中
发牌
遍历牌推,将每一张牌分发到三个玩家集合中
留三张作为底牌
//2.洗牌 Collections.shuffle(list); // 打乱单列集合中的编号 System.out.println("洗好牌以后,编号为:"+list); //3.发牌 //3.1创建四个玩家集合,一个集合存放底牌,三个玩家 List duanyu = new ArrayList(); List guojing = new ArrayList(); List yasuo = new ArrayList(); List dipai = new ArrayList(); //3.2具体的发牌动作,将所有和3取模,决定发给谁 for (int i = 0; i <list.size() ; i++) { Integer polerNum = list.get(i); //获取编号 if(i<3){ dipai.add(polerNum); }else if(i%3==0){ duanyu.add(polerNum); }else if(i%3==1){ guojing.add(polerNum); }else if(i%3==2){ yasuo.add(polerNum); } } // System.out.println("底牌为:"+ dipai); // System.out.println("yasuo的牌:" + yasuo);
3.看牌
1.将玩家集合中的牌按自然顺序进行排序 :Collections.sort(List)
2.打印玩家集合中的牌
3.重复上面的操作打印所有玩家的牌和底牌
//4.看牌 //定义一个方法,用来看牌 //方法名:printpoKer //参数列表 List<Integer>,Map<Integer,String> //返回值:String System.out.println("yasuo的牌为:"+printPoker(yasuo,map)); System.out.println("guojing的牌为:"+printPoker(guojing,map)); System.out.println("duanyu的牌为:"+printPoker(duanyu,map)); System.out.println("底牌为:"+printPoker(dipai,map)); } //看牌的方法 public static String printPoker(List<Integer> nums, Map<Integer,String> pokers){ //1.对牌的编号进行升序排列 Collections.sort(nums); //2.遍历牌的编号集合,获取到每一个编号 StringBuffer sb = new StringBuffer(); for (Integer num : nums) { //num就是要查找的具体牌,编号 //3.根据编号到双列集合中查找该编号对应的具体牌 String poker=pokers.get(num); //4.将获取到的牌进行拼接 sb.append(poker+ " "); } //5.将最后拼接结果返回即可 String str = sb.toString(); //因为要返回的是字符串, 所以需要转换成字符串 return str.trim(); //去除首尾的空格 } }