斗地主洗牌发牌-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)

news/2024/4/18 16:34:08/文章来源:https://blog.csdn.net/yw1990128/article/details/129174981

【案例6-4】 斗地主洗牌发牌

【案例介绍】

1.任务描述

扑克牌游戏“斗地主”,相信许多人都会玩,本案例要求编写一个斗地主的洗牌发牌程序,要求按照斗地主的规则完成洗牌发牌的过程。一副扑克总共有54张牌,牌面由花色和数字组成(包括J、Q、K、A字母)组成,花色有♠、♥、♦、♣ 四种,分别表示黑桃、红桃、方块、梅花,小☺、大☻分别表示小王和大王。斗地主游戏共有3位玩家参与,首先将这54张牌的顺序打乱每人轮流摸一次牌,剩余3张留作底牌,然后在控制台打印3位玩家的牌和3张底牌。

2.运行结果

 任务运行结果如图6-1所示:

图6-1  运行结果图

 

【实现思路】

(1)要实现纸牌程序,首先需要完成纸牌的组装。牌面是由花色(包括♠、♥、♦、♣花色)和数字(包括J、Q、K、A字母)两部分组成,可以创建两个ArrayList集合作为花色集合与数字集合,存储时需要注意。比10大的牌的数字用J、Q、K表示,1用A表示。

(2)将花色集合与数字集合这两个循环进行嵌套循环,将花色与数字组合,形成52章牌,并赋予其编号。将组合后的牌存放到一个HashMap集合中,集合的Key值是编号,value值是组装完成的纸牌。还有两张牌是大小王(小☺表示小王、大☻表示大王)。由于组装规则不一致,需单独使用add()方法将这两张牌加入到HashMap集合中。

(3)创建一个数字集合,用这个数字集合代替纸牌完成洗牌和发牌操作。由于纸牌的数量是54张,所以创建集合范围是0~53。 

(4)可以使用Collection类的shuffle()方法完成打乱数字集合的操作,实现洗牌效果。由于只有3个人,所以可以使用for循环,通过将数字与3取余的方法,将代表不同纸牌的数字分配给不同人与底牌,实现发牌效果。

(5) 洗牌和发牌结束后,可以通过Collection类的sort()方法完成排序,之后通过foreach()循环HashMap集合,根据数字查找对应的纸牌字符串,并存入创建的字符串集合中,最后展示字符串集合。

【实现代码】

程序实现代码如文件6-1所示。 

                         文件6-1  example5.java

  1. package com.itheima;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.HashMap;
  5. public class example {
  6.     public static void main(String[] args) {
  7.         // 准备花色
  8.         ArrayList<String> color = new ArrayList<String>();
  9.         color.add("♠");
  10.         color.add("♥");
  11.         color.add("♦");
  12.         color.add("♣");
  13.         // 准备数字 ,ArrayList将纸牌由小到大排序
  14.         ArrayList<String> number = new ArrayList<String>();
  15.         for (int i = 3; i <= 10; i++) {
  16.            number.add(i + "");
  17.         }
  18.         number.add("J");
  19.         number.add("Q");
  20.         number.add("K");
  21.         number.add("A");
  22.         number.add("2");
  23.         // 定义一个map集合:用来将数字与每一张牌进行对应
  24.        HashMap<Integer, String> map = new HashMap<Integer, String>();
  25.          int index = 0;// 纸牌编号
  26.         for (String thisNumber : number) {// 循环纸牌数字
  27.            for (String thisColor : color) {// 循环纸牌花色
  28.                // 将花色与数字组合,形成52张牌,并赋予其编号
  29.                map.put(index++, thisColor + thisNumber);
  30.            }
  31.         }
  32.         // 加入大小王
  33.         map.put(index++, "");
  34.         map.put(index++, "☻");
  35.         // 一副54张的牌 ArrayList里边为0-53的数的新牌
  36.         ArrayList<Integer> cards = new ArrayList<Integer>();
  37.         for (int i = 0; i <= 53; i++) {
  38.            cards.add(i);// 此时的cards顺序为0-53
  39.         }
  40.         // 洗牌,使用Collections工具类中的shuffle()方法
  41.         Collections.shuffle(cards);// 此时的cards顺序已被打乱
  42.         // 创建三个玩家和底牌
  43.         ArrayList<Integer> iPlayer = new ArrayList<Integer>();
  44.         ArrayList<Integer> iPlayer2 = new ArrayList<Integer>();
  45.         ArrayList<Integer> iPlayer3 = new ArrayList<Integer>();
  46.         ArrayList<Integer> iSecretCards = new ArrayList<Integer>();
  47.         // 遍历这副洗好的牌,遍历过程中,将牌发到三个玩家和底牌中
  48.         for (int i = 0; i < cards.size(); i++) {
  49.            if (i >= 51) {
  50.                iSecretCards.add(cards.get(i));// 留取3张底牌
  51.            } else {
  52.                if (i % 3 == 0) {
  53.                  iPlayer.add(cards.get(i));//3取余为0的牌发给玩家1
  54.                } else if (i % 3 == 1) {
  55.                  iPlayer2.add(cards.get(i));//3取余为1的牌发给玩家2
  56.                } else {
  57.                    iPlayer3.add(cards.get(i));// 其余的牌发给玩家3
  58.                }
  59.            }
  60.         }
  61.         // 对每个人手中的牌排序,使用Collections工具类中的sort()方法
  62.         Collections.sort(iPlayer);
  63.         Collections.sort(iPlayer2);
  64.         Collections.sort(iPlayer3);
  65.         // 对应数字形式的每个人手中的牌,定义字符串形式的牌
  66.         ArrayList<String> sPlayer = new ArrayList<String>();
  67.         ArrayList<String> sPlayer2 = new ArrayList<String>();
  68.         ArrayList<String> sPlayer3 = new ArrayList<String>();
  69.         ArrayList<String> sSecretCards = new ArrayList<String>();
  70.         // 循环主键,从map中获取纸牌
  71.         for (Integer key : iPlayer) {
  72.            sPlayer.add(map.get(key));
  73.         }
  74.         for (Integer key : iPlayer2) {
  75.            sPlayer2.add(map.get(key));
  76.         }
  77.         for (Integer key : iPlayer3) {
  78.            sPlayer3.add(map.get(key));
  79.         }
  80.         for (Integer key : iSecretCards) {
  81.            sSecretCards.add(map.get(key));
  82.         }
  83.            // 看牌
  84.            System.out.println("玩家1" + sPlayer);
  85.            System.out.println("玩家2" + sPlayer2);
  86.            System.out.println("玩家3" + sPlayer3);
  87.            System.out.println("底牌:" + sSecretCards);
  88.         }
  89. }

