终极:用集合模拟斗地主

简介: 1.买一副扑克牌将花色和数字分别进行组合,生成所有的普通牌手动添加“大王”、“小王”2.洗牌使用Collections工具类的shuffle()方法打乱牌的顺序3.发牌遍历牌堆,将每一张牌分发到三个玩家集合中留三张作为底牌4.看牌分别打印每个玩家集合的内容

六、终极:用集合模拟斗地主

6.1、模拟斗地主发牌之买牌

6.1.1、案例:模拟斗地主发牌

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

1.买一副扑克牌将花色和数字分别进行组合,生成所有的普通牌手动添加“大王”、“小王”
2.洗牌使用Collections工具类的shuffle()方法打乱牌的顺序
3.发牌遍历牌堆,将每一张牌分发到三个玩家集合中留三张作为底牌
4.看牌分别打印每个玩家集合的内容

步骤一:买一副扑克牌

  • 分析:

1.创建数字数组:String[] nums =("3","4","5","6","7","8","9","10","J","Q","K","A","2");
2.创建花色数组:String[] colors = ["方片","梅花","红桃","黑桃");
3.将每一个花色分别和数字进行拼接colors[i].concat(nums[j]);

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Text {
    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);
                //每添加一张牌,编号要自增1
                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的牌存放到三个玩家集合中,将最后三张存放到底牌集合中

//2.洗牌
        Collections.shuffle(list);
        System.out.println("洗好牌后,编号为:"+list);

        //3、发牌
        //3.1、定义四个集合,分别表示3个玩家,底牌.
        List<Integer> zhangsan = new ArrayList<>();
        List<Integer> lisi = new ArrayList<>();
        List<Integer> wangwu = new ArrayList<>();
        List<Integer> dipai = new ArrayList<>();

        //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){
                zhangsan.add(pokerNum);
            }else if(i % 3 == 1){
                lisi.add(pokerNum);
            }else if(i % 3 == 2){
                wangwu.add(pokerNum);
            }
        }
        //3.3、查看具体的牌
        System.out.println("张三:"+printPoker(zhangsan, pokers));
        System.out.println("李四:"+printPoker(lisi, pokers));
        System.out.println("王五:"+printPoker(wangwu, pokers));
        System.out.println("底牌:"+printPoker(dipai, pokers));
        }
   

步骤四、看牌

  • 分析:

1.将玩家集合中的牌按自然顺序进行排序Collections.sort(List);
2.打印玩家集合中的牌
3.重复上面的操作打印所有玩家的牌和底牌

 /* 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();
    }
}

※最后输出

1673476241912.png

相关文章
|
6月前
|
JavaScript 前端开发 索引
让集合数据操控指尖舞动:迭代器和生成器的精妙之处
让集合数据操控指尖舞动:迭代器和生成器的精妙之处
|
6月前
|
安全 Java 数据库连接
【Java每日一题】——第四十四题:综合案例:编程模拟智能手机和普通手机功能。
【Java每日一题】——第四十四题:综合案例:编程模拟智能手机和普通手机功能。
|
6月前
(模拟)L1-019. 谁先倒(2016)
(模拟)L1-019. 谁先倒(2016)
46 1
|
6月前
|
存储 Java
Java实现模拟斗地主
Java实现模拟斗地主
53 2
|
Java BI 数据库
特别诺贝尔奖论文《天赋与运气:随机性在成功与失败中的作用》代码实现简版(JAVA)
特别诺贝尔奖论文《天赋与运气:随机性在成功与失败中的作用》代码实现简版(JAVA)
|
Java 程序员 开发者
只用一行代码,你能玩出什么花样?
只用一行代码,你能玩出什么花样?
95 1
|
算法 索引
算法创作|烂头背枪双人情况游戏随机模拟
算法创作|烂头背枪双人情况游戏随机模拟
207 0
|
存储 Python
炸金花底层模拟
炸金花底层模拟
267 0
|
存储 算法 程序员
人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式
“从来如此,便对么?”,鲁迅先生在《狂人日记》中借狂人之口在月光下发出的质疑与呐喊,是的,从来如此,一般人的思维模式就是从来如此,以高数为例子,我们大抵都是先从数分、线代、解几去学泛函、抽代、拓扑等,其实就是按照标准路子来,这样做理论上可以增加对已学知识的理解程度,并对某些数分、线代中的问题看清其本质有所帮助。数学归纳法其实就是一种迭代(iteration),从一个简单的起点,推广到一般情况。而递归(recursion),则是一种反人类的逆向思维模式,作为研发人员,掌握这种反常识的思维逻辑是非常必要的,这里我们以一个推理故事为开端
人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式
课外拓展1.模拟计算器的三种方法
回调函数的参数就是一个函数指针,这个指针便可以接收函数了,因为指针并没有指向,所以这个指针可以接收任意一个函数、
97 0