【Java】:洗牌功能和杨辉三角的实现

在这里插入图片描述

洗牌

在这里插入图片描述
此操作包含的基本功能有:

  1. 组牌:组建 52 张扑克牌
  • 四种花色:“♥️”,“♠️”,“⬛️”,“♣️”
  • 每种花色 13 张牌:1~13
  1. 洗牌:将 52 张扑克牌打乱顺序
  2. 发牌:给三个人每人发 5 张牌

扩展功能:

  • 清牌:将每人手中牌按照面值进行从大到小排序

Card 类

在此类中,我们将完成对每一张牌的构造

  • 类中含有成员变量

    • 花色:suit
    • 面值:rank
  • 带有一个含参的构造方法,用来之后传入对应参数进行新牌的构造

  • 重写 toString() 方法,让输出的结果更美观


public class Card {public int rank;public String suit;public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}@Overridepublic String toString() {return "{" ++ rank +" " + suit +"}";}
}


CardBox 类

所有的功能都将在这个类中进行具体地实现


组牌

组建 52 张牌:List<Card> buildCard()

思路
  1. 创建一个容量为 52,接收对象为 Card 的链表 cardList
  2. 两个 for 循环,为 Card 类里面的两个成员变量造值
  3. 随后依次为 Card 类实例化对象,将两个成员变量传入 Card 的构造方法中,创造出一张牌
  4. 最后依次将实例化出来的对象加入链表

代码
public class CardBox {public static final String[] suits = {"♥️", "♠️", "⬛️", "♣️"};public static List<Card> makeCard() {List<Card> cardList = new ArrayList<>(52);for (int i = 0; i < 4; i++) {for (int j = 1; j <= 13; j++) {int rank = j;String suit = suits[i];Card card = new Card(rank, suit);cardList.add(card);}}return cardList;}
}


洗牌

运用下标交换进行牌的打乱:void shuffle(List<Card> cardList)

思路
  1. 使用随机数函数 Random 进行下标交换匹配,用随机数函数创造一个范围内的下标 randomIndex
  2. 再让随机数 randomIndex 下标在顺序表中对应的牌与目标牌进行交换
  3. 交换需要用到一个自定义函数:void swap(List<Card> cardList, int i, int j)
    • 此函数对 cardList 链表进行操作,将其中 i 位置的数据与 j 位置的数据进行交换

代码
 public static void shuffle(List<Card> cardList) {for (int i = cardList.size() - 1; i > 0; i--) {int randomIndex = new Random().nextInt(i);swap(cardList,randomIndex,i);}
}private static void swap(List<Card> cardList, int i, int j){Card tmp = cardList.get(i);cardList.set(i,cardList.get(j));cardList.set(j,tmp);
}


发牌

将牌分发给三个人:void drawCard (List<Card> cardList)

思路
  1. 为四个人创建三个 Card 类型的链表,就相当于是“他们的手”,用来拿他们发到的牌
  2. 再创建一个以“他们的手”为类型的链表,就相当于是“发牌人的手”,用来将发好的牌堆发给他们
  3. 发牌的原理是依次移走下标为 0 的那张牌

代码
public void drawCard (List<Card> cardList) {List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();List<Card> hand3 = new ArrayList<>();List<List<Card>> hands = new ArrayList<>();hands.add(hand1);hands.add(hand2);hands.add(hand3);for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {hands.get(j).add(cardList.remove(0));}}
}


扩展:清牌

在发牌之后,将每人手中牌按照面值进行从大到小排序:

思路
  1. 重写 Collection 接口中的 sort() 方法
  2. 在参数中直接传入一个用来排序链表的比较器

代码
public void drawCard (List<Card> cardList){List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();List<Card> hand3 = new ArrayList<>();List<List<Card>> hands = new ArrayList<>();hands.add(hand1);hands.add(hand2);hands.add(hand3);for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {hands.get(j).add(cardList.remove(0));}}for (int i = 0; i < 3; i++) {Collections.sort(hands.get(i), new Comparator<Card>() {@Overridepublic int compare(Card o1, Card o2) {return o1.rank - o2.rank;}});}System.out.println("第一个人的牌"+hand1);System.out.println("第二个人的牌"+hand2);System.out.println("第三个人的牌"+hand3);
}


