动听的洗牌游戏(Java篇ArrayList实操)

本篇会加入个人的所谓‘鱼式疯言’

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
在这里插入图片描述

前言

在上篇文章中我们讲解了 ArrayList 和 顺序表 的实现

但唯一遗憾的是没有说明的具有实际运用,这次小编将带大家运用我们 ArrayList 来演示一下我们的 洗牌游戏

  1. 牌面
  2. 牌组
  3. 洗牌
  4. 抽牌

一. 牌面

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

我们将牌分为两者不用的属性: 数字和花色

从中我们就可以得到出 不同的牌面

鱼式疯言

重写 tostring()方法 时,我们可以简单重写即可 💖 💖 💖

比如像小编这样

@Override
public String toString() {return "{" ++ num +" , "+color  +'}';
}

二.牌组

public class Cards {
public String []colors={“♥”,“♣”,“♠”,“♦”};
public List createCards() {
List CardList= new ArrayList();
for (int i = 1; i <= 13; i++) {
for (int j = 0; j < colors.length; j++) {
Card card=new Card(i,colors[j]);
CardList.add(card);
}
}

    return CardList;
}

}

得到我们的牌组后我们就可以 打印其牌组观察效果了

在这里插入图片描述
先说明下我们这个实现的基本框架吧

在这里我们是以 card 为数据类型进行传递,我们只需要 把每一张 card 做好,然后把他都放到 CardList 的这张顺序表中即可,这样就得到我们 整个的牌组

鱼式疯言

从中我们打印的很顺利,主要是依靠我们的 ArrayList 来实现的,但有些细节小编就不得不提了

  1. 实例化 ArrayList 对象时需要注意

List CardList= new ArrayList();

  1. 每张卡牌都依次放入数字和颜色形成

Card card=new Card(i,colors[j]);

三. 洗牌

public class Cards {public String []colors={"♥","♣","♠","♦"};public List<Card> createCards() {List<Card> CardList= new  ArrayList<Card>();for (int i = 1; i <= 13; i++) {for (int j = 0; j < colors.length; j++) {Card card=new Card(i,colors[j]);CardList.add(card);}}return CardList;}public void shuffle(List<Card> CardList) {Random r=new Random();for (int j = CardList.size()-1; j > 0 ; j--) {int i=r.nextInt(j);swapCard(CardList,i,j);}}private void swapCard (List<Card> CardList,int i,int j) {Card tmp=CardList.get(i);CardList.set(i,CardList.get(j));CardList.set(j,tmp);}}

洗牌怎么洗,核心框架是什么
在这里插入图片描述

我们洗牌的还是利用了随机数的生成,讲 i 从后往前走,一直和 i 前面 的牌交换就是我们的洗牌流程

所以最终我们实现了这样的效果出来

在这里插入图片描述

鱼式疯言

细节一:
随机数的生成

Random r=new Random();int i=r.nextInt(j);

我们利用 Random 来new一个对象,然后在nextInt(i) 中传出随机数

原理是当放入 i 时,随机数的范围是 0 ~i-1 之间哦

细节二:
交换卡牌

我们这里要注意是以面向对象的思路,所以要有 取出卡牌和放置卡牌的不同动作

  Card tmp=CardList.get(i);CardList.set(i,CardList.get(j));CardList.set(j,tmp);

以上三行代码可以等效于:

tmp = CardList【i】;

CardList【i】= CardList【j】;

CardList【j】=tmp;

四. 抽牌

我们的抽牌有 两种方式

1. 固定三人抽牌

public  void getCard(List<Card> CaedList) {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++) {Card flg=CaedList.remove(0);List<Card> hand =hands.get(j);hand.add(flg);}}System.out.println("第一个得到的牌:"+hand1);System.out.println("第二个得到的牌:"+hand2);System.out.println("第三个得到的牌:"+hand3);}

在这里插入图片描述

最终我们得到的效果就是上面这样的

我们整体的逻辑框架就是实例化出三张手,每张手用 顺序表 hands 来管理, 然后对每张手进行从上抽牌的放入即可

鱼式疯言

这里我唯一的细节就是

  1. 我们需要把每张手进行 hands 的管理的实例化细节
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);

定义出手,其次 以每只手的类型为类型进行传入,得到 hands 进行管理

  1. 怎么放细节
    Card flg=CaedList.remove(0);List<Card> hand =hands.get(j);hand.add(flg);

从上抽出,这里的抽出是用 0 直接把第一张牌删掉,然后用个变量来接收,

其次用 j 所以的手中抽取每一只手

