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


目录

一.扑克牌的数据结构

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

三.洗牌

四.发牌

五.完整代码

Card.java

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

五.完整代码

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

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

输出结果

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




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

相关推荐
明月看潮生10 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
雷神乐乐14 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|19 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
南宫理的日知录21 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
逊嘘38 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
Half-up41 分钟前
C语言心型代码解析
c语言·开发语言
morris1311 小时前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
Source.Liu1 小时前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust