Java零基础入门-如何代码模拟斗地主洗牌发牌动作(上)?

news2025/2/27 8:19:41

一、本期教学目标

  • 掌握map集合常用方法。
  • 掌握map集合使用场景。
  • 通过map集合实现斗地主洗牌发牌动作。

二、前言

        对于双列集合之map集合,它的相关知识点及拓展咱们都已经差不多学完了。接下来,就是带着大家如何灵活运用map进行一个实战教学,概念加实践相结合,才能让你更好的掌握与理解每一个知识点,废话不多说,我这就开始。

        今天就给大家玩个有意思的,日常我们对于斗地主都司空见惯了,随时随地都可以玩儿,今天我要讲的案例就与它有关,不是实现三人斗地主输赢机制哈,这点有兴趣的小伙伴可以私下研究研究,我今天要演示的就是如何通过代码实现斗地主的洗牌发牌动作,而且就用map集合来实现,这个对于你们而言,难么?难度肯定有。

        但是没关系,我会一步一步帮助大家分析,分析完再动手。

三、案例介绍

        首先我们都知道,一副牌有54张,我们就严格按照斗地主的规则,通过代码来完成洗牌发牌动作。

        如下是随机模拟了斗地主中三位小伙伴的手牌展示,并按从"大"到"小"的顺序进行排列。

如下是案例的具体规则:

  1. 准备一副正规的54张扑克牌。
  2. 将54张扑克牌随机打乱。
  3. 参照斗地主模式,三人参与游戏,交替摸牌。
  4. 每人交替摸牌17张,最后三张留做底牌。
  5. 每人查看各自手牌,并按牌的顺序"大小"有序排列展示。

注意:扑克牌从大到小的摆放顺序应为:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3。

四、需求分析

        接下来,就是对该场景进行分析模拟了。具体如下:

1.准备牌

        自定义好数字与扑克牌数字的对应映射关系,比如:0=大王,1=小王,2=♥2,3=♠2,4=♦2,5=♣2 ... ...依次类推。具体指定该映射关系,我们可以用到双列集合map,完成数字与扑克牌的对应关系(map字典)。

具体映射关系可参考如下:

2.洗牌

        洗牌的话就可以通过数字完成洗牌动作。代码层面可通过Collections.shuffle()方法来打乱元素顺序。

3.发牌

        将每个人以及底牌设计为一个ArrayList<String>集合,将最后3张除开作为底牌,其他牌按取模的方式依次轮发牌,每次一张。其中发牌,发的是牌所对应的编号;并且在发牌时,要求数字排列顺序要按斗地主规则的大小顺序排列,所以这里我们在确定数字与扑克牌之间的映射关系时就是从大到小进行确定的,从左往右,从大王到2到A到K...最后到3,而它们对应的key则数字是从小到大依次递增,这也就是为了方便后续直接看牌步骤只需要将对应数字从map字段中找到对应字符展示即可,这也就是按斗地主排序的规则的排列的。不知道你们有没有理解。

4.排序

        这一步就是要按照斗地主的排序规则,对各位玩家的手牌进行一个排序处理。

5.看牌

        将各自手牌中的数字从map字典中取出对应的字符展示即可。代码实现:通过编号也就是map 的key,直接map.get(key)即可。

五、代码实现

1️⃣创建数字与扑克字符的映射

        组装一副由54张扑克组成的扑克牌,由编号按斗地主牌面值顺序进行排序,说明一下,这样有序排列,目的是最后好按斗地主牌排序输出,如果乱序,怎么知道斗地主的牌面排序是如何呢?完全没有规则,所以从这里就得确定排序规则。

接下来就是对该小点实现步骤分析:

  • 创建一个map字典,目的是用于存放编码与扑克牌面值。
  • 分别创建扑克中的 花色集合 与 数字集合,目的是为了排列组合所有的扑克牌值。
  • 列举扑克中所包含的所有花色与数字。
  • 大小王先写入map字典中,编号从0开始。
  • 接着再分别将所有的花色与数字组合按集合顺序有序写进。

具体该创建map字典完整代码实现如下:

    /**
     * 组装54张扑克牌(扑克字典)
     * 用编号按牌的顺序组装好。
     */
    private Map<Integer, String> buildPorkMap() {

        //1创建map字典
        Map<Integer, String> pokerMap = new HashMap<>();

        //2创建扑克中的 花色集合 与 数字集合
        List<String> colors = new ArrayList<>();
        List<String> numbers = new ArrayList<>();

        //3列举扑克中的花色与数字
        Collections.addAll(colors, "♦", "♣", "♥", "♠");
        Collections.addAll(numbers, "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");

        //4大小王特例先存进map字段中
        int count = 0;
        pokerMap.put(count++, "大王");
        pokerMap.put(count++, "小王");

        //5组合花色与数字
        for (String number : numbers) {
            for (String color : colors) {
                //花色+数字
                String card = color + number;
                pokerMap.put(count++, card);
            }
        }

        return pokerMap;
    }

        由于扑克牌中大小王是最大,且不跟花色数字一样,所以就单独进行map写入,大王为0,小王为1,其次就是根据扑克数字集合进行双遍历排列组合,编号就每次加1,这样就保证了同牌面值越大编号则越小,牌面值越小的值越大。 

扑克字典顺序(pokerMap)展示如下:

 具体完整pokerMap打印如下:

pokerMap:{0=大王, 1=小王, 2=♦2, 3=♣2, 4=♥2, 5=♠2, 6=♦A, 7=♣A, 8=♥A, 9=♠A, 10=♦K, 11=♣K, 12=♥K, 13=♠K, 14=♦Q, 15=♣Q, 16=♥Q, 17=♠Q, 18=♦J, 19=♣J, 20=♥J, 21=♠J, 22=♦10, 23=♣10, 24=♥10, 25=♠10, 26=♦9, 27=♣9, 28=♥9, 29=♠9, 30=♦8, 31=♣8, 32=♥8, 33=♠8, 34=♦7, 35=♣7, 36=♥7, 37=♠7, 38=♦6, 39=♣6, 40=♥6, 41=♠6, 42=♦5, 43=♣5, 44=♥5, 45=♠5, 46=♦4, 47=♣4, 48=♥4, 49=♠4, 50=♦3, 51=♣3, 52=♥3, 53=♠3}

        这样你们直观的看, 是不是就一目了然,花色因为不需要考虑顺序,所以对于花色集合防御内循环,外循环有牌面值来固定,对于每一个牌面值它都有4种花色,这是扑克的特点,这大家别忽略掉了。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1524058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【方法封装】时间格式化输出,获取请求设备和IP

目录 时间类 1.1 获取当前时间&#xff0c;以特定格式化形式输出 1.2 自定义时间&#xff0c;以特定格式化输出 1.3 获取当前时间&#xff0c;自定义格式化 1.4 自定义时间&#xff0c;自定义格式化 设备类 根据请求头信息&#xff0c;获取用户发起请求的设备 请求IP类 …

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:TabContent)

仅在Tabs中使用&#xff0c;对应一个切换页签的内容视图。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明&#xff1a; 可内置系统组件和自定义组件&#xff0c;支…

【SpringCloud微服务实战08】RabbitMQ 消息队列

MQ异步通信优缺点: 优点: 吞吐量提升:无需等待订阅者处理完成,响应更快速 故障隔离:服务没有直接调用,不存在级联失败问题 调用间没有阻塞,不会造成无效的资源占用 耦合度极低,每个服务都可以灵活插拔,可替换 流量削峰:不管发布事件的流量波动多大,都由Broker接收,…

终止代码: DRIVER IRQL NOT LESS OR EQUAL 失败的操作:Netwtw12.sys

蓝屏警告&#xff1a; 今天电脑浏览器用着用着就蓝屏重启&#xff0c;蓝屏上报这个错误&#xff1a; 上网找了一堆&#xff0c;发现关键是这句话&#xff1a;“失败的操作:Netwtw12.sys” 最终在一顿操作下&#xff0c;发现了是23年更新的网卡&#xff08;Intel(R) Wi-Fi6E A…

搜维尔科技:工作室选择 OptiTrack 进行新的虚拟制作舞台

35North Studios 成立于 2020 年&#xff0c;是一家最先进的制作工作室。他们的全方位服务方法可帮助电影制片人和企业在一个设备齐全且先进的地点规划、拍摄、编辑、评分和完成项目。该工作室位于爱荷华州克利尔湖&#xff0c;为创作者提供了一个安静的空间&#xff0c;让他们…

算法思想总结:滑动窗口算法

创作不易&#xff0c;感谢三连 一.长度最小的数组 . - 力扣&#xff08;LeetCode&#xff09;长度最小的数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int lenINT_MAX,nnums.size(),sum0;//len必须要给一个很大的数&#xf…

【Linux】信号保存{sigset_t/sigpending/sigprocmask/bash脚本/代码演示}

文章目录 1.信号相关常见概念2.管理信号的数据结构3.初识sigset_t4.信号集操作函数4.1sigpending4.2sigprocmask4.2代码测试1.测试12.测试23.测试3 4.3bash 脚本文件 1.信号相关常见概念 信号相关动作&#xff1a;产生 发送 接收 阻塞 递达(处理) 实际执行信号的处理动作称为信…

