【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)
【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏
- 基本框架的实现
- 创建一副牌
- 如何进行洗牌:
- 每个人抓的牌放到哪里:
- 源码具体实现
- card
- cards
- Test
个人简介:努力学编程`
每日鸡汤:stay foolish,stay hungry-史蒂芬.乔布斯斯坦福大学演讲
一起刷题,一起进步:(牛客网)面试必刷-数据结构
hello,今天教大家如何使用java中已提供的ArrayList和泛型的知识完成一个小游戏,模拟实现三个人玩扑克,从新建牌,到洗牌,到发牌,以及如何将牌存储到这三个玩家的手里。

基本框架的实现
游戏介绍:有一副扑克,三个人玩,每个人轮流接一张牌,一共接五次,最后打印出来这三个人所接的牌以及剩下的牌,注意:J,Q,K使用11,12,13代替,牌色有:♥,♠,♣,♦,一共是52张牌。
创建一副牌
任何一副牌都是由花色和大小这两种属性组成,我们这里创建一个类存放牌的信息。

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 "Card{" +"rank=" + rank +", suit='" + suit + '\'' +'}';}
}
有了一张基本牌的信息,我们就可以创建一整副牌了,这里还是新创建一个类cards存放一整副牌的信息,利用泛型将一整副牌进行存储

通过这几部操作,最终就把牌全部放到了cardList当中
这里我们可以创建一个main方法把整副牌的信息打印出来进行检验:

ok,整副牌存放成功!!!
如何进行洗牌:
这里我们使用一个shuffle方法,进行洗牌,它的逻辑就是在牌堆里生成一个随机数random,然后然后将指定的某个牌与其发生交换,循环这个过程就实现了洗牌,直接上代码感受一下:
public void shuffle(List<Card>cardList){Random random=new Random();for(int i=cardList.size()-1;i>0;i--){int randIndex=random.nextInt(i);swap(cardList,i,randIndex);}}private void swap(List<Card>cardList,int i,int j){Card tmp=cardList.get(i);cardList.set(i,cardList.get(j));cardList.set(j,tmp);}
每个人抓的牌放到哪里:
一共是三个人,轮流抓五张牌,这里我们首先使用两个for循环来表示抓牌的整个过程,接下来要把每个人抓的牌存储下来这里使用的泛型模拟二维数组来进行存储:

这里需要注意:remove就是移除掉洗完牌之后的最上层的牌赋给对应的玩家,之后最顶层的牌就会更新,循环刚才的过程,而后面的这句程序其实也不难理解:

get(i)是获取了每个玩家的身份,进一步的add(card)是给每个对应的玩家进行发牌。通过这行代码就完成了给三个玩家发牌的效果,这里非常有意思,多看几遍就好了。这里也给大家画个图体会一下这其中的逻辑:

最后用test方法检测一下
import java.util.List;
public class Test {public static void main(String[] args) {Cards cards=new Cards();List<Card>cardList=cards.buyCard();cards.shuffle(cardList);//洗牌之后System.out.println();System.out.println(cardList);//抓牌System.out.println("抓牌");cards.drawCard(cardList);//剩下的牌System.out.println("剩下的牌");System.out.println(cardList);}
}
好了,到这里我们就实现了这个游戏的基本逻辑框架了,主要是使用了泛型类,和java提供的ArrayList来实现的,ArrayList本质上还是顺序表,我之前写过C语言的顺序表,两者背后的逻辑是一样的,如果你不懂顺序表的话,可以看看这篇文章:
C语言顺序表-详解.
源码具体实现
card
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 "{"+suit+" "+rank+"}";};
}
cards
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class Cards {public static final String[] suits={"♥","♠","♣","♦"};//一共4个花色 13张牌public List<Card> buyCard(){List<Card>cardList=new ArrayList<>();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;}public void shuffle(List<Card>cardList){Random random=new Random();for(int i=cardList.size()-1;i>0;i--){int randIndex=random.nextInt(i);swap(cardList,i,randIndex);}}private void swap(List<Card>cardList,int i,int j){Card tmp=cardList.get(i);cardList.set(i,cardList.get(j));cardList.set(j,tmp);}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++){Card card=cardList.remove(0);hands.get(j).add(card);}}System.out.println("第一个人的牌"+hand1);System.out.println("第二个人的牌"+hand2);System.out.println("第三个人的牌"+hand3);}
}
Test
import java.util.List;
public class Test {public static void main(String[] args) {Cards cards=new Cards();List<Card>cardList=cards.buyCard();cards.shuffle(cardList);//洗牌之后System.out.println();System.out.println(cardList);//抓牌System.out.println("抓牌");cards.drawCard(cardList);//剩下的牌System.out.println("剩下的牌");System.out.println(cardList);}
}
好了,今天就分享到这里,有什么问题私信或者评论区都可以哦~

相关文章:
【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)
【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏 基本框架的实现创建一副牌如何进行洗牌:每个人抓的牌放到哪里: 源码具体实现cardcardsTest 个人简介:努力学编程 每日鸡汤:stay foolish,stay hungry-史蒂芬.乔布斯斯…...
R语言:microeco:一个用于微生物群落生态学数据挖掘的R包,第八:trans_func class
# 生态学研究人员通常对微生物群落的功能特征感兴趣,因为功能或代谢数据对于解释微生物群落的结构和动态以及推断其潜在机制是强有力的。 # 由于宏基因组测序复杂且昂贵,利用扩增子测序数据预测功能谱是一个很好的选择。 # 有几个软件经常用于此目标&…...
王道c语言-二叉树前序、中序、后序、层次遍历
main.cpp #include "function.h"//abdhiejcfg 前序遍历深度优先遍历 abdhiejcfg void PreOrder(BiTree p) {if (p ! NULL) {printf("%c ", p->c);//等价于putchar(p->c);等价于visit函数伪代码PreOrder(p->lchild);PreOrder(p->rchild);} }//…...
<REAL-TIME TRAFFIC OBJECT DETCTION FOR AUTONOMOUS DRIVING>论文阅读
Abstract 随着计算机视觉的最新进展,自动驾驶迟早成为现代社会的一部分,然而,仍有大量的问题需要解决。尽管现代计算机视觉技术展现了优越的性能,他们倾向于将精度优先于效率,这是实时应用的一个重要方面。大型目标检测…...
优化 - 排序算法
一、概念 冒泡排序从左往右比较相邻的两个元素,右比左小就换位,这样最大值就出现在了右边最后一个元素上,再从左边第一个元素开始往右比较到倒数第二个元素,如此重复...选择排序 通过线性查找(从左往右挨个查找&#…...
Python实战:深拷贝与浅拷贝
1. 引言 在Python中,对象是通过对内存中的数据进行引用来实现的。当我们创建一个对象并将其赋值给另一个变量时,实际上是将这个对象的引用复制给了另一个变量。这意味着,如果原始对象发生改变,引用该对象的变量也会受到影响。为了…...
rollup打包起手式
使用Rollup打包JavaScript rollup是一款小巧的javascript模块打包工具,更适合于库应用的构建工具;可以将小块代码编译成大块复杂的代码,基于ES6 modules,它可以让你的 bundle 最小化,有效减少文件请求大小,vue在开发的时候用的是webpack,但是…...
【笔记】语言实例比较 3. 无重复字符的最长子串 C++ Rust Java Python
语言实例比较 3. 无重复字符的最长子串 C Rust Java Python C C: 9ms O ( N 2 ) O(N^2) O(N2), 8.68MB mem O ( 1 ) O(1) O(1) 滑动窗口循环 class Solution { public:int lengthOfLongestSubstring(const string s) {//s[start,end) 前面包含 后面不包含int res(0);for (…...
int的大小你知道时4个字节,那么类的大小你知道怎么计算吗?
文章目录 1、如何计算类对象的大小2、类对象的存储方式猜测3、结构体内存对齐规则1、如何计算类对象的大小 class A { public: void PrintA() { cout<<_a<<endl; } private: char _a; };问题: 类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了…...
OpenCV学习笔记(十一)——利用Sobel算子计算梯度
Sobel算子是基于一阶导数的离散差分算子,其中Sobel对于像素值的变化是十分敏感的,在进行边缘检测的时候,Sobel算子常用于对周围像素的重要性进行检测。 Sobel算子包括检验水平方向的算子和检测竖直方向的算子 计算机梯度值的操作如下&#x…...
扩展一下BenchmarkSQL,新增支持ASE/HANA/DB2/SQLServer,可以随便用了
1 背景 提到数据库的性能,自然就避不开性能测试。有专用于测试OLTP的,也有偏重于OLAP的。本文介绍的BenchmarkSQL就属于测试OLTP中的一个,基于TPCC的。网上有很多介绍TPC*的相关测试的文章,大家可以自行脑补。而PostgreSQL自带的pgbench是属于TPCC的前一个基准测试程序,偏…...
Android 静默安装成功后自启动
近期开发上线一个常驻app,项目已上线,今天随笔记录一下静默安装相关内容。我分三篇静默安装(root版)、静默安装(无障碍版)、监听系统更新、卸载、安装。 先说说我的项目需求:要求app一直运行&am…...
计算机二级真题讲解每日一题:《format格式化》
描述 在右侧答题模板中修改代码,删除代码中的横线,填写代码,完成如下功能。 接收用户输入的一个小于 20的正整数,在屏幕上逐行递增显示从 01 到该正整数,数字显示的宽度为 2,不足位置补 0,后面追…...
RabbitMQ问题
如何实现顺序消费? 消息放入到同一个队列中消费 如何解决消息不丢失? 方案: 如上图:消息丢失有三种情况,解决了以上三种情况就解决了丢失的问题 1、丢失1--->消息在到达交换机的时候;解决࿱…...
flutter->Scaffold左侧/右侧侧边栏和UserAccountsDrawerHeader的使用
//appBar的 leading/actions 和 Scaffold的drawer/endDrawer 冲突只能存在一个 import package:flutter/material.dart;void main() {runApp(MyApp()); }class MyApp extends StatelessWidget {const MyApp({super.key});overrideWidget build(BuildContext context) {retur…...
vulnhub prime1通关
目录 环境安装 1.信息收集 收集IP 端口扫描 目录扫描 目录文件扫描 查找参数 打Boss 远程文件读取 木马文件写入 权限提升 方法一 解锁密钥 方法二: linux内核漏洞提权 总结 环境安装 Kali2021.4及其prime靶机 靶机安装:Prime: 1 ~ Vul…...
JVM快速入门(1)JVM体系结构、运行时数据区、类加载器、线程共享和独享、分区、Java对象实例化
5.1 JVM体系结构 线程独占区-程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器;在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数…...
CSS3新属性(学习笔记)
一、. 圆角 border-radius:; 可以取1-4个值(规则同margin) 可以取px和% 一般用像素,画圆的时候用百分比:border-radius:50%; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…...
41-Vue-webpack基础
webpack基础 前言什么是webpackwebpack的基本使用指定webpack的entry和output 前言 本篇开始来学习下webpack的使用 什么是webpack webpack: 是前端项目工程化的具体解决方案。 主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览…...
数据仓库的分层理论
数据仓库的分层理论是为了更好地组织和管理数据,支持复杂的数据分析和决策支持。在这一理论中,数据仓库被分为多个层次,每个层次都有其特定的作用和设计原则。以下是每一层的详细介绍,以及以销售人员为例的Doris建表实例。 ODS层…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
