利用顺序表实现扑克牌

简介: 利用顺序表实现扑克牌

一、代码实现



1. 创建一个类 Card


创建一个类 Card,表示一张扑克牌的信息,另外生成构造方法和 toString 方法


class Card {
    public String suit;    //某张牌的花色
    public String number;  //某张牌的数字
    public Card(String suit, String number) {
        this.suit = suit;
        this.number = number;
    }
    @Override
    public String toString() {
        return "[ " +  suit  + ", " + number + " ]";
    }
}


2. 创建一个类 Test


创建一个类 Test,用来对整副扑克进行操作。


public class Test {
    //四种花色
    public static final String[] suits = {"♠","♥","♣","♦"};
    //13个数字
    public static final String[] ranks = {"1","2","3","4","5","6",
            "7","8","9","10","J","Q","K"};
    /**
     * 一副新扑克
     */
    public static ArrayList<Card> newCard(){
        ArrayList<Card> cards = new ArrayList<>();
        for (int i = 0; i < 13; i++) {
            for (int j = 0; j < 4; j++) {
                cards.add(new Card(suits[j], ranks[i]));
            }
        }
        return cards;
    }
    /**
     * 通过接收的 i 和 j 下标来交换牌
     */
    public static void swap(ArrayList<Card> cards, int i, int j){
/*
        Card temp = cards[i] //error
        cards[i] = cards[j]
        cards[j] = temp
*/
        //面向对象,那么就不再呈现出数组的形式
        Card temp = cards.get(i);
        cards.set(i, cards.get(j));
        cards.set(j, temp);
    }
    /**
     * 洗牌
     */
    public static void shuffle(ArrayList<Card> cards){
        for (int i = 1; i <= cards.size() - 1 ; i++) {
            Random random = new Random();
            int rand = random.nextInt(i); // rand 取值范围:[1,i)
            swap(cards, i, rand);
        }
        System.out.println("---------------------------------------------");
        System.out.println("洗牌: ");
        System.out.println(cards);
    }
    /**
     * 拿牌
     */
    public static void takeCards(ArrayList<Card> cards){
        System.out.println("---------------------------------------------");
        System.out.print("每个玩家从牌堆顶开始拿牌,");
        System.out.println("规则: 每个人总共拿5张牌,每次只能拿一张牌");
        System.out.println("---------------------------------------------");
        ArrayList< ArrayList<Card> > players = new ArrayList<>();
        ArrayList<Card> player1 = new ArrayList<>();
        ArrayList<Card> player2 = new ArrayList<>();
        ArrayList<Card> player3 = new ArrayList<>();
        players.add(player1);
        players.add(player2);
        players.add(player3);
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Card output = cards.remove(0);
                //往 players 的[0,1,2]下标每次添加牌堆顶的牌
                //从而使三个玩家不断地拿到新的牌,每个玩家一次拿一张牌,总共拿五次
                players.get(j).add(output);
            }
        }
        System.out.println("玩家一: "+player1);
        System.out.println("玩家二: "+player2);
        System.out.println("玩家三: "+player3);
        System.out.println("牌堆剩余的牌: "+cards);
    }
    public static void main(String[] args) {
        ArrayList<Card> cards = newCard();
        System.out.println("52张新扑克: ");
        System.out.println(cards); //新牌
        shuffle(cards); //洗牌
        takeCards(cards); //拿牌
    }
}


二、代码分析



1. newCard( ) 方法


//1. 新扑克
newCard()


在 newCard( ) 方法中,我们创建52张新牌,这里的顺序比较整齐。


2. shuffle( ) 方法


//2. 洗牌
shuffle(ArrayList<Card> cards)


在 shuffle( ) 方法中,我们对这52张新牌进行洗牌,通过 swap( ) 方法 和随机数逻辑进行交换牌。


3. takeCards( ) 方法


//3. 拿牌
takeCards(ArrayList<Card> cards)


在 takeCards( ) 方法中,我们实现3个玩家进行拿牌的逻辑: 每个玩家总共拿5张牌,每次只能从牌堆顶拿一张牌。


我们创建的顺序表的底层逻辑为二维数组,先创建一个 players 数组,然后往这个数组中,又放了三个玩家数组,分别为:player1,player2,player3。

而每个玩家拿牌,一定是从原先的顺序表 cards 的0下标开始拿牌,也就是说,每个玩家轮流拿牌,当第一个玩家拿牌后,原先的 cards 的长度就要减一,第二个玩家也是一样。这样一来,实际上每个玩家每次拿到的都是 cards 顺序表的第一个元素。那么我们就可以通过 【 cards.remove( ) 方法 】实现逻辑,( remove( ) 方法在底层由 ArrayList 实现 )


图解分析:


15188b41d7aa48c8970b9fd783469c37.png


输出结果:


069a4dbe90b44fa39bd2056d0d69ad89.png


对我的输出结果进行说明:


我们每个人的输出结果很大概率是不同的,因为这些都是实现了随机数的原因,而我上面画出的框就表示 【每个玩家轮流拿牌的逻辑】没问题。感兴趣的小伙伴也可以通过改变 takeCards( ) 方法中的两层 for 循环,这样可以改变不同的玩家和不同的牌数。


目录
相关文章
顺序表应用5:有序顺序表归并
顺序表应用5:有序顺序表归并
|
1月前
|
人工智能
顺序表应用8:最大子段和之动态规划法
顺序表应用8:最大子段和之动态规划法
|
9月前
|
算法 C语言
实现顺序表的各种基本算法
C语言顺序表实现
95 0
|
1月前
|
存储 C++ 索引
P1996 约瑟夫问题与线性表
P1996 约瑟夫问题与线性表
25 2
|
1月前
|
算法 C语言
数据结构与算法顺序表数组版
博主还在学校,写网络编程特别是后面的线程和多路I/O实在是太费精力,所以博主先把数据结构多跟新一点,也正好把学校的C语言数据结构的作业做了,正好一举两得
32 0
|
机器学习/深度学习 存储 人工智能
顺序表算法练习
顺序表算法练习
189 0
|
存储 算法 API
算法——顺序表(1)
算法——顺序表(1)
76 0
算法——顺序表(1)
|
存储
线性表之顺序表
线性表之顺序表
85 0
线性表之顺序表
|
存储 算法 Java
算法——顺序表(2)
一般作为容器存储数据,都需要向外部提供遍历的方式,因此我们需要给顺序表提供遍历方式,而在Java中,遍历集合的方式一般都是用的是foreach循环
79 0
|
存储 算法 Java
数据结构与算法之线性表(超详细顺序表、链表)
通过前面数据结构与算法基础知识我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容。当然,我用自己的理解解分享给大家。
150 0
数据结构与算法之线性表(超详细顺序表、链表)