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

好了,今天就分享到这里,有什么问题私信或者评论区都可以哦~

在这里插入图片描述

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

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

相关文章

pytorch图像数据集定义

文章目录 相关链接DatasetVisionDatasetDatsetFolderImageFolder torchvision.transformsPytorch LightningLightningDataModule 对于图像数据集来说&#xff0c;首先是在Dataset类对数据集进行定义&#xff0c;一般来说不定义transform&#xff0c;则数据为PIL Image&#xff…

Sora入门级概念、Open-Sora 1.0和现状挑战(附多个文生视频 Prompt 案例)

OpenAI Sora入门级概念 Sora模型是OpenAI 发布的人工智能模型,它主要用于生成和处理视频内容。以下是Sora模型的一些入门级概念: 视频内容生成:Sora模型能够根据文本描述生成视频内容。这意味着你可以输入一段描述性的文本,模型将基于这段文本生成相应的视频画面。场景和角…

Github 2024-03-19 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-19统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目9TypeScript项目2HTML项目1GDScript项目1MetaGPT: 多代理框架 创建周期:260 天开发语言:Python协议类型:MIT LicenseStar数量:35…

MongoDb数据库介绍安装使用

#安装mongodb# 第一步 下载mongoDb: 官网https://www.mongodb.com/ 第二步 进行安装配置修改Data directory 和 Log Directory 将数据目录和日志目录存放在D盘 第三步 取消install MongoDb Compass这个是安装可视化工具的意思在这里不需要 #配置环境变量加入到系统中的path环…

鸿蒙Harmony应用开发—ArkTS-LazyForEach:数据懒加载

LazyForEach从提供的数据源中按需迭代数据&#xff0c;并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach&#xff0c;框架会根据滚动容器可视区域按需创建组件&#xff0c;当组件滑出可视区域外时&#xff0c;框架会进行组件销毁回收以降低内存占用。 接口…

EI级!高创新原创未发表!VMD-TCN-BiGRU-MATT变分模态分解卷积神经网络双向门控循环单元融合多头注意力机制多变量时间序列预测(Matlab)

EI级&#xff01;高创新原创未发表&#xff01;VMD-TCN-BiGRU-MATT变分模态分解卷积神经网络双向门控循环单元融合多头注意力机制多变量时间序列预测&#xff08;Matlab&#xff09; 目录 EI级&#xff01;高创新原创未发表&#xff01;VMD-TCN-BiGRU-MATT变分模态分解卷积神经…

Spring设计模式-实战篇之模板方法模式

什么是模板方法模式&#xff1f; 模板方法模式用于定义一个算法的框架&#xff0c;并允许子类在不改变该算法结构的情况下重新定义算法中的某些步骤。这种模式提供了一种将算法的通用部分封装在一个模板方法中&#xff0c;而将具体步骤的实现延迟到子类中的方式。 模板方法模式…

【Go】Go语言中的数组与切片

纵使微茫如烟 纵有万般思念 流光总将故人搁浅在断简残篇 不成眠 不等谁来证明 不必狂歌痛饮 唯盼重相见 我如倦鸟归林 &#x1f3b5; 流浪的蛙蛙《从别后》 摘要 Go语言提供了强大的数据结构来处理固定长度的序列和动态长度的序列&#xff0c;分别称为数…

Superset二次开发之 配置Docker

手动安装 安装必要的一些系统工具 在设置仓库之前,需先安裝所需的软件包。yum-utils提供了yum-config-manager,并且device mapper存储驱动程序需要device-mapper-persistent-data和lvm2。 yum install -y yum-utils device-mapper-persistent-data lvm2 设置源仓库 使用阿里云…

爬虫工作量由小到大的思维转变---<第五十一章 Scrapy 深入理解Scrapy爬虫引擎(2)--引擎的工作流程>

前言: 继续上一篇:https://hsnd-91.blog.csdn.net/article/details/136943552 本章主要介绍Scrapy引擎的启动流程、请求处理的生命周期、如何处理下载的内容以及触发Item Pipeline的过程。还讨论了数据处理在爬虫解析函数和Item Pipeline中的作用&#xff0c;并介绍了引擎关闭…

