基于ArrayList实现简单洗牌

前言

在之前的那篇文章中,我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE

基于此,便好理解ArrayList和后面的洗牌游戏了。

什么是ArrayList?

 ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表,与普通数组的区别就是它是没有固定大小的限制。

ArrayList的一些常见操作

首先我们要导入一个ArrayList包

import java.util.ArrayList;

在正式调用方法之前,别忘了创建一个ArrayList对象哦~

ArrayList<String> list = new ArrayList<>();

在这里,我就创建了一个只能存储String类型数据的ArrayList(顺序表)

下面便是ArrayList一些常见的使用方法,仔细观察就不难发现这些方法在模拟实现顺序表的时候就已经实现过了,现在直接用就行了,若有不记得了,可查看帮助手册-->Overview (Java SE 17 & JDK 17)

import java.util.ArrayList;

public class commonTest {
        public static void main(String[] args) {
            // 创建一个ArrayList并添加一些元素
            ArrayList<String> list = new ArrayList<>();
            list.add("apple");
            list.add("banana");
            list.add("orange");

            // 使用get方法获取指定位置的元素
            String fruit = list.get(1);
            System.out.println("下标为1的水果是: " + fruit);

            // 使用set方法替换指定位置的元素
            list.set(0, "hello");
            System.out.println("替换之后 " + list);

            // 使用remove方法移除指定位置的元素
            list.remove(2);
            System.out.println("移除之后 " + list);

            // 使用size方法获取列表大小
            int size = list.size();
            System.out.println("列表大小: " + size);

            // 使用contains方法判断列表是否包含指定元素
            boolean containsBanana = list.contains("banana");
            System.out.println("是否包含banana " + containsBanana);
        }
    }

运行结果如图


运用之实现简单洗牌

纸牌相信大家都接触过,来看看如何利用ArrayList去实现洗牌?

这才是本文的重点哦~理论最终还是要服务与实践的,接下来就由我来带着各位看官来实现吧~

首先思考:

要洗牌,首先要有牌,想要表示出来,那么便要想好牌的属性--->花色和数字,好,那么就可以定义一个Card类专门存储这个,看下图:

public class Card {
    public int rank; // 表示牌面的数字
    public String suit; // 表示花色

    // 构造方法,用于初始化牌的数字和花色
    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
    
    // 重写toString()方法,以便打印Card对象时能够直观地展示牌的信息
    @Override
    public String toString() {
        return "Card{" + suit + "  " + rank + "}";
    }
}

这样一来,这个Card类很好地封装了扑克牌的属性。

一张牌肯定不够,一副牌有52张(去掉大小王)---4个花色,1到13的数字,在洗牌之前,先有一副完整的牌才行显示出来才行

于是就新定义一个Cards类,规定好牌的花色

public static final String[] suits = {"♥", "♠", "♣", "♦"};//定义四种花色

还记得final 的作用吗?这里用final 修饰就是为了不被修改

接着通过两个循环,一个遍历花色,一个遍历数字 ,这样一张新牌就创建好了,别忘了要创建存放牌的List,这里就导入了ArrayList包以便用add方法了。

import java.util.ArrayList;
import java.util.List;
// 买一副牌
public List<Card> buyCards() {
    List<Card> cardList = new ArrayList<>(); // 基于ArrayList创建一个用于存放牌的List

    for (int i = 0; i < 4; i++) { // 循环四种花色
        for (int j = 0; j < 13; j++) { // 循环13个数字(2-10,J,Q,K,A)
            int rank = j; // 当前数字
            String suit = suits[i]; // 当前花色
            Card card = new Card(rank, suit); // 创建一张新的牌对象
            cardList.add(card); // 将新牌加入到牌组中
        }
    }
    
    return cardList; // 返回完整的一副牌
}

此时运行便是这个样子

这下牌有了那就开始洗牌了,洗牌肯定讲究随机,讲到随机少不了Random方法,要调用它,也到导入对应的Random包。将生成的随机数对应的牌(看索引)在遍历的过程中与每个牌的位置进行交换,这样便完成了洗牌,配合代码食用效果更佳~

import java.util.Random;
// 洗牌
public void shuffle(List<Card> cardList) {
    Random random = new Random(); // 创建一个随机数生成器

    for (int i = cardList.size(); i > 0; i--) { // 从最后一张牌开始向前遍历
        int index = random.nextInt(i); // 生成一个随机的索引
        swap(cardList, i - 1, index); // 将当前牌与随机选出的牌进行交换
    }
}