最后 flg 放入即可

2. 一人随机抽牌

 public List<Card> getCard(List<Card> CardList) {List<Card> hand=new ArrayList<>();Random r =new Random();for (int i = 0; i < 5; i++) {int j=r.nextInt(CardList.size());Card c=CardList.remove(j);hand.add(c);CardList.add(c);}return hand;}

我们得到的牌就是这样的效果:

在这里插入图片描述

梳理下整体的逻辑框架吧

这里我们用了随机抽牌,只需要把五张牌都抽出放入手上,最终这些牌还得 尾插到牌组后面 ,不造成牌的丢失即可

鱼式疯言

细节注意:

  1. 返回值要小心

public List getCard(List CardList)

  1. 抽取的人数未知,所以我们需要返回拿到的牌,以免牌数不够

CardList.add ( c ) ;

总结

  • 牌面: 熟悉的知晓了定义牌的两个属性
  • 牌组: 讲牌进行整合的一个顺序表,并便于后期的管理调用
  • 洗牌: 随机的理解已经面向对象的交换的本质理解
  • 抽牌: 从两个维度来考虑,灵活的把发牌的灵动性体现出来。

小伙伴都 get 到了吗 💕 💕 💕

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

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

相关文章

鸿蒙OS开发实例:【demo选择列表限定数量】

效果图&#xff1a; 示例代码 // 使用 DevEco Studio 3.1.1 Release 及以上版本&#xff0c;API 版本为 api 9 及以上。 // 主要功能及注意事项&#xff1a; // 该组件展示了一个乘客选择列表。列表中的每个项目包含一个复选框和对应的乘客姓名&#xff0c; // 用户点击任意一…

ubuntu20.04云服务器安装LXDE轻量级桌面和XRDP远程连接工具

云服务器一般都是安装命令行系统&#xff0c;用SSH连接&#xff0c;但是有时我们需要桌面来做更好的管理。 首先我们明确一下需要的东西。 一个桌面系统&#xff1a;LXDE&#xff08;最轻量级桌面&#xff09;&#xff0c;为了节省资源&#xff0c;我们只要功能够用就行。一个…

Java 编程中有哪些常见的数据结构和算法?

数据结构&#xff1a; 1. 数组 (Array)&#xff1a;是最基础且使用广泛的数据结构&#xff0c;可以存储固定大小的同类型元素序列。 2. 链表 (Linked List)&#xff1a;由一系列节点组成&#xff0c;每个节点包含对下一个节点的引用&#xff0c;适合频繁的插入和删除操作。 …

centos创建svn库步骤

1.切换root用户 1、设置root用户的密码&#xff1a; sudo passwd root 2、切换到root用户权限 su 3、切换回个人用户权限 exit 2.用root用户执行yum install -y subversion 3.创建文件夹mkdir -p /data/svn/repository 4.创建SVN 版本库 5.输入命令&#xff1a; svnadmin creat…

网络编程(1)写一个简单的UDP网络通信程序【回显服务器】,并且实现一个简单的翻译功能

