(案例)模拟斗地主发牌洗牌看牌

案例: 模拟斗地主发牌

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

步骤:1.买一副扑克牌

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

2.洗牌

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

3.发牌

遍历牌堆,将每一张牌分发到三个玩家集合中

4.看牌

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

步骤一 :买一副扑克牌

分析:

1.创建数字数组:

                     ```java

String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; ```

2.创建花色数组:

 String[] colors = {"方块""梅花","红桃","黑桃"};

3.将每个花色分别和数字进行拼接

 colors[i].concat(nums[j]);

 

 package cn.itcast.demo17;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 /*
 需求:模拟斗地主发牌
      步骤:
          1.买牌
          2.洗牌
          3.发牌
          4.看牌
  */
 public class SendPokerTest {
     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[] colors = {"红桃","黑桃","梅花","方块"};
         String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
         int num = 0;//表示牌的编号
         //通过循环嵌套 造普通牌
         //外循环一次,内循环一圈
         for (String number:numbers){
             //外循环获取所有的点数
             for (String color:colors){
                 //内循环获取所有的花色
                 String poker = color + number;
                //将牌的编号,具体的牌放到双列集合中
                 pokers.put(num,poker);
                 //将牌的编号放到单列集合中
                 list.add(num);
 
                 //每添加一张牌,编号要自增
                 num++;
            }
 
        }
 
 
     //大小王
         //添加小王
         pokers.put(num,"小王");
         list.add(num++);
         //添加大王
         pokers.put(num,"大王");
         list.add(num++);
 
     //打印牌
         System.out.println("所有的牌:" + pokers);
         System.out.println("牌的编号:" + list);
    }
 }
 

 

步骤二、三:洗牌和发牌

分析:

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

2.分别创建三个玩家集合对象和底牌集合对象

3.遍历牌堆的每一张牌,分别将索引对3取模的值为0,1,2的牌存放到三个玩家集合中,将最后三张存放到底牌集合中

 

 package cn.itcast.demo17;
 
 import java.util.*;
 
 /*
 需求:模拟斗地主发牌
      步骤:
          1.买牌
          2.洗牌
          3.发牌
          4.看牌
  */
 public class SendPokerTest {
     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[] colors = {"红桃", "黑桃", "梅花", "方块"};
         String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
         int num = 0;//表示牌的编号
         //通过循环嵌套 造普通牌
         //外循环一次,内循环一圈
         for (String number : numbers) {
             //外循环获取所有的点数
             for (String color : colors) {
                 //内循环获取所有的花色
                 String poker = color + number;
                 //将牌的编号,具体的牌放到双列集合中
                 pokers.put(num, poker);
                 //将牌的编号放到单列集合中
                 list.add(num);
 
                 //每添加一张牌,编号要自增
                 num++;
            }
 
        }
 
 
         //大小王
         //添加小王
         pokers.put(num, "小王");
         list.add(num++);
         //添加大王
         pokers.put(num, "大王");//添加完大王就是最后一张牌了不需要加加
         list.add(num);
 
         //打印牌
         System.out.println("所有的牌:" + pokers);
         System.out.println("牌的编号:" + list);
 
         //2.洗牌
         Collections.shuffle(list);
         System.out.println("洗好牌后,编号为:" + list);
         //3.发牌
         //3.1定义4个集合,分别表示3个玩家,底牌
         List<Integer> qiaofeng = new ArrayList<>();
         List<Integer> xuzhu = new ArrayList<>();
         List<Integer> duanyu = new ArrayList<>();
         List<Integer> dipai = new ArrayList<>();
 
         //3.2具体的发牌动作,将索引和3取模,决定发给谁
         for (int i = 0; i < list.size(); i++) {
             //获取编号
             Integer pokerNum = list.get(i);
             System.out.println(pokerNum);
             if (i >= list.size() - 3) {
                 //底牌
                 dipai.add(pokerNum);
            } else if (i % 3 == 0) {
                 qiaofeng.add(pokerNum);
            } else if (i % 3 == 1) {
                 xuzhu.add(pokerNum);
            } else if (i % 3 == 2) {
                 duanyu.add(pokerNum);
            }
        }
                 //3.3查看玩家,底牌的编号
                 System.out.println("qiaofeng: " + qiaofeng);
                 System.out.println("xuzhu: " + xuzhu);
                 System.out.println("duanyu: " + duanyu);
                 System.out.println("dipai: " + dipai);
            }
        }
 
 

 