// 洗牌的原理-交换
public void swap(List<Card> cardList, int i, int j) {
    Card tmp = cardList.get(i); // 临时保存第i张牌
    cardList.set(i, cardList.get(j)); // 将第i张牌替换为第j张牌
    cardList.set(j, tmp); // 将第j张牌替换为临时保存的牌
}

还记得set方法是干嘛的吗?--->替换指定位置的元素,常见的记住可以提高效率的

此时效果是这样的 

那么到此牌洗好了,那就开始发牌,假设我们有三个人打牌,为了方便展示,就每人抽4张牌,思考一下,拿到牌后是不是也要存储才是?于是便要创建3个List去接受摸到的牌

// 发牌,三个人,每个人轮流摸4
public void drawCard(List<Card> cardList) {
    List<Card> hand1 = new ArrayList<>(); // 第一个人的手牌
    List<Card> hand2 = new ArrayList<>(); // 第二个人的手牌
    List<Card> hand3 = new ArrayList<>(); // 第三个人的手牌

    List<List<Card>> hand = new ArrayList<>(); // 存放三个人的手牌列表
    hand.add(hand1);
    hand.add(hand2);
    hand.add(hand3);

    for (int i = 0; i < 4; i++) { // 每个人轮流摸4张牌
        for (int j = 0; j < 3; j++) { // 三个人依次摸牌
            Card card = cardList.remove(0); // 从牌组中抽取一张牌,并从原来的牌组中移除
            hand.get(j).add(card); // 将抽取的牌加入到对应人的手牌列表中
        }
    }
    
    // 打印每个人摸到的牌
    System.out.println("第1个人摸到的牌:" + hand1);
    System.out.println("第2个人摸到的牌:" + hand2);
    System.out.println("第3个人摸到的牌:" + hand3);
    
}

开始摸牌,用嵌套循环去模拟分发,这里要明白为啥每次只remove(0),这是因为存储牌的也是是基于ArrayList的List,每次移除第一个元素,后续的元素会自动补上,这样一来,每次遍历,下标为0的元素就是原来的下一张牌,就很好地模拟了实际的摸牌体验,

当然,循环停止后,也可以打印剩下的牌

        System.out.println("剩余的牌");//显示剩余的牌
            System.out.println(cardList);

 最后在创建一个测试类来看看效果是否符合预期

import java.util.List;

public class demo {
    public static void main(String[] args) {
        Cards cards=new Cards();

        List<Card> cardList=cards.buyCards();
        System.out.println("刚开始的牌"+cardList);

        cards.shuffle(cardList);
        System.out.println("洗牌之后"+cardList);

        cards.drawCard(cardList);//摸牌

    }
}

最后的效果便是这般

说到这里,简单的洗牌游戏就被成功实现啦,如果感觉文章对你有所帮助的话,还请点点赞~

期待我们下次相会😉

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

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

相关文章

关于hive启动的相关问题记录

问题&#xff1a;初始化hive元数据报错 [atguiguhadoop102 software]$ schematool -initSchema -dbType mysql -verboseError: Table CTLGS already exists (state42S01,code1050) Closing: 0: jdbc:mysql://hadoop102:3306/metastore?useSSLfalse org.apache.hadoop.hive.me…

数据结构和算法:十大排序

排序算法 排序算法用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更高效地查找、分析和处理。 排序算法中的数据类型可以是整数、浮点数、字符或字符串等。排序的判断规则可根据需求设定&#xff0c;如数字大小、字符 ASCII…

Linux文件管理,压缩/解压缩和vi编辑器

目录 一.linux文件管理 1.cat 2. head和tail 3.WC 4.grep 5.paste&#xff08;合并&#xff09; 二.压缩,解压缩 1.gzip bzip2 2.归档tar 3.zip 和unzip 三.vi编辑器 一.linux文件管理 1.cat 格式 &#xff1a;cat 选项 文件名 &#xff08;文件名可以是单…

哈佛大学商业评论 --- 第三篇:真实世界中的增强现实

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 本文作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大…

软件杯 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xf…

代码随想录第30天|51. N皇后

51. N皇后 51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 这就是传说中的N皇后&#xff1f; 回溯算法安排&#xff01;| LeetCode&#xff1a;51.N皇后_哔哩哔哩_bilibili 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行…

mysql+keepalive+lvs搭建的数据库集群实验

前提条件&#xff1a;准备5台计算机&#xff0c;且网络互通 1、客户端 yum groups -y install mariadb-client ip 192.168.0.5 2、lvs1 yum-y install ipvsadm keepalived ip 192.168.0.1 keepalivedvip 192.168.0.215 /etc/hosts 解析192.168.0.1 主机名 3、lvs2 yum-y i…

大数据实验三-HBase编程实践

