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

【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏

个人简介:努力学编程`
每日鸡汤:stay foolish,stay hungry-史蒂芬.乔布斯斯坦福大学演讲
一起刷题,一起进步:(牛客网)面试必刷-数据结构
hello,今天教大家如何使用java中已提供的ArrayList和泛型的知识完成一个小游戏,模拟实现三个人玩扑克,从新建牌,到洗牌,到发牌,以及如何将牌存储到这三个玩家的手里

基本框架的实现

游戏介绍:有一副扑克,三个人玩,每个人轮流接一张牌,一共接五次,最后打印出来这三个人所接的牌以及剩下的牌,注意:J,Q,K使用11,12,13代替,牌色有:♥,♠,♣,♦,一共是52张牌。

创建一副牌

任何一副牌都是由花色和大小这两种属性组成,我们这里创建一个类存放牌的信息。

java 复制代码
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,然后然后将指定的某个牌与其发生交换,循环这个过程就实现了洗牌,直接上代码感受一下:

java 复制代码
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方法检测一下

java 复制代码
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

java 复制代码
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

java 复制代码
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

java 复制代码
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);
    }
}

好了,今天就分享到这里,有什么问题私信或者评论区都可以哦~

相关推荐
Ws_32 分钟前
leetcode LCR 068 搜索插入位置
数据结构·python·算法·leetcode
灼华十一34 分钟前
数据结构-布隆过滤器和可逆布隆过滤器
数据结构·算法·golang
谈谈叭1 小时前
Javascript中的深浅拷贝以及实现方法
开发语言·javascript·ecmascript
lx学习1 小时前
Python学习26天
开发语言·python·学习
代码调试1 小时前
Springboot校园失物招领平台
java·spring boot
大今野2 小时前
python习题练习
开发语言·python
爱编程的鱼2 小时前
javascript用来干嘛的?赋予网站灵魂的语言
开发语言·javascript·ecmascript
camellias_2 小时前
SpringBoot(二十三)SpringBoot集成JWT
java·spring boot·后端
tebukaopu1482 小时前
springboot如何获取控制层get和Post入参
java·spring boot·后端
昔我往昔2 小时前
SpringBoot 创建对象常见的几种方式
java·spring boot·后端