终极:用集合模拟斗地主

简介: 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

相关文章
|
7月前
|
移动开发 前端开发 安全
技术心得记录:怎么更快地合成大西瓜?搞懂游戏的源码,闭着眼睛都能成功!
技术心得记录:怎么更快地合成大西瓜?搞懂游戏的源码,闭着眼睛都能成功!
106 0
|
8月前
|
存储 Java
Java实现模拟斗地主
Java实现模拟斗地主
70 2
|
Java BI 数据库
特别诺贝尔奖论文《天赋与运气:随机性在成功与失败中的作用》代码实现简版(JAVA)
特别诺贝尔奖论文《天赋与运气:随机性在成功与失败中的作用》代码实现简版(JAVA)
|
安全 C#
案例18-案例开门小例子面向对象演化
案例18-案例开门小例子面向对象演化
|
算法
11 类和对象练习之扑克模拟
11 类和对象练习之扑克模拟
94 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏19敌人可以被打死
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏19敌人可以被打死
159 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏16之敌人来了
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏16之敌人来了
153 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏12之英雄自由行走
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏12之英雄自由行走
175 0
|
存储 算法 程序员
人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式
“从来如此,便对么?”,鲁迅先生在《狂人日记》中借狂人之口在月光下发出的质疑与呐喊,是的,从来如此,一般人的思维模式就是从来如此,以高数为例子,我们大抵都是先从数分、线代、解几去学泛函、抽代、拓扑等,其实就是按照标准路子来,这样做理论上可以增加对已学知识的理解程度,并对某些数分、线代中的问题看清其本质有所帮助。数学归纳法其实就是一种迭代(iteration),从一个简单的起点,推广到一般情况。而递归(recursion),则是一种反人类的逆向思维模式,作为研发人员,掌握这种反常识的思维逻辑是非常必要的,这里我们以一个推理故事为开端
人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式
|
存储 算法
【Collections类】之欢乐斗地主底层逻辑分析及实现
【Collections类】之欢乐斗地主底层逻辑分析及实现
173 0
【Collections类】之欢乐斗地主底层逻辑分析及实现