2024年 前端JavaScript Web APIs 第五天 笔记

5.1-BOM和延迟函数setTimeout 5.2-事件循环eventloop 1-》 3 -》2 1-》 3 -》2 5.3-location对象 案例&#xff1a;5秒钟之后自动跳转页面 <body><a href"http://www.itcast.cn">支付成功<span>5</span>秒钟之后跳转到首页</a><sc…

数据库测试案例20240322-binlog_format为row binlog日志分析,主备数据不一致会导致复制出问题

1 测试概述 master-1&#xff0c;master-2表数据test如下&#xff1a; 9:26: [mytest]> select *From test; ---------- | id | name | ---------- | 10 | 123 | ---------- 1 row in set (0.00 sec) 2 在主库将数据删除导致数据不一致 09:26: [mytest]> set sql_…

git的实际应用场景

本文章的场景主要来源于实际工作&#xff0c;用于记载回看&#xff1b;持续更新&#xff0c;最后更新日期&#xff1a;2024-03-23软件&#xff1a;Git BASH、GitK、Git GUI三者配合使用 1、git reset < file > 作用&#xff1a;把文件从暂存区状态重置为工作区状态&…

对象操作篇

文章目录 9.1 dir()9.2 hash()9.3 help()9.4 id()9.5 type() 9.1 dir() dir() 是 Python 中的一个内置函数&#xff0c;用于返回一个对象的所有属性和方法的列表。当dir()不带参数调用时&#xff0c;它会返回当前作用域中的变量、方法和定义的类型列表。如果dir()带有一个参数…

从零开始学HCIA之网络自动化02

1、Python 是一种解释型&#xff08;即不需要编译环节&#xff09;的、面向对象&#xff08;即支持面向对象的风格或代码&#xff09;的、动态数据类型的高级程序设计语言。对于所谓的高级程序设计语言&#xff0c;你可以理解为“同声传译”的过程。 2、Python标准库很庞大&am…

Shut down, sleep, or hibernate your PC 关闭、睡眠或休眠

最近一段时间没有整服务器了~自己开始捉摸18年买的笔记本-x280&#xff0c;除了发现usb type c和thunderbolt 3接口的不一样外&#xff0c;也开始研究这个待机的功能了~找了官方文档&#xff0c;做个简易的翻译&#xff0c;给大家一起看看学习把。 官方文档URL&#xff1a; S…

Docker搭建LNMP环境实战(02):Win10下安装VMware

实战开始&#xff0c;先安装 VMware 虚拟机。话不多说&#xff0c;上手就干&#xff01; 1、基本环境检查 1.1、本机Bios是否支持虚拟化 进入&#xff1a;任务管理器- 性能&#xff0c;查看“虚拟化”是否启用&#xff0c;如果已启用&#xff0c;则满足要求&#xff0c;如果未…

【Swagger】接口文档生成

文章目录 一、前后端分离开发流程二、YApi导入接口文档三、Swagger3.1 介绍3.2 使用步骤3.2.1 导入 knife4j 的maven依赖3.2.2 在配置类中加入 knife4j 相关配置3.2.3 配置类中设置静态资源映射3.2.4 访问测试 3.3 常用注解3.4 全局参数设置 四、YApi 与 Swagger 一、前后端分离…

Day18:LeedCode 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 思路:出该二叉树的 最底层 最左边 节点的值找出深度最大的第一个结点(左结点先遍历) 方法一…

一个单生产-多消费模式下无锁方案(ygluu/卢益贵)

一个单生产-多消费模式下无锁方案 ygluu/卢益贵 关键词&#xff1a;生产者-消费者模型、无锁队列、golang、RWMutex 本文介绍一个“单生产(低频)-多消费”模式下的无锁哈希类方案&#xff0c;这个方案的性能优于golang的RWMutex&#xff0c;因为它永远不会因为“写”而导致与…