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

news2024/11/14 22:03:19

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

    @Override
    public 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;
    }

    @Override
    public 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.coloradmin.cn/o/1539426.html

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

相关文章

租用阿里云2核2G服务器配置报价,61元和99元

阿里云2核2G服务器配置优惠价格61元和99元&#xff0c;61元是轻量应用服务器2核2G3M带宽、50G高效云盘&#xff0c;99元服务器是ECS云服务器经济型e实例2核2G、3M固定带宽、40G ESSD entry 系统盘。活动 aliyunfuwuqi.com/go/aliyun 阿里云服务器网aliyunfuwuqi.com根据上面的官…

武汉星起航:引领卖家征战亚马逊海外市场,树立跨境电商新标杆

在风起云涌的跨境电商大潮中&#xff0c;武汉星起航电子商务有限公司凭借其深厚的行业经验和卓越的企业实力&#xff0c;始终站在市场的最前沿&#xff0c;为国内新手卖家铺就了一条通往亚马逊海外市场的成功之路。作为国内首批进入跨境电商市场的企业之一&#xff0c;星起航不…

心脏滴血漏洞详解(CVE-2014-0160)

参考链接&#xff1a;心脏滴血漏洞利用&#xff08;CVE-2014-0160&#xff09;_cve-2014-0160漏洞禁用443端口-CSDN博客 目录 OpenSSL简介 漏洞原理 影响版本 漏洞复现 漏洞利用 修复方案 OpenSSL简介 OpenSSL是一个开放源代码的软件库包&#xff0c;提供了一组加密和认…

安捷伦Agilent N1021B差分TDR/TDT探头

181/2461/8938产品概述&#xff1a; N1021B 是一款符合人体工程学设计的手持式探头&#xff0c;可在缺少常用同轴高频连接器的情况下将 TDR/TDT 模块连接到印刷电路板&#xff08;PCB&#xff09;和元器件。 内置滚轮可以调节差分探针的间距&#xff0c;以便与间距为零到典型 …

力扣题库88题:合并两个有序数组(c语言)

解法&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int l1m-1;int l2n-1;int l3mn-1;while(l1>0&&l2>0){if(nums1[l1]>nums2[l2]){nums1[l3--]nums1[l1--];}else{nums1[l3--]nums2[l2--];}}while(l2>0)…

数字孪生底层技术框架

数字孪生是一种将现实世界中的物理实体、过程或系统数字化并映射到计算机模型中的方法。它在数学建模与仿真方面具有重要作用&#xff0c;为了实现数字孪生&#xff0c;以下是一些底层技术框架和方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业…

LinuxYUMVimg++/gccgdbGit使用

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;前面的文章给大家介绍了Linux的基础命令和权限&#xff0c;学会了命令行的模式使用Linux&#xff0c;今后要开始在Linux上写代码了&#xff0c;在这篇文章将介绍YUM、vim、gdb、git等常用的工具。 先来看看Linux如何安装软…

JavaEE 初阶篇-多线程属性和方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 创建线程对象并命名 2.0 线程属性 2.1 线程属性 - ID 2.2 线程属性 - 名称 2.3 线程属性 - 后台线程 2.4 线程属性 - 判断 PCB 是否存活 2.5 线程属性 - 终止线程…

