【数据结构】:链表实现洗牌功能

news2024/11/15 9:27:02

在这里插入图片描述

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

  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;
    }


    @Override
    public 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>() {
            @Override
            public int compare(Card o1, Card o2) {
                return o1.rank - o2.rank;
            }
        });

    }

    System.out.println("第一个人的牌"+hand1);
    System.out.println("第二个人的牌"+hand2);
    System.out.println("第三个人的牌"+hand3);
}


运行结果

在这里插入图片描述

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

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

相关文章

关于光伏电站监控数据

电站监控后台显示的发电量数据不能真实的反应不同逆变器方案的发电量差异。组串式逆变器由于交流线缆长&#xff0c;损耗的电量比集中式方案高1-2%左右。在通过监控后台显示的发电量衡量不同逆变器的差异时&#xff0c;需要减掉这部分差值。 光伏电站监控后台统计的发电量是从光…

桌面小宠物发布一周,第一次以独立开发者的身份赚到了100块

收入数据(AppStore一周收入统计) AppStore付费工具榜第七 应用简介 桌面新宠(NewPet)&#xff0c;是我耗时半年开发的一款桌面宠物。我是被 QQ 宠物影响的那批人&#xff0c;上学时天天给 QQ 宠物喂食&#xff0c;很可惜它现在不在了。所以&#xff0c;我开发的初衷是想要在电…

图像分类算法概述:深度学习方法

图像分类算法概述&#xff1a;深度学习方法 图像分类是计算机视觉中的一个基本任务&#xff0c;近年来随着深度学习的发展&#xff0c;图像分类算法取得了巨大的进步。本文将概述主要的深度学习图像分类算法。 #mermaid-svg-fkTtkPLl9ahuVT6w {font-family:"trebuchet ms…

Linux(CentOS7)部署PHP-7.2.17源码包

PHP-7.2.17源码包部署 安装php1. 解压并进入php-7.2.17文件夹2. 编写php.sh脚本3. 执行php.sh 配置Apache与PHP1. 编写httpd.conf配置文件2. 编写php测试脚本 部署HTTPD-2.4.37源码包点击跳转 部署MySQL-5.6.31源码点击跳转 下载源码包和依赖的源码包&#xff0c;资源见文章顶…

TiDB实践—索引加速+分布式执行框架创建索引提升70+倍

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/92d348c2 背景介绍 TiDB 采用在线异步变更的方式执行 DDL 语句&#xff0c;从而实现 DDL 语句的执行不会阻塞其他会话中的 DML 语句。按照是否需要操作 DDL 目标对象所包括的数据来划分…

linux学习week4+5

linux学习 十四.shell编程 9.单分支多分支 基本语法&#xff1a; if [ 条件 ] then代码 elif [ 条件 ] then代码 fi10.case语句 基本语法&#xff1a; case $变量名 in "值1") 程序1&#xff08;如果变量的值等于值1&#xff0c;则执行程序1&#xff09; ;; &q…

LeetCode刷题记录(第三天)55. 跳跃游戏

题目&#xff1a; 55. 跳跃游戏 标签&#xff1a;贪心 数组 动态规划 题目信息&#xff1a; 思路一&#xff1a;动态规划 确定dp数组含义&#xff1a; dp[i] 第[i]个位置能否达到确定递推公式&#xff1a; dp[i] 能不能达到&#xff0c;取决于前面d[i-j]&#xff0c;d[i-j…

Linux TFTP服务搭建及使用

1、TFTP 服务器介绍 TFTP &#xff08; Trivial File Transfer Protocol &#xff09;即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为 69 2、TFTP 文件传输的特点 tftp…

【博主推荐】HTML5实现简洁的实用的个人网站、个人主页七个页面源码

文章目录 1.设计来源1.1 个人主页界面1.2 关于我界面1.3 我的技能界面1.4 我的经验界面1.5 我的教育界面1.6 我的项目界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;…

【MQTT(2)】开发一个客户端,ubuntu版本

基本流程如下&#xff0c;先生成Mosquitto的库&#xff0c;然后qt调用库进行开发界面。 文章目录 0 生成库1 有界面的QT版本2 无界面版本 0 生成库 下载源码&#xff1a;https://github.com/eclipse/mosquitto.git 编译ubuntu 版本很简单&#xff0c;安装官方说明直接make&am…

1分钟带你了解等保测评流程

常言道&#xff1a;“安全无小事&#xff0c;防患于未然。” 在信息化高速发展的今天&#xff0c;网络安全已成为国家安全的重要组成部分&#xff0c;等级保护&#xff08;简称“等保”&#xff09;测评作为网络安全防护的重要手段&#xff0c;对于确保信息系统安全、稳定运行…

总台数430!2023年度各省燃机台数及装机容量一览

重型燃气轮机发电作为清洁能源战略的核心&#xff0c;将持续被强化以推动“双碳”目标的达成。鉴于其高度复杂的设计与制造流程&#xff0c;它成为了国家高端制造水平的象征。近年来&#xff0c;在科技强国战略的推动下&#xff0c;我国重型燃气轮机行业正迈向自主研发、创新突…

Elasticsearch基础(五):使用Kibana Discover探索数据

文章目录 使用Kibana Discover探索数据 一、添加样例数据 二、数据筛选 三、保存搜索 使用Kibana Discover探索数据 一、添加样例数据 登录Kibana。在Kibana主页的通过添加集成开始使用区域&#xff0c;单击试用样例数据。 在更多添加数据的方式页面下方&#xff0c;单击…

AJAX复习总结

AJAX复习总结 AJAX即“Asynchronous JavaScript and XML”&#xff08;异步的JavaScript与XML技术&#xff09;,是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。简单来说&#xff0c;AJAX就是让网页变得更快、更灵活的一种方法 举个例子&#xff1a…

昇思25天学习打卡营第4天 | 网络构建

在学习和实践MindSpore神经网络模型构建的过程中&#xff0c;我深刻理解了MindSpore中如何通过nn.Cell类来构建和管理复杂的神经网络模型。通过这次的实践&#xff0c;我对神经网络的基本构建和应用有了更加全面的认识&#xff0c;以下是我学习过程中所总结的几点心得&#xff…

一行Python代码实现数据清洗的18种方法

目录 1. 去除字符串两边空格 2. 转换数据类型 3. 大小写转换 4. 移除列表中的重复元素 5. 快速统计元素出现次数 6. 字符串分割成列表 7. 列表合并 8. 数据填充 9. 提取日期时间 10. 字符串替换 11. 快速排序 12. 提取数字 13. 空值处理&#xff08;假设是列表&am…

powe bi界面认识及矩阵表基本操作 - 1

powe bi界面认识及矩阵表操作 1. 界面认识1.1 选择数据源1.2 选择相关表及点击加载1.3 表字段显示位置1.4 表属性按钮位置1.5 界面布局按钮认识 2. 矩阵表基本操作2.1 选择矩阵表2.2 创建矩阵表2.3 设置字体大小2.4 行填充&#xff1a;修改高度2.5 列宽&#xff1a;设置列的宽度…

内置华为视频终端API接口的中央控制系统

内置华为视频终端API接口的中控系统是一种高度集成化的智能控制系统&#xff0c;它通过将华为视频终端的控制功能集成到中控系统中&#xff0c;实现了对华为视频终端的远程控制和集中管理。以下是对该系统的详细介绍&#xff1a; 一、系统概述 该系统通过调用华为视频终端提供…

自建网站统计工具 Umami 替代 Google Analytics

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 Umami 是一款开源的网站统计工具,与 Google Analytics 相比更加的轻量,且不会收集网站用户的个人信息。同时,Umami 的仪表盘界面简洁,UI 精美,方便我们查看网站的历史统计数据。 Umami 使用方式也与 Google Ana…

2024 微信小程序 学习笔记 第二天

1. WXML 模板语法 数据绑定 事件绑定 条件渲染 列表渲染 2. WXSS 模板样式 rpx 样式导入 全局和局部样式 3. 全局配置 window tabBar 配置tabBar案例 4. 网络数据请求 Get请求 Post 请求 加载时请求 5. 案例 -本地生活&#xff08;首页&#xff09; 导航栏 轮播图 九宫格效果…