如何用Java实现扑克牌(附源码)


目录

一.扑克牌的数据结构 

二.买牌(扑克牌的初始化)

三.洗牌

四.发牌

五.完整代码

Card.java

CardList.java

六.测试

输出结果 


一.扑克牌的数据结构 

首先,扑克牌是一幅一幅的,除去大小王以外一共有52张,我们可以考虑用数组来存储,数组的每一个元素都是一张牌,这是牌库的牌;除了要考虑牌库的牌以外,还需要考虑玩家手上的牌,玩家的手牌是牌库的一部分,我们使用顺序表来存储扑克牌,对于一张牌来说,我们有俩个参数:花色点数

public class Card {private int rank;//点数private String suit;//花色public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}public String getSuit() {return suit;}public void setSuit(String suit) {this.suit = suit;}@Overridepublic String toString() {return suit+rank+" ";}
}

我们将花色存放在总的扑克牌组中,使用字符串数组进行存放

public class CardList {public static final String[] suits = {"♠","♥","♣","♦"};
}

二.买牌(扑克牌的初始化)

我们要在买牌的过程中具体的抽象化出一组牌,我们使用数组来存储,数组的每一个元素都是一张牌,我们使用泛型方便我们定义牌组。

扑克牌除了大小王一共是52张,所以我们定义一个扑克牌数组大小为52,并且通过俩个for循环来实现牌的具体信息,外边的for循环用来实现牌的花色,里面的for循环用来实现牌的点数,在循环最中间,使用零时的变量生成一张零时的扑克牌,在我们得到一张完整的牌之后,就使用ArrayList的插入方法add将我们新生成的牌放入牌组中,最后将生成的52张牌组成的牌组返回,我们就完成了扑克牌的初始化

    //买一副牌,也就是对牌进行初始化public static final List<Card> buyCard(){List<Card> cards = new ArrayList<Card>(52);for (int i = 0; i < 4; i++) {for (int j = 0; j <= 13; j++) {String tempSuit = suits[i];int tempRank = j;Card newCard = new Card();newCard.setSuit(suits[i]);newCard.setRank(j);cards.add(newCard);}}return cards;}

三.洗牌

所谓的洗牌就是随机的打乱牌与牌之间的顺序,回想我们现实生活中,我们洗牌的动作,其实就是不停的将部分牌插入到另一部分中,然后交换牌与牌之间的顺序。

因此我们这里封装一个方法swap用来对牌与牌实现交换,然后我们在洗牌方法shuffle中使用随机数来确保我们交换的位置是随机的,并且使用for循环可以保证我们对每一个位置都至少进行一次洗牌

    //洗牌public void swap(List<Card> cards,int i,int j){Card tempCard = cards.get(i);cards.set(j,tempCard);cards.set(i,cards.get(j));}//洗牌public void shuffle(List<Card> cards){Random random = new Random();for (int i = cards.size()-1; i > 0; i--) {int index = random.nextInt(i);swap(cards,index,i);}}

四.发牌

发牌实际上就是将一部分牌等量的分给玩家,我们这里定义出三个玩家的手牌组,用三个数组分别来实现,然后我们将这三个数组放入一个大数组来记录要发给玩家的所有牌,我们用俩个for循环嵌套来保证我们对3名玩家各发5张牌,发牌的过程我们可以这样理解:hands.get(j)用来拿到3个人的手牌组,add(tempCard)用来将牌放入这三个数组中

    //发牌public List<List<Card>> dealCard(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 tempCard = cardList.remove(0);hands.get(j).add(tempCard);}}return hands;}

五.完整代码

Card.java

public class Card {private int rank;private String suit;public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}public String getSuit() {return suit;}public void setSuit(String suit) {this.suit = suit;}@Overridepublic String toString() {return suit+rank+" ";}
}

CardList.java

