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

2024-03-18 01:36

本文主要是介绍Java零基础入门-如何代码模拟斗地主洗牌发牌动作(上)?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、本期教学目标

  • 掌握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种花色,这是扑克的特点,这大家别忽略掉了。 

这篇关于Java零基础入门-如何代码模拟斗地主洗牌发牌动作(上)?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/820792

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面