在文件6-1中,第8~22行代码将4种花色和13个纸牌编号分别放到两个ArrayList集合中。第24~34当代码foreach循环拼出52张纸牌,并将其依照从小到大的顺序放入Map集合中,并将大小王添加到其中。第36~41行代码创建了代替纸牌的数字集合,将其与纸牌中的序号对应,并将数字集合中的顺序打乱,此时集合相当于纸牌编号集合。第43~60行代码完成了将纸牌编号发给3位玩家并留3张纸牌编号做为底牌的操作。第62~64行代码将3位玩家手中纸牌编号进行排序。第66~88行代码通过循环3位玩家手中的纸牌编号,将纸牌字符串从Map中取出放入字符串集合。最后打印字符串集合,分别得到3个玩家的纸牌和底牌。

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA-JDBC

文章目录1、什么是JDBC&#xff1f;2、JDBC相关的类库在哪里&#xff1f;3、JDBC本质上是一堆什么呢&#xff1f;4、JDBC开发之前的准备工作&#xff1f;5、JDBC编程六步JDBC课堂笔记1、什么是JDBC&#xff1f; Java DataBase Connectivity 在java语言中编写sql语句&#xff0…

ChatGPT是什么?为何会引爆国内算力需求?

过去十年中&#xff0c;通过“深度学习大算力”从而获得训练模型是实现人工智能的主流技术途径。由于深度学习、数据和算力这三个要素都已具备&#xff0c;全世界掀起了“大炼模型”的热潮&#xff0c;也催生了大批人工智能企业。大模型是人工智能的发展趋势和未来大模型&#…

Docker----------day5---安装redis集群

1.哈希取余分区 2亿条记录就是2亿个k,v&#xff0c;我们单机不行必须要分布式多机&#xff0c;假设有3台机器构成一个集群&#xff0c;用户每次读写操作都是根据公式&#xff1a; hash(key) % N个机器台数&#xff0c;计算出哈希值&#xff0c;用来决定数据映射到哪一个节点上。…

浏览器用一行JS代码导出cookies.txt,Python的requests库导入cookies格式化为字典格式

在Python进行爬虫时&#xff0c;如果仅使用requests库打开某个网页&#xff0c;requests的session.cookies保存的cookies信息少得可怜&#xff0c;有时cookies甚至是空白&#xff01;但浏览器里打开同一个网页&#xff0c;cookies信息非常详尽&#xff0c;比如浏览器的cookies保…

孪生生产线:法兰工厂数据驱动的颠覆性创新

2018 年&#xff0c;世界经济论坛(WEF)携手麦肯锡公司共同倡议并正式启动了全球“灯塔工厂网络项目”(Lighthouse Network)&#xff0c;共同遴选率先应用工业革命 4.0 技术实现企业盈利和持续发展的创新者与示范者。这就使得工厂系统需要对各流水线及生产运行成本方面进行多角度…

在DDD中建立领域模型

在前文《当我们谈论DDD时我们在谈论什么》中我们讨论了DDD的战略设计和战术设计。在本文中我们将继续探讨领域模型。 用领域模型表达领域概念 在实际项目中&#xff0c;模型设计者往往过早陷入具体构造块类型的识别&#xff0c;比如实体、聚合、领域服务&#xff0c;而忽略了…

Git(分布式版本控制系统)