import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class CardList {public static final String[] suits = {"♠","♥","♣","♦"};//买一副牌,也就是对牌进行初始化public static final List<Card> buyCard(){List<Card> cards = new ArrayList<Card>(52);for (int i = 0; i < 4; i++) {for (int j = 0; j <= 13; j++) {String tempSuit = suits[i];int tempRank = j;Card newCard = new Card();newCard.setSuit(suits[i]);newCard.setRank(j);cards.add(newCard);}}return cards;}//洗牌public void swap(List<Card> cards,int i,int j){Card tempCard = cards.get(i);cards.set(j,tempCard);cards.set(i,cards.get(j));}//洗牌public void shuffle(List<Card> cards){Random random = new Random();for (int i = cards.size()-1; i > 0; i--) {int index = random.nextInt(i);swap(cards,index,i);}}//发牌public List<List<Card>> dealCard(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 tempCard = cardList.remove(0);hands.get(j).add(tempCard);}}return hands;}
}

六.测试

我们可以写个测试案例:

    public static void main(String[] args) {CardList cardGame = new CardList();List<Card> ret =  cardGame.buyCard();System.out.println("买牌:");System.out.println(ret);System.out.println("洗牌:");cardGame.shuffle(ret);System.out.println(ret);System.out.println("揭牌:");List<List<Card>> hand = cardGame.dealCard(ret);for (int i = 0; i < hand.size(); i++) {System.out.println("第 "+(i+1)+" 个人的牌:"+hand.get(i));}System.out.println("剩下的牌:");System.out.println(ret);}

输出结果 

可以发现是完全可以正常运行的




  本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见 

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

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

相关文章

【Linux】命令行参数

文章目录 前言一、C语言main函数的参数二、环境变量总结 前言 我们在Linux命令行输入命令的时候&#xff0c;一般都会跟上一些参数选项&#xff0c;比如l命令&#xff0c;ls -a -l。以前我总是觉得这是理所当然的&#xff0c;没深究其本质究竟是什么&#xff0c;今天才终于知道…

春秋云镜ED01-CMS v20180505 存在任意文件上传漏洞

靶场介绍 春秋云镜ED01-CMS v20180505 存在任意文件上传漏洞 漏洞分析&#xff1a; 文件类型未校验可以任意上传执行文件&#xff0c;获取服务器权限 登录注册界面 Hi-Lo-Yohttp://eci-2ze2qm1cbaon2lylin0q.cloudeci1.ichunqiu.com/registration.php 注册了几个发现注册不…

【QT】Windows环境下,cmake引入QML

这里使用的QT库为5.7版本。 1、添加环境变量 QT库根目录环境变量 QTDIR QT库平台插件环境变量 QT_PLUGIN_PATH QML支持环境变量 QML2_IMPORT_PATH &#xff08;该环境变量仅在需要使用QML时添加&#xff09; QT库动态库环境变量&#xff0c;bin目录下包含了QT程序运行所需的dl…

跨链原子交换

原子交换的想法于 2013 年首次在 BitcoinTalk 论坛上提出&#xff0c;它可以实现两个区块链之间的代币交换。 这些交换是原子的&#xff0c;因为双方要么收到对方的硬币&#xff0c;要么都保留自己的硬币。 一方不可能欺骗另一方。 它不依赖任何可信赖的第三方&#xff0c;消除…

Hdoop学习笔记(HDP)-Part.10 创建集群

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

【二叉树】常见题目解析(2)

题目1&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 题目1描述&#xff1a; 题目1分析及解决&#xff1a; &#xff08;1&#xff09;base case&#xff1a;当前节点为null时&#xff0c;以当前节点为根节点的树最大深度是0。 &#xff08;2&…

使用系统ProgressBar实现三色进度条

使用系统ProgressBar实现如图三色进度条&#xff1a; //布局中<ProgressBarandroid:layout_width"0dp"android:layout_height"8dp"android:layout_marginLeft"16dp"app:layout_constraintBottom_toBottomOf"id/photo"app:layout_c…