使用 JAVA 自带的api 目录 一、回显服务器 UdpEchoServer 服务器代码 客户端代码 二、翻译功能 UdpDictServer 在UdpDictServer里重写process方法 一、回显服务器 UdpEchoServer /*** 回显服务器* 写一个简单的UDP的客户端/服务器 通信的程序* 这个程序没有啥业务逻辑&am…

RHCE实验-建立NFS服务器,使的客户端顺序共享数据

第一步&#xff1a;服务端及客户端的准备工作 # 恢复快照[rootserver ~]# setenforce 0​[rootserver ~]# systemctl stop firewalld​[rootserver ~]# yum install nfs-utils -y # 服务端及客户端都安装 第二步&#xff1a;服务端建立共享文件目录&#xff0c;并设置权限…

CentOS Stream 8系统配置阿里云YUM源

Linux运维工具-ywtool 目录 一.系统环境二.修改yum文件2.1 CentOS-Stream-AppStream.repo2.2 CentOS-Stream-BaseOS.repo2.3 CentOS-Stream-Extras.repo 三.只有一个配置文件四.其他知识4.1 如果想要启用其他源,修改文件配置:enabled14.2 国内源链接 一.系统环境 CentOS Strea…

Spire.PDF for .NET【文档操作】演示:查找并删除 PDF 中的空白页

PDF 中的空白页并不罕见&#xff0c;因为它们可能是作者故意留下的或在操作文档时意外添加的。当您阅读或打印文档时&#xff0c;这些空白页可能会很烦人&#xff0c;因此可能非常有必要将其删除。在本文中&#xff0c;您将了解如何使用Spire.PDF for .NET以编程方式查找和删除…

jupyter lab使用虚拟环境

python -m ipykernel install --name 虚拟环境名 --display-name 虚拟环境名然后再启动jupyter lab就行了

pandas 函数

pandas是基于numpy数组构建的&#xff0c;但二者最大的不同是pandas是专门为处理表格和混杂数据设计的&#xff0c;比较契合统计分析中的表结构&#xff0c;而numpy更适合处理统一的数值数组数据。pandas数组结构有一维Series和二维DataFrame。 Series的字符串表现形式为&#…

STM32学习笔记(6_8)- TIM定时器的编码器接口代码

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 现在开…

低代码平台与自动化软件开发的关系

引言 随着信息技术的不断发展&#xff0c;软件开发领域也在不断演进。在追求更高效、更快速的软件开发过程中&#xff0c;低代码平台和自动化软件开发技术日益受到关注。低代码平台以其可视化开发界面和快速构建应用的能力&#xff0c;为非专业开发人员提供了参与软件开发的机会…

有内置泵电源垂直输出电路,偏转电流可达1.7Ap-pp,可用于中小型显示器的国产芯片 78040

78040是一款场扫描电路&#xff0c;偏转电流可达1.7Ap-p&#xff0c;可用于中小型显示器。 二 特 点 1、有内置泵电源 2、垂直输出电路 3、热保护电路 4、偏转电流可达1.7Ap-p 三 基本参数 四 应用电路图 1、应用线路 2、PIN5脚输出波形如下&#xff1a;

windows允许指定IP段访问本地端口

虚拟机内部应用有时候需要访问windows的一些端口&#xff0c;例如数据库或Redis等&#xff0c;默认情况下&#xff0c;需关闭windows上的防火墙才可正常访问。本文通过在防火墙设置允许指定IP段进行访问来处理&#xff0c;不用每次操作都关闭防火墙。 入站规则-》新建规则 完成…

【jenkins+cmake+svn管理c++项目】Windows环境安装以及工具配置

一、目标和环境 目标&#xff1a;搭建一个jenkins环境&#xff0c;实现jenkins调用cmake和svn和VS编译c项目&#xff0c;并将生成的库上传svn。 环境&#xff1a;win10虚拟机&#xff08;练习流程用&#xff0c;正式用的话还是放到服务器&#xff09;&#xff0c;VS2017. 二、…

linux忘记mysql的root密码,强制修改

1、登录linux后编辑mysql的配置文件&#xff1a;vi /etc/my.cnf 2、添加如下代码&#xff0c;表示跳过授权表登录mysql 编辑完成后&#xff0c;按Esc键&#xff0c;":wq"退出编辑并保存修改内容。 3、使用命令&#xff1a;service mysqld restart 重启mysql服务. …

[蓝桥杯 2021 省 B] 杨辉三角形

这道二分fix了半年 我还是那么&#x1f96c;..... 注意边界 先找规律&#xff0c;再二分 还学到了暴力算C&#xff08;i,j&#xff09;的超级暴力手段... #include<bits/stdc.h> using namespace std; using ll long long; using pii pair<int,int>; #define in…

神经网络代码实现(用手写数字识别数据集实验)

目录 一、前言 二、神经网络架构 三、算法实现 1、导入包 2、实现类 3、训练函数 4、权重参数矩阵初始化 5、参数矩阵变换向量 6、向量变换权重参数矩阵 7、进行梯度下降 7.1、损失函数 7.1.1、前向传播 7.2、反向传播 8、预测函数 四、完整代码 五、手写数字识别 一、前言 …

HarmonyOS网格布局:List组件和Grid组件的使用

简介 在我们常用的手机应用中&#xff0c;经常会见到一些数据列表&#xff0c;如设置页面、通讯录、商品列表等。下图中两个页面都包含列表&#xff0c;“首页”页面中包含两个网格布局&#xff0c;“商城”页面中包含一个商品列表。 上图中的列表中都包含一系列相同宽度的列表…

【Linux系统】进程概念创建进程进程标示符

什么是进程&#xff1f; 操作系统中&#xff0c; 进程可以同时存在非常多的。根据我们之前谈的操作系统具有“管理”的特性&#xff0c; 那么就有&#xff0c;既然要管理&#xff0c;就要 --- 先描述&#xff0c;在组织&#xff01;&#xff01;&#xff01; 由冯诺依曼体系结…