步骤四:看牌

分析:

1.将玩家集合中的牌按自然顺序进行排序

       ```java

Collections.sort(List); ```

2.打印玩家集合中的牌

3.重复上面的操作打印所有玩家的牌和底牌

 package cn.itcast.demo17;
 
 import javax.print.attribute.EnumSyntax;
 import java.util.*;
 
 /*
 需求:模拟斗地主发牌
      步骤:
          1.买牌
          2.洗牌
          3.发牌
          4.看牌
  */
 public class SendPokerTest {
     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[] colors = {"红桃", "黑桃", "梅花", "方块"};
         String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
         int num = 0;//表示牌的编号
         //通过循环嵌套 造普通牌
         //外循环一次,内循环一圈
         for (String number : numbers) {
             //外循环获取所有的点数
             for (String color : colors) {
                 //内循环获取所有的花色
                 String poker = color + number;
                 //将牌的编号,具体的牌放到双列集合中
                 pokers.put(num, poker);
                 //将牌的编号放到单列集合中
                 list.add(num);
 
                 //每添加一张牌,编号要自增
                 num++;
            }
 
        }
 
 
         //大小王
         //添加小王
         pokers.put(num, "小王");
         list.add(num++);
         //添加大王
         pokers.put(num, "大王");//添加完大王就是最后一张牌了不需要加加
         list.add(num);
 
         //打印牌
         System.out.println("所有的牌:" + pokers);
         System.out.println("牌的编号:" + list);
 
         //2.洗牌
         Collections.shuffle(list);
         System.out.println("洗好牌后,编号为:" + list);
         //3.发牌
         //3.1定义4个集合,分别表示3个玩家,底牌
         List<Integer> qiaofeng = new ArrayList<>();
         List<Integer> xuzhu = new ArrayList<>();
         List<Integer> duanyu = new ArrayList<>();
         List<Integer> dipai = new ArrayList<>();
 
         //3.2具体的发牌动作,将索引和3取模,决定发给谁
         for (int i = 0; i < list.size(); i++) {
             //获取编号
             Integer pokerNum = list.get(i);
             System.out.println(pokerNum);
             if (i >= list.size() - 3) {
                 //底牌
                 dipai.add(pokerNum);
            } else if (i % 3 == 0) {
                 qiaofeng.add(pokerNum);
            } else if (i % 3 == 1) {
                 xuzhu.add(pokerNum);
            } else if (i % 3 == 2) {
                 duanyu.add(pokerNum);
            }
        }
                 //3.3查看玩家,底牌的编号
                /* System.out.println("qiaofeng: " + qiaofeng);
                 System.out.println("xuzhu: " + xuzhu);
                 System.out.println("duanyu: " + duanyu);
                 System.out.println("dipai: " + dipai);*/
         System.out.println("================================");
         //4.查看具体的编号
         /*String str = printPoker(qiaofeng,pokers);
 
         System.out.println("qiaofeng: " + str);*/
         //下面的是上面注释了的代码的优化
 
         System.out.println("qiaofeng: " + printPoker(qiaofeng,pokers));
         System.out.println("xuzhu: " + printPoker(xuzhu,pokers));
         System.out.println("duanyu: " + printPoker(duanyu,pokers));
         System.out.println("dipai: " + 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();//去掉首尾空格
 ​ 
​ 
​ 
  } 
​ 
      } 
​ 

 

posted @ 2021-02-07 12:39  豆豆tj  阅读(87)  评论(0)    收藏  举报