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

news/2024/5/18 15:39:18 标签: java, 开发语言, 游戏程序, 数据结构, 经验分享


目录

一.扑克牌的数据结构 

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

三.洗牌

四.发牌

五.完整代码

java-toc" style="margin-left:40px;">Card.java

java-toc" style="margin-left:40px;">CardList.java

六.测试

输出结果 


一.扑克牌的数据结构 

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

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;
    }
    
    @Override
    public String toString() {
        return suit+rank+" ";
    }
}

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

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

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

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

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

java">    //买一副牌,也就是对牌进行初始化
    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循环可以保证我们对每一个位置都至少进行一次洗牌

java">    //洗牌
    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)用来将牌放入这三个数组中

java">    //发牌
    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;
    }

五.完整代码

java">Card.java

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;
    }
    
    @Override
    public String toString() {
        return suit+rank+" ";
    }
}

java">CardList.java

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

六.测试

我们可以写个测试案例:

java">    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.niftyadmin.cn/n/5233316.html

相关文章

搜索与回溯算法②

求0-9的数字可以组成的所有k 位数。 def backtrack(start, path, k, n, results):"""核心函数。:param start: 下一个添加的数字的起始位置:param path: 当前构建的路径&#xff0c;代表一个组合:param k: 组合中所需的数字个数:param n: 可选数字的最大值:par…

孩子都能学会的FPGA:第十八课——用FPGA实现定点数的除法

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

排序算法基本原理及实现1

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f4d1;插入排序 &#x1f4…

五年自动化测试,终于进字节跳动了,年薪30w其实也并非触不可及

一些碎碎念 什么都做了&#xff0c;和什么都没做其实是一样的&#xff0c;走出“瞎忙活”的安乐窝&#xff0c;才是避开弯路的最佳路径。希望我的经历能帮助到有需要的朋友。 在测试行业已经混了5个年头了&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没…

根文件系统构建-对busybox进行配置

一. 简介 本文来学习 根文件系统的制作中&#xff0c;关于 busybox的配置。 本文继上一篇 busybox中文支持的设置&#xff0c;地址如下&#xff1a; 根文件系统构建-busybox中文支持-CSDN博客 二. 根文件系统构建-busybox配置 1. 配置 busybox 与我们编译 Uboot 、 Lin…

7.C转python

1.对字典的各种操作都是对键来进行的 2.关于字典的遍历操作 例: 还可以这样遍历 所以生成了一个固定模版来遍历字典: 例: 那两个名字可以换 例: 3.合法key的类型: 要求可哈希 在python中,专门提供了一个hash()函数来计算哈希值 例: 有的类型是不能计算哈希的,如:列表,字…

春秋云镜 CVE-2022-30887

春秋云镜 CVE-2022-30887 多语言药房管理系统 (MPMS) 靶场介绍 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0c;并根据到期…

Halcon算子中的slant倾斜hom_mat2d_slant

1.hom_mat2d_slant(HomMat2DIdentity, rad(50), y, 0, 0, HomMat2DSlant) --这个是选择20度和50度的。&#xff08;0&#xff0c; 0&#xff09;点对应的是左上角&#xff0c;50度就是让y轴产生有50度的倾角。 2.hom_mat2d_slant(HomMat2DIdentity, rad(60), x, 0, 0, HomMat2D…