java之斗地主部分功能的实现
今天我们要实现斗地主中发牌和洗牌这两个功能,该如何去实现呢?
1.创建牌类:52张牌每一张牌包含两个属性:牌的大小和牌的花色。
故我们优先创建一个牌的类(Card):包含大小和花色。
public class Card { //单张牌的大小及类型//牌的花色,数量及返回值private String suit; //花色private int rank; //大小public Card(String suit, int rank){ //牌的构造方法this.suit = suit;this.rank = rank;}@Overridepublic String toString(){ //返回这张牌的属性return "{" + suit+rank+ "}";}
}
2.牌类创建好之后,我们就可以再创建一个CardDemo类来着重实现它的功能。
2.1:扑克牌的创建:
实现功能之前我们要有一个容纳52张牌的数组(列表),其中这52张卡牌有四种花色,并且有1~13的大小(暂定),我们就要创建一个字符数组来存储其花色类型,再创建一个可以存储Card类型的泛型列表cardList来存放52张扑克牌,之后,通过两个for循环,一个通过花色(suit),一个通过牌的大小(rank),将每次循环的成员属性(suit、rank)放到新创建的卡牌类card中,最后通过add方法将这个新牌添加到cardList列表中,具体代码如下:
public List<Card> buyCard(){ List<Card> cardList = new ArrayList<>(); //创建牌的列表//大小为i的牌的四张j类型的花色for (int i = 1; i <=13 ; i++) {for(int j =0;j<4;j++){int rank = i; //第i张牌String suit = suits[j] ; // j类型的花色Card card = new Card(suit,rank); //获取新的牌cardList.add(card);//将这个牌添加到列表中}}return cardList;}
2.2 洗牌功能的实现:
如何进行随机洗牌呢?
想到随机二字,你是否联想到了Random函数?我们不妨用下面的思路来解决这个问题:
从最后一张牌(索引为51)开始,for循环,通过random函数随机获取前i-1(i是最后一张牌的索引)张牌的索引,通过索引与最后张牌进行交换。这样一套循环下来可以实现随机洗牌的功能。

具体代码如下:
//洗牌功能的实现:public void shuffle(List<Card> cardList){Random random = new Random();for (int i = cardList.size()-1; i >0 ; i--) {//将第i位置的元素与索引为0~i-1的元素进行交换位置int index = random.nextInt(i); //随机获取索引为0~i-1的位置swap(cardList,i,index); //将位置index的元素和i像交换}}
那么这里问题又来了,如何实现交换两个牌的方法swap呢?通过ArrayList中的get、set方法获取、设置元素,通过类似于创建第三变量的方式将两个元素实现交换,不同的是作为媒介的第三方元素类型必须是Card。
private void swap(List<Card> cardList,int i,int j){Card tmp = cardList.get(i); //将i位置的元素赋值给tmpcardList.set(i,cardList.get(j)); //将j位置的元素赋值到i位置cardList.set(j,tmp); //tmp与j位置的元素互换}
2.3:发牌功能的实现:
假设一共有三个人 假设每个人分到的手牌为5张,则先分别创建3个泛型为Card的列表用来存储这三个人分到的手牌,之后再创建一个二维列表hand来存储三个人的手牌,便于管理和访问不同玩家或不同伦次的手牌。
发牌过程中,两个for循环一次给每个人发牌,发牌时需要注意,第一张牌被人抽走之后,第二张牌便排在了第一位,这里我们每次发牌前移除第一个元素,并将这个移除元素分给对应 的人。
public List<List<Card>> play(List<Card> cardList) {List<Card> hand0 = new ArrayList<>();List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();List<List<Card>> hand = new ArrayList<>();hand.add(hand0);hand.add(hand1);hand.add(hand2);for(int i=0;i<5;i++) //5张牌{for (int j = 0; j < 3; j++) { //3个人Card card = cardList.remove(0); //移除第一张牌,并将这张移除的牌赋给card,同时下一次card的第二个元素变为第一个//把对应的牌放到对应的人手中hand.get(j).add(card);}}return hand;}}
3.在main方法里进行测试:
public class Test {public static void main(String[] args) {CardDemo cardDemo = new CardDemo();//1.创建52张牌List<Card> cardList = cardDemo.buyCard();System.out.println(cardList);//2.洗牌:cardDemo.shuffle(cardList);System.out.println(cardList);//3每个人拿五张牌List<List<Card>> ret = cardDemo.play(cardList);for (int i = 0; i < ret.size(); i++) {System.out.println("第"+(i+1)+"个人的牌:"+ret.get(i));}System.out.println("剩下的人的牌");System.out.println(cardList);}
}
实现后:
相关文章:
java之斗地主部分功能的实现
今天我们要实现斗地主中发牌和洗牌这两个功能,该如何去实现呢? 1.创建牌类:52张牌每一张牌包含两个属性:牌的大小和牌的花色。 故我们优先创建一个牌的类(Card):包含大小和花色。 public class Card { //单张牌的大小及类型/…...
我的AI工具箱Tauri版-VideoIntroductionClipCut视频介绍混剪
本教程基于自研的AI工具箱Tauri版进行VideoIntroductionClipCut视频介绍混剪。 本项目为自研的AI工具箱Tauri版中的视频剪辑模块,专注于自动生成视频介绍片段。该模块名为 VideoIntroductionClipCut,用户可以通过该工具快速进行视频的混剪和介绍内容的生…...
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】011 - 第一个用户空间进程 init 进程 第一阶段初始化过程 源码分析
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】011 - 第一个用户空间进程 init 进程 第一阶段初始化过程 源码分析 系列文章汇总:《鸿蒙OH-v5.0源码分析之 Uboot+Kernel 部分】000 - 文章链接汇总》 本文链接:《【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】011 - 第一个用户空…...
MyBatis 源码解析:Mapper 文件加载与解析
引言 在 MyBatis 中,Mapper 文件扮演了至关重要的角色,它通过 SQL 映射文件来定义数据库查询操作和 Java 对象之间的映射关系。Mapper 文件通常是以 XML 格式存储的,包含了 SQL 语句以及与 Java 对象的对应关系。在本篇文章中,我…...
(11)(2.1.2) DShot ESCs(二)
文章目录 前言 3 配置伺服功能 4 检查RC横幅 5 参数说明 前言 DShot 是一种数字 ESC 协议,它允许快速、高分辨率的数字通信,可以改善飞行器控制,这在多旋翼和 quadplane 应用中特别有用。 3 配置伺服功能 如上所述,如果使用…...
yolov5/8/9模型在COCO分割数据集上的应用【代码+数据集+python环境+GUI系统】
yolov5/8/9模型在COCO分割数据集上的应用【代码数据集python环境GUI系统】 yolov5/8/9模型在COCO分割数据集上的应用【代码数据集python环境GUI系统】 1.COCO数据集介绍 COCO数据集,全称为Microsoft Common Objects in Context,是微软于2014年出资标注的…...
技术周总结 09.16~09.22 周日(架构 C# 数据库)
文章目录 一、09.16 周一1.1)问题01: 软件质量属性中"质量属性场景"、"质量属性环境分析"、"质量属性效用树"、"质量属性需求用例分析"分别是什么?1.2)问题02: 软件质量属性中…...
【java实现json转化为CSV文件】
文章目录 JSON文件中的数据格式测试文件转换的接口 JSON文件中的数据格式 单条数据展开后如下: {"text": "《邪少兵王》是冰火未央写的网络小说连载于旗峰天下","spo_list":[{"predicate": "作者", "objec…...
MySQL索引知识个人笔记总结(持续整理)
本篇笔记是个人整理的索引知识总结,刚开始有点乱,后续会一直边学边整理边总结 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。就好比索引就是数据的目录 索引结构 Btree索引,Hash索引,Full-text索引,R-tree(空…...
ReKep——李飞飞团队提出的让机器人具备空间智能:基于视觉语言模型GPT-4o和关系关键点约束
前言 由于工厂、车厂的任务需求场景非常明确,加之自今年年初以来,我司在机器人这个方向的持续大力度投入(包括南京、长沙两地机器人开发团队的先后组建),使得近期我司七月接到了不少来自车厂/工厂的订单,比如其中的三个例子&…...
[Java并发编程] synchronized(含与ReentrantLock的区别)
文章目录 1. synchronized与ReentrantLock的区别2. synchronized的作用3. synchronized的使用3.1 修饰实例方法,作用于当前实例,进入同步代码前需要先获取实例的锁3.2 修饰静态方法,作用于类的Class对象,进入修饰的静态方法前需要…...
spring-boot-maven-plugin插件打包和java -jar命令执行原理
文章目录 1. Maven生命周期2. jar包结构2.1 不可执jar包结构2.2 可执行jar包结构 3. spring-boot-maven-plugin插件打包4. 执行jar原理 1. Maven生命周期 Maven的生命周期有三种: clean:清除项目构建数据,较为简单,不深入探讨&a…...
Python办公自动化教程(001):PDF内容提取
1、Pdfplumber介绍 pdfplumber的github地址: https://github.com/jsvine/pdfplumber/【介绍】:pdfplumber 是一个用于处理 PDF 文件的 Python 第三方库,它提供了一种方便的方式来提取 PDF 文件中的文本、表格和其他信息。【功能】ÿ…...
HarmonyOS鸿蒙开发实战(5.0)自定义全局弹窗实践
鸿蒙HarmonyOS开发实战往期文章必看: HarmonyOS NEXT应用开发性能实践总结 最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) 非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&am…...
【AI学习】了解OpenAI o1背后的self-play RL:开启新的智能道路
在ChatGPT刚刚出来的时候,沐神关于ChatGPT有一段视频,只有几分钟,却是讲得极其透彻的一段。大概意思就是,过去的AI智能水平,比如五年前,大概相当于人类5秒钟思考的程度,包括自动驾驶,…...
Java项目实战II基于Java+Spring Boot+MySQL的车辆管理系统(开发文档+源码+数据库)
目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 "随着…...
IPsec-VPN中文解释
网络括谱图 IPSec-VPN 配置思路 1 配置IP地址 FWA:IP地址的配置 [FW1000-A]interface GigabitEthernet 1/0/0 [FW1000-A-GigabitEthernet1/0/0]ip address 10.1.1.1 24 //配置IP地址 [FW1000-A]interface GigabitEthernet 1/0/2 [FW1000-A-GigabitEthernet1/0/2]ip a…...
Ubuntu 22.04 源码下载、编译
Kernel/BuildYourOwnKernel - Ubuntu Wikihttps://wiki.ubuntu.com/Kernel/BuildYourOwnKernel 一、查询当前系统内核版本 rootubuntu22:~# uname -r 5.15.0-118-generic 二、查询本地软件包数据库中的内核源码信息 rootubuntu22:~# apt search linux-source Sorting... Do…...
【深度学习实战—11】:基于Pytorch实现谷歌QuickDraw数据集的下载、解析、格式转换、DDP分布式训练、测试
✨博客主页:王乐予🎈 ✨年轻人要:Living for the moment(活在当下)!💪 🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 😺〇、仓库…...
基于SpringBoot+WebSocket实现地图上绘制车辆实时运动轨迹图
实现基于北斗卫星的车辆定位和轨迹图的Maven工程(使用模拟数据),我们将使用以下技术: Spring Boot:作为后端框架,用来提供数据接口。Thymeleaf:作为前端模板引擎,呈现网页。Leaflet…...
如何解决Bitcoin Core中createwallet命令仅支持legacy wallets的问题(code -4)
1. 遇到"Only legacy wallets are supported"错误怎么办? 最近在帮朋友调试比特币全节点时,遇到了一个典型问题:当尝试用createwallet命令创建新钱包时,控制台突然报错"Only legacy wallets are supported by this…...
告别手动回复!用Python+uiautomation给微信PC版做个关键词自动回复机器人
用Python打造微信PC版智能应答机器人:从消息监控到自动化交互 每次打开微信都被海量消息淹没?客服咨询重复率高达70%?社群运营每天机械回复相同问题?这些场景背后隐藏着一个共同痛点——低效重复劳动正在吞噬现代人的生产力。今天…...
炸裂实锤!随手乱按挖出编译器「乱码隐藏保留字」编译报错直接封神
文章目录封面文案一、专栏开篇回顾二、初见疑点:反复刷屏的神秘乱码片段三、三层硬核现场取证,逐层锁死真相1. IDE标识实锤:专属K图标 关键字同款高亮2. 编译现场终极定罪:报错和普通未定义变量完全不同对比区分,一眼…...
C# 爬虫抓图遇到TLS 1.3报错?.NET Framework 4.7 的终极自救指南
C# 爬虫抓图遇到TLS 1.3报错?.NET Framework 4.7 的终极自救指南 当你的C#爬虫在.NET Framework 4.7环境下突然开始报错"未能创建 SSL/TLS 安全通道",而昨天还能正常运行——这很可能是因为目标服务器升级到了TLS 1.3协议。作为一个长期维护企…...
无人机传感器技术解析:从IMU到激光雷达的全面指南
1. 无人机传感器的核心作用 当你操控无人机在空中自由翱翔时,有没有想过它为什么能如此听话?这背后是一整套传感器系统在默默工作。就像人类需要眼睛、耳朵和平衡感来感知世界一样,无人机也需要各种传感器来"感知"周围环境。这些传…...
uniapp复制文本的两种实现方式对比:从基础到进阶
Uniapp复制文本功能深度解析:从基础实现到跨平台适配 在移动应用和H5页面开发中,复制文本到剪贴板是一个看似简单却直接影响用户体验的基础功能。作为一款跨平台开发框架,Uniapp提供了多种实现方式,但每种方法都有其特定的适用场…...
别再手动画流程图了!用Flowable 6.8.1 + SpringBoot 3分钟搞定请假审批系统
3分钟集成Flowable 6.8.1:SpringBoot请假审批系统实战指南 当团队需要快速上线一个请假审批模块时,传统开发方式往往需要编写大量状态流转代码。去年我们团队就遇到过这种情况——产品经理突然要求三天内上线OA系统的请假功能,而当时我们连数…...
Z-Image-Turbo-辉夜巫女材质与光影专题:金属、玻璃、织物等不同质感的极致渲染
Z-Image-Turbo-辉夜巫女材质与光影专题:金属、玻璃、织物等不同质感的极致渲染 你有没有想过,为什么有些AI生成的图片看起来“假假的”,一眼就能认出来?很多时候,问题就出在“质感”上。金属不像金属,玻璃…...
我的世界Java版1.21.4的Fabric模组开发教程(二)创建物品
这是适用于Minecraft Java版1.21.4的Fabric模组开发系列教程专栏第二章——创建物品。想要阅读其他内容,请查看或订阅上面的专栏。 物品(Items) 指的是可以被玩家和其他实体拾起并使用的元素。想要在Minecraft中添加自己的物品,通常需要完成下面的步骤&…...
Wan2.2-I2V-A14B极限测试:挑战生成复杂网络拓扑结构的动态演化视频
Wan2.2-I2V-A14B极限测试:挑战生成复杂网络拓扑结构的动态演化视频 1. 开场白:当AI遇见网络拓扑 最近在测试Wan2.2-I2V-A14B模型时,我突发奇想:这个号称能理解复杂概念的文生视频模型,能否准确呈现网络拓扑结构的动态…...