目录 一&#xff0e;实验内容 二&#xff0e;实验目的 三&#xff0e;实验过程截图及说明 1、安装HBase 2、配置伪分布式模式&#xff1a; 3、使用hbase的shell命令来操作表&#xff1a; 4、使用hbase提供的javaAPI来编程实现类似操作&#xff1a; 5、实验总结及心得体会…

uniApp使用uview对vuex的二次封装实现全局变量

1、uni-app目根目录新建’/store/index.js’&#xff0c;并复制如下内容到其中 2、uni-app目根目录新建’/store/ u . m i x i n . j s ′ &#xff0c;并复制如下内容到其中&#xff0c;由于 H X 某些版本的限制&#xff0c;我们无法帮您自动引入 " u.mixin.js&#xff0…

不堪大用的pow

【题目描述】 输出100&#xff5e;999中的所有水仙花数。若3位数ABC满足&#xff0c;则称其为水仙花 数。例如&#xff0c;所以153是水仙花数。 【题目来源】 刘汝佳《算法竞赛入门经典 第2版》习题2-1 水仙花数&#xff08;daffodil&#xff09; 题目很简单&#xff0c;…

指针的偏移遍历数组--指针和数组名的区别

1.指针取地址&#xff1a;可以是数组名&#xff0c;可以是数组首地址&arr[0] 2.指针偏移完后记得回到数组首地址 #include <stdio.h>int main(){int arr[3] {1,2,3};int *p;int i;p arr; // 数组名就是数组的首地址// p &arr[0] 数组的首地址就是首个元素…

二分答案跳石头游戏

步骤&#xff1a; 输入&#xff1a; 用户输入了三个整数&#xff0c;分别表示石头的总长度l&#xff0c;石头的数量n&#xff0c;以及最多可以撤去的石头数量m。 初始化石头位置数组&#xff1a; 创建一个长度为n2的数组arr&#xff0c;用于存储每块石头的位置。数组的第一项…

FreeRTOS作业day4

1.总结二进制信号量和计数型信号量的区别&#xff0c;以及他们的使用场景。 二进制信号量的数值只有0和1&#xff0c;用于共享资源的访问 计数型信号量的值一般是大于或者等于2&#xff0c;用于生产者和消费者模型 2.使用技术型信号量完成生产者和消费者模型实验。 void Sta…

使用 ChatGPT 集成精通高级 Excel(二)

原文&#xff1a;Mastering Advanced Excel - With ChatGPT Integration 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第九章数据透视表 介绍 数据透视表是一种基于交互式工作表的表格&#xff0c;可以快速汇总大量数据&#xff0c;使用您选择的格式和计算方法。它…

AI论文速读 | 2024[WWW]不只是路线:联合 GPS 和路线建模的轨迹表示学习

论文标题&#xff1a;More Than Routing: Joint GPS and Route Modeling for Refine Trajectory Representation Learning 作者&#xff1a;Zhipeng Ma&#xff08;麻志鹏&#xff09;, Zheyan Tu, Xinhai Chen, Yan Zhang, Deguo Xia, Guyue Zhou, Yilun Chen, Yu Zheng&…

基于springboot实现影城管理系统项目【项目源码+论文说明】

基于springboot实现影城管理系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多生活之中&#xff0c;随之就产生了“小徐影城管理系统”&#xff0c;这样就让小徐影城管理系统更加方便简单。 对于本小…

面试官:为什么忘记密码要重置,而不是告诉我原密码?

前端训练营&#xff1a;1v1私教&#xff0c;终身辅导计划&#xff0c;帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello&#xff0c;大家好&#xff0c;我是 Sunday。 最近有个同学在面试中遇到了一个很有意思的问题&#xff0c;我相信大多…

基于深度学习的铁轨缺陷检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的铁轨缺陷检测系统。核心技术上&#xff0c;文章采用了最先进的YOLOv8&#xff0c;并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行了性能指标的对比分析。文中详细阐述了国内外铁轨缺陷检测的研究现状、数据集处理方法…

【Linux】error: Failed to initialize NSS library

【Linux】error: Failed to initialize NSS library 原因&#xff1a;卸载了sqlite [rootnode1 ~]# rpm -qa|grep sql sqlite-3.7.17-8.el7.x86_64 rpm -e --nodeps sqlite-3.7.17-8.el7.x86_64 百度搜索 sqlite-3.7.17-8.el7.x86_64 下载此rpm包 cd /usr/local/download …

【C++第三阶段】STL初识

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 STL初步认识vector存放内置数据类型vector存放自定义数据类型vector 嵌套容器 STL初步认识 回顾时&#xff0c;需要回答自己 ①STL是什么&#xff1f; ②STL怎么用&#xff1f; …