Docker部署Plik临时文件上传系统并且实现远程访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik8. 结语 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上…

为自己创建的游戏编程源码申请软件著作权详细流程(免费分享模板)

以为我这篇文章制作的游戏申请软件著作权为例 Ren‘py 视觉小说 交互式故事游戏制作过程学习笔记(Windows下实现)(多结局游戏)-CSDN博客 一、网站注册 申请软著时&#xff0c;所有的著作权人都需要在中国版权保护中心官网注册账号&#xff0c;并进行实名认证后&#xff0c;才…

SpringBoot2.x整合WebService实现远程接口调用

一、添加依赖 <!-- SpringBoot 2.4 以下版本--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId> </dependency><dependency><groupId>org.apach…

Android 应用资源概览

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、资源类型分组四、配置限定符名称表…

口罩标准讲解及推荐

一、我国医用口罩质量标准 1、YY/T0969-2013《一次性使用医用口罩》 2、YY0469-2011《医用外科口罩》 3、GB19083-2010《医用防护口罩技术要求》三类医用口罩各项指标对比如下&#xff1a; 结论&#xff1a;防护效果来说&#xff1a;医用防护口罩>医用外科口罩>一次性…

【交换排序 简单选择排序 堆排序 归并排序】

文章目录 交换排序简单选择排序堆排序归并排序 交换排序 冒泡排序的算法分析&#xff1a; 冒泡排序最好的时间复杂度是O&#xff08;n&#xff09;冒泡排序最好的时间复杂度是O&#xff08;n平方&#xff09;冒泡排序平均时间复杂度为O&#xff08;n的平方&#xff09;冒泡排…

02数仓平台Zookeeper

概述 ZooKeeper是一种分布式协调服务&#xff0c;用于管理大型主机集。在分布式环境中协调和管理服务是一个复杂的过程。ZooKeeper通过其简单的架构和API解决了这个问题。ZooKeeper允许开发人员专注于核心应用程序逻辑&#xff0c;而不必担心应用程序的分布式性质。 Zookeepe…

基于springboot,vue高校图书馆管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatisredis 本项…

[英语学习][6][Word Power Made Easy]的精读与翻译优化

[序言] 针对第18页的阅读, 进行第二次翻译优化以及纠错, 这次译者的翻译出现的严重问题: 没有考虑时态的变化导致整个翻译跟上下文脱节, 然后又有偷懒的嫌疑, 翻译得很随意. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西,…

2023年12月03日新闻简报(国内国际)

新闻简报 每天三分钟&#xff0c;朝闻天下事。今天是&#xff1a;2023年12月03日&#xff0c;星期日&#xff0c;农历十月廿一&#xff0c;祝工作愉快&#xff0c;身体健康&#xff0c;生活喜乐&#xff1a; &#x1f449;&#x1f449;国内新闻 1、1日凌晨&#xff0c;四川…

OpenCV技术应用(6)— 暖色滤镜和冷色滤镜

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何将一幅图像转化成暖色滤镜和冷色滤镜&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.暖色滤镜 &#x1f680;3.冷色滤…

SpringBoot 是如何启动一个内置的Tomcat

为什么说Spring Boot框架内置Tomcat 容器,Spring Boot框架又是怎么样去启动Tomcat的?我简单总结下学习过程。 一:简单了解SpringBoot的启动类 我们都知道Spring Boot框架的启动类上是需要使用 @SpringBootApplication 注解标注的, @SpringBootApplication 是一个复合注解…

FL Studio(水果软件)2024最新中文版云盘下载

如今&#xff0c;越来越多的音乐人选择使用音乐制作软件来进行音乐的创作&#xff0c;一台电脑、一款软件以及一个外接MIDI就是一个小型的音乐工作站。FL Studio成了音乐界萌新的首选&#xff0c;目前最新的版本为FL Studio2024版本。 你可以不知道如何做音乐&#xff0c;但是…