数据库管理-第163期 19c重建ADG的两个方法(20240323

数据库管理163期 2024-03-23 数据库管理-第163期 19c重建ADG的两个方法&#xff08;20240323&#xff09;1 ORA-081032 新办法1 关闭MRP2 恢复备库3 其他操作4 启动备库5 启动MRP 3 老办法4 预告总结 数据库管理-第163期 19c重建ADG的两个方法&#xff08;20240323&#xff09;…

Stompy:一款针对时间戳的Timestomp工具

关于Stompy Stompy是一款功能强大的时间戳管理工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员能够轻松对指定文件或目录的时间戳进行修改和操作。该工具基于PowerShell开发&#xff0c;并且支持对目标目录中的所有文件执行递归时间戳操作。 功能介绍 1、修改独立…

有什么可以下载网页视频的浏览器插件 浏览器如何下载网页视频 网页视频怎么下载到本地 网页视频下载软件 IDM下载

在视频网站上看电影追剧&#xff0c;已经成为了大众生活中必不可少的一部分。为了保护自家视频的版权&#xff0c;很多平台都禁止用户下载会员视频。其实只要掌握了正确的方法&#xff0c;一样可以将会员视频下载到本地保存。那么有关有什么可以下载网页视频的浏览器&#xff0…

Fast-R-CNN论文笔记

目标检测之Fast R-CNN论文精讲&#xff0c;Fast RCNN_哔哩哔哩_bilibili 一 引言 1.1 R-CNN和SPPNet缺点 &#x1f600;R-CNN Training is a multi-stage pipeline 多阶段检测器&#xff08;两阶段和一阶段检测器&#xff09; 1️⃣首先训练了一个cnn用来提取候选区域的特征…

JMeter并发工具的使用

视频地址&#xff1a;Jmeter安装教程01_Jmeter之安装以及环境变量配置_哔哩哔哩_bilibili 一、JMeter是什么 JMeter是一款免安装包&#xff0c;官网下载好后直接解压缩并配置好环境变量就可以使用。 环境变量配置可参考&#xff1a;https://www.cnblogs.com/liulinghua90/p/…

只有IP地址怎么实现HTTPS访问?

只有IP地址也可以实现HTTPS访问。虽然大部分SSL证书通常是针对域名发放&#xff0c;但也存在专门针对IP地址发放的SSL证书&#xff0c;这类证书允许服务器通过HTTPS协议为其公网IP地址提供安全的Web服务。当服务器配置了基于IP地址的SSL证书后&#xff0c;用户可以通过“https:…

git基础-查看提交历史

查看提交历史 在创建了多个提交之后&#xff0c;或者如果克隆了一个具有现有提交历史的存储库&#xff0c;可能会想要回顾一下发生了什么。最基本和强大的工具就是 git log 命令。 运行下git log查看下输出状态 默认情况下&#xff0c;不带任何参数运行 git log 命令会以逆时…

Java之继承和多态(精简版-更适合复习)

继承 如果子类有&#xff0c;优先访问子类的&#xff0c;子类没有&#xff0c;然后去看父类有没有&#xff0c;父类也没有&#xff0c;那就会报错。 就是要访问父类怎么办&#xff1f;通过super关键字。 在静态方法当中&#xff0c;时不能使用this和super的。 当子类继承了父…

江苏开放大学2024年春《中级会计实务(上) 050284》第1次任务第一单元总论、第二单元存货练习参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 电大搜题 多的用不完的题库&#xff…

院子摄像头的监控

院子摄像头的监控和禁止区域入侵检测相比&#xff0c;多了2个功能&#xff1a;1&#xff09;如果检测到有人入侵&#xff0c;则把截图保存起来&#xff0c;2&#xff09;如果检测到有人入侵&#xff0c;则向数据库插入一条事件数据。 打开checkingfence.py&#xff0c;添加如下…

2024阿里云学生服务器免费领取申请(2024新版教程)

阿里云学生服务器免费申请&#xff0c;之前是云翼计划学生服务器9元/月&#xff0c;现在是高校计划&#xff0c;学生服务器可以免费申请&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之…

大学期末考试搜题软件?这4款足够解决问题 #知识分享#笔记#职场发展

当代大学生面临着繁重的学业压力和海量的知识点&#xff0c;如何高效地进行学习和搜题成了他们关注的焦点。幸运的是&#xff0c;随着科技的不断进步&#xff0c;我们有越来越多的日常搜题和学习软件可以帮助我们更好地应对这些挑战。在本文中&#xff0c;我将为大家介绍10款备…