模拟斗地主洗牌发牌案例

2024-03-19 08:44

本文主要是介绍模拟斗地主洗牌发牌案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第三章 模拟斗地主洗牌发牌

3.1 案例介绍

按照斗地主的规则,完成洗牌发牌的动作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具体规则:

  1. 组装54张扑克牌将
  2. 54张牌顺序打乱
  3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
  4. 查看三人各自手中的牌(按照牌的大小排序)、底牌

规则:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3

3.2 案例需求分析

  1. 准备牌:

完成数字与纸牌的映射关系:

使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。

  1. 洗牌:

通过数字完成洗牌发牌

  1. 发牌:

将每个人以及底牌设计为ArrayList,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。

存放的过程中要求数字大小与斗地主规则的大小对应。

将代表不同纸牌的数字分配给不同的玩家与底牌。

  1. 看牌:

通过Map集合找到对应字符展示。

通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.3 实现代码步骤

public class Poker {public static void main(String[] args) {/** 1组装54张扑克牌*/// 1.1 创建Map集合存储HashMap<Integer, String> pokerMap = new HashMap<Integer, String>();// 1.2 创建 花色集合 与 数字集合ArrayList<String> colors = new ArrayList<String>();ArrayList<String> numbers = new ArrayList<String>();// 1.3 存储 花色 与数字Collections.addAll(colors, "♦", "♣", "♥", "♠");Collections.addAll(numbers, "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");// 设置 存储编号变量int count = 1;pokerMap.put(count++, "大王");pokerMap.put(count++, "小王");// 1.4 创建牌 存储到map集合中for (String number : numbers) {for (String color : colors) {String card = color + number;pokerMap.put(count++, card);}}/** 2 将54张牌顺序打乱*/// 取出编号 集合Set<Integer> numberSet = pokerMap.keySet();// 因为要将编号打乱顺序 所以 应该先进行转换到 list集合中ArrayList<Integer> numberList = new ArrayList<Integer>();numberList.addAll(numberSet);// 打乱顺序Collections.shuffle(numberList);// 3 完成三个玩家交替摸牌,每人17张牌,最后三张留作底牌// 3.1 发牌的编号// 创建三个玩家编号集合 和一个 底牌编号集合ArrayList<Integer> noP1 = new ArrayList<Integer>();ArrayList<Integer> noP2 = new ArrayList<Integer>();ArrayList<Integer> noP3 = new ArrayList<Integer>();ArrayList<Integer> dipaiNo = new ArrayList<Integer>();// 3.2发牌的编号for (int i = 0; i < numberList.size(); i++) {// 获取该编号Integer no = numberList.get(i);// 发牌// 留出底牌if (i >= 51) {dipaiNo.add(no);} else {if (i % 3 == 0) {noP1.add(no);} else if (i % 3 == 1) {noP2.add(no);} else {noP3.add(no);}}}// 4 查看三人各自手中的牌(按照牌的大小排序)、底牌// 4.1 对手中编号进行排序Collections.sort(noP1);Collections.sort(noP2);Collections.sort(noP3);Collections.sort(dipaiNo);// 4.2 进行牌面的转换// 创建三个玩家牌面集合 以及底牌牌面集合ArrayList<String> player1 = new ArrayList<String>();ArrayList<String> player2 = new ArrayList<String>();ArrayList<String> player3 = new ArrayList<String>();ArrayList<String> dipai = new ArrayList<String>();// 4.3转换for (Integer i : noP1) {// 4.4 根据编号找到 牌面 pokerMapString card = pokerMap.get(i);// 添加到对应的 牌面集合中player1.add(card);}for (Integer i : noP2) {String card = pokerMap.get(i);player2.add(card);}for (Integer i : noP3) {String card = pokerMap.get(i);player3.add(card);}for (Integer i : dipaiNo) {String card = pokerMap.get(i);dipai.add(card);}//4.5 查看System.out.println("令狐冲:"+player1);System.out.println("石破天:"+player2);System.out.println("鸠摩智:"+player3);System.out.println("底牌:"+dipai);}
}

这篇关于模拟斗地主洗牌发牌案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

MySQL 复合查询案例详解

《MySQL复合查询案例详解》:本文主要介绍MySQL复合查询案例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录基本查询回顾多表笛卡尔积子查询与where子查询多行子查询多列子查询子查询与from总结合并查询(不太重要)union基本查询回顾查询

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多