运行结果

在这里插入图片描述

杨辉三角

思路

在这里插入图片描述

  1. 首位:每行的第一个都是 1,直接 add(1) 进入当前行 curRow
  2. 中间的值:
    • i 行的第 j 下标元素是第 i - 1 行的第 j 下标元素和 j - 1 下标元素相加之和
  3. 末位:为 1,直接 add(1) 进入当前行 curRow

代码

public List<List<Integer>> generate(int numRows) {List<List<Integer>> ret = new ArrayList<>();List<Integer> list = new ArrayList<>();//第一行第一列list.add(1);ret.add(list);for (int i = 1; i < numRows; i++) {//当前行List<Integer> curRow = new ArrayList<>();//首位均为 1curRow.add(1);//中间的for (int j = 1; j < i; j++) {//i = 1是当前行,那 i - 1就是上一行List<Integer> preRow = ret.get(i - 1);int x1 = preRow.get(j);int x2 = preRow.get(j - 1);curRow.add(x1 + x2);}//当前行,最后一个 1curRow.add(1);ret.add(curRow);}return ret;}

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

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

相关文章

【深度学习入门篇 ⑪】自注意力机制

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

C#进阶:深入理解异步编程与并发

在现代软件开发中&#xff0c;异步编程和并发控制是不可或缺的技能。随着应用程序变得越来越复杂&#xff0c;对性能、响应性和可扩展性的要求也越来越高。C#提供了强大的工具来支持异步编程和并发处理&#xff0c;如async和await关键字、Task Parallel Library&#xff08;TPL…

Vue3 SvgIcon组件开发

在前面自定义tree组件继续功能迭代前&#xff0c;我们先开发一个通用的ScgIcon组件&#xff0c;用于后续组件模板中小图标的展示。 引入iconfont 官网&#xff1a;https://www.iconfont.cn/ 选取图标进行下载&#xff0c;只取iconfont.js文件 在prettier中忽略该文件&#x…

【YOLOv5/v7改进系列】引入CoordConv——坐标卷积

一、导言 与标准卷积层相比&#xff0c;CoordConv 的主要区别在于它显式地考虑了位置信息。在标准卷积中&#xff0c;卷积核在输入上滑动时&#xff0c;仅关注局部区域的像素强度&#xff0c;而忽略其绝对位置。CoordConv 通过在输入特征图中添加坐标信息&#xff0c;使得卷积…

【常用知识点-Linux】查询端口情况

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-22 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 ss命令为socket statistics的缩写&#xff0c;是Linux的一个网络管理命令&#xff0c;主要用于获取系统中socket的统计信息&am…

[C/C++入门][for]26、统计满足条件的4位数(循环经典练习)

给定若干个四位数&#xff0c;求出其中满足以下条件的数的个数&#xff1a;个位数上的数字减去千位数上的数字&#xff0c;再减去百位数上的数字&#xff0c;再减去十位数上的数字的结果大于零。 【输入】 输入为两行&#xff0c;第一行为四位数的个数n&#xff0c;第二行为n个…

【SpringBoot】第3章 系统配置之日志配置

SpringBoot自带spring-boot-starter-logging库来实现系统日志功能&#xff0c;spring-boot-starter-logging组件默认使用LogBack日志记录工具。系统运行日志默认输出到控制台&#xff0c;也能输出到文件中。下面通过示例来演示SpringBoot项目配置日志的功能。 修改pom.xml文件…

校园招聘 之 Java HashMap

校园招聘与社会招聘在多个方面存在显著的区别&#xff0c;这些区别主要体现在招聘对象、招聘目的、招聘方式、招聘周期、招聘成本以及入职后的发展等方面。校招也更注重理论知识&#xff0c;俗称八股文&#xff0c;其实有些东西为什么一直拿来问&#xff0c;其实这里面你仔细品…

速盾:cdn技术实现原理是什么?

CDN技术&#xff08;内容分发网络&#xff09;是一种通过将内容部署到离用户更近的服务器上&#xff0c;从而提高网站访问速度和用户体验的技术。它的实现原理主要包括以下几个步骤&#xff1a; 域名解析&#xff1a;用户输入网址&#xff0c;浏览器首先向DNS服务器发送域名解析…

STM32CubeIDE(CAN)

目录 一、概念 1、简述 2、CAN 的几种模式 二、实践 1、环回模式轮询通信 1.1 软件配置 1.2 代码编写 2、环回模式中断通信 2.1 软件配置 2.2 代码编写 一、概念 1、简述 STM32微控制器系列包含多个型号&#xff0c;其中一些型号集成了CAN&#xff08;Controller Are…

Vuex--全局共享数据

目录 一 是什么? 二 怎么用&#xff1f; 三 注意点 一 是什么? 在此之前&#xff0c;我们使用vue的数据全部放在每个组件的data区域里面&#xff0c;这里return里面存的都是这个组件要用到的数据&#xff0c;但是这里面的数据是局部的数据&#xff0c;也就是说这些数据是这…

Chrome v8 pwn 前置

文章目录 参考用到啥再更新啥简介环境搭建depot_tools和ninjaturbolizer 调试turbolizer使用结构数组 ArrayArrayBufferDataViewWASMJSObject结构Hidden Class命名属性-快速属性Fast Properties命名属性-慢速属性Slow Properties 或 字典模式Dictionary Mode编号属性 (Elements…

基于springboot+vue+uniapp的宿舍管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

van-dialog 组件调用报错

报错截图 报错原因 这个警告表明 vue 在渲染页面时遇到了一个未知的自定义组件 <van-dialog>&#xff0c;并且提示可能是由于未正确注册该组件导致的。在 vue 中&#xff0c;当我们使用自定义组件时&#xff0c;需要先在 vue 实例中注册这些组件&#xff0c;以便 vue 能…

交易积累-AR

在股票交易分析中&#xff0c;AR&#xff08;Accumulation/Distribution Rating&#xff0c;积累/分配指标&#xff09;是一个反映股票在一定时期内被积累&#xff08;买入&#xff09;或分配&#xff08;卖出&#xff09;情况的指标。它是由美国著名的股票投资者威廉J奥尼尔&a…

本地搭建ros2环境步骤(x86_64架构)

验证效果&#xff1a;ros2跟redis能够相互通信&#xff0c;但不会接收到其它 orin 的 topic 消息&#xff1b;本地的话直接当作slave机器来用 注&#xff1a;ros2 的全局 param 需要依赖一个单点 redis-server&#xff0c;ros2 的全局 param 数据是保存在这个单点 redis-ser…

Json结构解析比较

文章目录 前言正文一、项目简介二、核心代码1、 JavaBeanParser2、 JsonStructCompare3、 Client 测试结果 前言 本次练习&#xff0c;主要是针对于两个Json的结构差异。 多用于测试场景&#xff0c;比如一个很大的Json报文&#xff0c;需要和现有的Json报文对比&#xff0c;看…

【快速逆向二/无过程/有源码】掌上高考—2024高考志愿填报服务平台

逆向日期&#xff1a;2024.07.21 使用工具&#xff1a;Node.js 加密工具&#xff1a;Crypto-js标准库 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&…

百日筑基第二十八天-23种设计模式-行为型总汇

百日筑基第二十八天-23种设计模式-行为型总汇 文章目录 百日筑基第二十八天-23种设计模式-行为型总汇前言模板方法模式简介模板方式的特点模板方法模式结构类图模板方式模式案例分析模板方法模式应用源码分析模板方法模式的注意事项和细节 迭代器模式迭代器模式结构类图迭代器模…

modbus中3.5字节时间如何计算

示例&#xff1a;波特率是115200bps &#xff08;比特每秒&#xff09; 1、计算每个比特的时间 2、每字节时间 1个字符8数据位1起始位1停止位&#xff0c;则每传输一个字符需要10位 3、3.5个字节的时间