【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)

2024-03-24 06:12

本文主要是介绍【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实现的扑克牌游戏-(附源码~)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/840687

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2