提到git了&#xff0c;我们先来说一下什么是git? 1、通俗一点&#xff0c;就是一个人工版本控制器 通过人工的复制行为来保存项目的不同阶段的内容&#xff0c;添加适当的一些描述文字加以区分 繁琐、容易出错 产生大量重复数据 2、什么是版本控制&#xff1f; 版本控制是指对…

动作识别、检测、分割、解析相关数据集介绍

文章目录动作识别UCF101(UCF101 Human Actions dataset)Kinetics (Kinetics Human Action Video Dataset)动作检测 / 时序动作定位CharadesActivityNetMulti-THUMOSUCF101-24IKEA ASM动作分割Breakfast (The Breakfast Actions Dataset)GTEA (Georgia Tech Egocentric Activity…

Python base64和hashlib模块

一、base64模块 base64模块提供了在二进制数据和可打印ASCII字符间编解码的功能&#xff0c;包括 RFC3548中定义的Base16, Base32, Base64, Ascii85, Base85等编码。 base64模块属于标准库&#xff0c;无需进行安装&#xff0c;导入即可使用。 base64模块支持两种接口&#xf…

数组还是队列?yocto-queue 源码告诉你

前言 昨天刚学完 omit 的源码&#xff0c;今天趁着学习源码的热度还没结束&#xff0c;来学习一下另一个我之前未接触过的东西 yocto-queue。 yocto-queue 介绍 那么 yocto-queue 是什么呢&#xff1f;它有什么功能呢&#xff1f;查阅资料可得&#xff0c;对于数据比较多的数…

第10天-商品服务(分层领域模型及规格参数编码实现)

1.分层领域模型规约 DO&#xff08; Data Object&#xff09;&#xff1a; 此对象与数据库表结构一一对应&#xff0c;通过 DAO 层向上传输数据源对象。DTO&#xff08; Data Transfer Object&#xff09;&#xff1a;数据传输对象&#xff0c; Service 或 Manager 向外传输的…

【Python】PaddleHub图像分类

目录 一、环境配置&#xff1a; 二、问题需求 三、实验内容 1、准备数据集 2、拆分数据集 3、载入数据集 4、生成数据读取器 5、配置策略 6、组建Finetune Task 7、开始Finetune 8、预测 四、总结&#xff1a; 一、环境配置&#xff1a; 线上环境&#xff1a; 飞桨…

JAVA线程入门简介

线程入门简介什么是程序?什么是进程?什么是线程&#xff1f;单线程与多线程并发与并行线程的使用用java查看有多少个cpu创建线程的两种方式继承Thread类&#xff0c;重写run方法实现Runnable接口&#xff0c;重写run方法多线程机制为社么是start?源码解析什么是程序? 是为完…

字符串转换为二进制-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-4】 字符串转换为二进制 【案例介绍】 1.任务描述 本例要求编写一个程序&#xff0c;从键盘录入一个字符串&#xff0c;将字符串转换为二进制数。在转换时&#xff0c;将字符串中的每个字符单独转换为一个二进制数&#xff0c;将所有二进制数连接起来进行输出。 案…

win10下 WSL2安装及配置

目录 一. Windows中WSL2&#xff08;子系统&#xff09;安装前提条件 二. Windows中WSL2&#xff08;子系统&#xff09;安装步骤&#xff08;默认安装C盘&#xff09; 选择包安装模式(选择到其他盘安装) 三. Windows中WSL2&#xff08;子系统&#xff09;设置默认root用户登…

35-Golang中的方法

Golang中的方法方法的介绍和使用方法的声明和调用方法的调用和传参机制原理方法的声明(定义)方法注意事项和细节讨论方法和函数的区别方法的介绍和使用 在某些情况下&#xff0c;我们需要声明(定义)方法。比如person结构体&#xff0c;除了有一些字段外(年龄&#xff0c;姓名……

Apollo规划模块代码学习(1): 算法架构原理、运行机制一文详解

文章目录 1、Apllo算法框架原理2、Apollo规划模块概述3、规划模块代码框架1、重要数据结构2、运行机制1、Apllo算法框架原理 Apollo开源自动驾驶平台中,高清地图模块提供了每个在线模块都可以访问的高清地图。感知和定位模块提供了必要的动态环境信息,可以在预测模块中进一步…

优思学院:六西格玛管理的优势有哪些?

六西格玛的优势有哪些呢&#xff1f;以下我们来探讨一下。 一・降低企业整体成本 对企业而言&#xff0c;不良品要么被废弃&#xff0c;要么需要重新加工&#xff0c;或者需要在客户现场维修或更换&#xff0c;这些都会增加企业成本。根据美国的统计数据&#xff0c;执行3σ管…

Socket编程 | TCP服务器 之 并发阻塞模型(多进程实现)

TCP服务器IO模型 之 并发阻塞 1. 引言 在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器。多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是…

docker 部署centos7.9并打包成docker

下载centos基础镜像 docker pull centos:centos7 运行镜像 docker run -itd --name centos-test -p 60001:22 --privileged centos:centos7 /usr/sbin/init 进入容器 docker exec -it ebec90068696 /bin/bash 配置容器信息 安装ssh服务和网络必须软件 yum install net-to…