vue2+vant2+Laravel7 实现多图上传到七牛云

后端接口 1、路由&#xff0c;在 routes/api.php 中 Route::resource(photos, PhotoController)->only(store);2、创建对应控制器 <?php namespace App\Http\Controllers; use Illuminate\Http\Request;class PhotoController extends Controller {/**** 上传图片* p…

面部表情参考图

创造表情形变 | Character Creator | Reallusion 皮笑肉不笑&#xff1f;读取情绪的AI说&#xff1a;我太难了_面部

HAProxy高性能负载均衡器

一、HAProxy基础知识 &#xff08;一&#xff09;HAProxy概述 HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器&#xff0c;它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡&#xff0c;还能应用于数据…

RabbitMQ学习总结-基础篇

1..RabbitMQ 本身是一个消息中间件&#xff0c;在服务应用中&#xff0c;可解决高性能&#xff0c;高并发&#xff0c;高应用的问题&#xff0c;极大程度上解决了应用的性能问题。 2.MQ的使用分为生产者和消费者&#xff0c;生产者生产消息&#xff0c;消费者去消费消息。 3.…

cesium.js加载模型后,重新设置旋转角度属性值

// 加载模型var position Cesium.Cartesian3.fromDegrees(longitude, latitude, height);// 计算矩阵var rollAngleDegrees 15; // 设置翻滚角度var rollAngleRadians Cesium.Math.toRadians(rollAngleDegrees); // 将角度转换为弧度var orientation Cesium.Transforms.eas…

android 怎么自定义view

首先了解view的绘制流程&#xff1a; 所以onmeasure ---测量view onlayout---确定view大小----》所以继承ViewGroup必须要重写onlayout&#xff0c;确定子view 而onDraw----是继承view时候需要操作的。 所以&#xff1a;自定义ViewGroup一般是利用现有的组件根据特定的布局…

Python电梯楼层数字识别

程序示例精选 Python电梯楼层数字识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python电梯楼层数字识别》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

操作系统内功篇:硬件结构之如何写出让CPU执行更快的代码?

一 前言 因为CPU要操作的数据都在CPU Cache中的话&#xff0c;就不用再从内存中读取数据了&#xff0c;这样就提高了效率&#xff0c;访问的数据在CPU Cache中越多&#xff0c;有个专业名词称为缓存命中率高&#xff0c;所以说&#xff0c;缓存命中率越高&#xff0c;自然执行…

Jupyter Notebook出错提示An error occurred while retrieving package information解决办法

出错日志信息&#xff1a; To access the notebook, open this file in a browser:file:///C:/Users/colda/AppData/Roaming/jupyter/runtime/nbserver-14564-open.htmlOr copy and paste one of these URLs:http://localhost:8888/?token3c0113e5da07c0b8b8c9de74ffb453c5047…

在idea中配置tomcat服务器,然后部署一个项日

1.下载tomcat Tomcat下载 点击右边的tomcat8 找到zip点击下载 下载完&#xff0c;解压到你想放置的路径下 2.配置环境变量 打开设置找到高级系统设置点击环境变量 点击新建&#xff0c;变量名输入&#xff1a;CATALINA_HOME&#xff0c;变量值就是Tomcat的安装路径&#x…

机器人阻抗控制中的transparency(透明度)

在机器人控制领域&#xff0c;transparency&#xff08;透明性&#xff09;是一个描述机器人在物理交互过程中如何响应外部力或运动的术语。透明性在这里通常意味着机器人的运动和行为对于与其交互的用户或环境来说是直观且可预测的。换句话说&#xff0c;透明性意味着机器人的…

【二分查找详细解析】 【图解】 例题【洛谷P2249 【深基13.例1】查找】

文章目录 二分查找的基础解释例题【洛谷P2249 【深基13.例1】查找】code↓ 二分查找的基础解释 二分的时间复杂度为 O ( l o g n ) O(log n) O(logn)&#xff0c;进行二分查找的序列必须满足单调性 我们可以先定义两个值 l , r l,r l,r &#xff0c;来表示查找到的左端点 l…

接口与多态

通过接口实现多态 接口中声明若干个 bstract方法&#xff1b; 方法体的内容细节由实现接口的类去完成&#xff0c;不同的类有 不同的实现方式 → 则接口变量在回调接口方法时具有多 种形态。 用接口进行程序设计的核心思想 使用接口回调技术&#xff1a;接口变量存放实现该接口…