Java模拟实现扑克牌洗牌和发牌的示例代码

 更新时间:2022年09月23日 16:48:38   作者:XIN-XIANG荣  
这篇文章主要为大家详细介绍了如何利用Java模拟实现扑克牌洗牌和发牌的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下

一. 需求

设计一副新的的扑克牌, 4个花色(♥, ♠, ♦, ♣)对应 1 到 13 , 不算大小王一共52张牌 ; 然后将扑克牌随机打乱顺序 , 最后实现三个人进行摸牌 , 三个人轮流进行摸牌(每次摸一张牌) , 最终每个人手里有五张牌

二. 全局代码

poker.java

public class poker {
    private String suit;//花色
    private int num;//数字

    public poker(String suit, int num) {
        this.suit = suit;
        this.num = num;
    }

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return suit+" "+num;
    }
}

pokers.java

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class pokers {
    public static final String[] SUITS = {"♠","♥","♣","♦"};
    //买一副扑克牌
    public static List<poker> buypokers() {
        List<poker> pokerList = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <= 13; j++) {
                pokerList.add(new poker(SUITS[i],j));
            }
        }
        return pokerList;
    }

    //洗牌
    public static void shuffle(List<poker> pokerList) {
        Random random = new Random();
        for (int i = pokerList.size()-1; i > 0; i--) {
            int index = random.nextInt(i);
            swap(pokerList, i, index);
        }
    }
    //交换
    public static void swap (List<poker> pokerList, int i, int index) {
        poker tmp = pokerList.get(i);
        pokerList.set(i, pokerList.get(index));
        pokerList.set(index, tmp);
    }

    public static void main(String[] args) {
        List<poker> pokerList = buypokers();
        System.out.println("新牌:" + pokerList);
        shuffle(pokerList);
        System.out.println("洗牌:" + pokerList);

        //揭牌 3个人 每个人轮流揭5张牌

        //用来存放三个人揭起来的牌
        List<poker> hand1 = new ArrayList<>();
        List<poker> hand2 = new ArrayList<>();
        List<poker> hand3 = new ArrayList<>();

        List<List<poker>> hand = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                //确定是谁在摸牌
                List<poker> tmpHand = hand.get(j);
                tmpHand.add(pokerList.remove(0));
            }
        }

        //输出每个人的牌
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第"+(i+1)+"个人的牌是"+hand.get(i));
        }

        System.out.println("剩余的牌有"+pokerList);
    }
}

执行结果 :

三. 设计分析

1. 设计一张扑克牌

定义一个类 , 类中字段包含一张扑克牌的 花色 和 数字 ,并给出构造方法和其他相关访问字段的方法

public class poker {
    private String suit;//花色
    private int num;//数字

    public poker(String suit, int num) {
        this.suit = suit;
        this.num = num;
    }

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return suit+" "+num;
    }
}

2. 得到一副新牌

定义一个存放4种花色的数组 , 创建一个顺序表来存放获取到的扑克牌 , 通过两层循环得到52张扑克牌 , 外层循环4次每次得到一种花色 , 内层循环13次得到每种花色的13个值

public static final String[] SUITS = {"♠","♥","♣","♦"};
    //买一副扑克牌
public static List<poker> buypokers() {
    List<poker> pokerList = new ArrayList<>();
    for (int i = 0; i < 4; i++) {
        for (int j = 1; j <= 13; j++) {
            pokerList.add(new poker(SUITS[i],j));
        }
    }
    return pokerList;
}

3. 洗牌

顺序表中有52张牌 , 也就是52个元素 , 从最后一个元素开始循环 , 利用 Random 这个类中的方法生成1到元素下标之间的随机数 , 将生成随机数位置的元素和循环中的那个元素进行交换 .

    //洗牌
    public static void shuffle(List<poker> pokerList) {
        Random random = new Random();
        for (int i = pokerList.size()-1; i > 0; i--) {
            int index = random.nextInt(i);
            swap(pokerList, i, index);
        }
    }
    //交换
    public static void swap (List<poker> pokerList, int i, int index) {
        poker tmp = pokerList.get(i);
        pokerList.set(i, pokerList.get(index));
        pokerList.set(index, tmp);
    }

4. 发牌

定义三个顺序表分存放三个人摸起来的牌 , 将这三个顺表再作为元素放入另一个新的顺序表中 , 好方便执行循环摸牌的操作 , 然后还是通过两层循环去摸牌 , 三个人每人摸一张 , 摸5轮 , 所以外层循环执行5次 ; 内层循环3三次 , 每次表示一个人摸去一张牌 ;

其实每次摸牌就就是从扑克牌所在顺序表中删除第一个元素 , 所以每次摸牌访问的都是顺序表中的第一个元素 , remove方法返回的是删除的元素

//用来存放三个人揭起来的牌
List<poker> hand1 = new ArrayList<>();
List<poker> hand2 = new ArrayList<>();
List<poker> hand3 = new ArrayList<>();

List<List<poker>> hand = new ArrayList<>();
hand.add(hand1);
hand.add(hand2);
hand.add(hand3);

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 3; j++) {
        //确定是谁在摸牌
        List<poker> tmpHand = hand.get(j);
        tmpHand.add(pokerList.remove(0));
    }
}

以上就是Java模拟实现扑克牌洗牌和发牌的示例代码的详细内容,更多关于Java扑克牌洗牌发牌的资料请关注脚本之家其它相关文章!

相关文章

  • java阶乘计算获得结果末尾0的个数代码实现

    java阶乘计算获得结果末尾0的个数代码实现

    今天偶然看到一个要求,求1000~10000之间的数n的阶乘并计算所得的数n!末尾有多少个0?要求: 不计算 只要得到末尾有多少个0就可以了,看下面的代码吧
    2013-12-12
  • 关于多线程常用方法以及对锁的控制(详解)

    关于多线程常用方法以及对锁的控制(详解)

    下面小编就为大家带来一篇关于多线程常用方法以及对锁的控制(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 为何HashSet中使用PRESENT而不是null作为value

    为何HashSet中使用PRESENT而不是null作为value

    这篇文章主要介绍了为何HashSet中使用PRESENT而不是null作为value,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Spring BeanName 的自动生成原理示例详解

    Spring BeanName 的自动生成原理示例详解

    这篇文章主要介绍了Spring BeanName 的自动生成原理示例详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 基于springboot创建mybatis的完整步骤

    基于springboot创建mybatis的完整步骤

    MyBatis是一款优秀的数据库持久层框架,相比Hibernate我更喜欢使用MyBatis,看的到SQL还是让人更安心点,这篇文章主要给大家介绍了关于基于springboot创建mybatis的完整步骤,需要的朋友可以参考下
    2024-03-03
  • 如何用Intellij idea2020打包jar的方法步骤

    如何用Intellij idea2020打包jar的方法步骤

    这篇文章主要介绍了如何用Intellij idea 2020打包jar的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Spring内存缓存Caffeine的基本使用教程分享

    Spring内存缓存Caffeine的基本使用教程分享

    Caffeine作为当下本地缓存的王者被大量的应用再实际的项目中,可以有效的提高服务吞吐率、qps,降低rt,本文就来简单介绍下Caffeine的使用姿势吧
    2023-03-03
  • 解决表单post,get到springMVC后台乱码的问题

    解决表单post,get到springMVC后台乱码的问题

    下面小编就为大家分享一篇解决表单post,get到springMVC后台乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 通俗易懂学习java并发工具类-Semaphore,Exchanger

    通俗易懂学习java并发工具类-Semaphore,Exchanger

    这篇文章主要介绍了java并发工具类-Semaphore,Exchanger,java并发工具类有很多,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编带大家来一起学习一下吧
    2019-06-06
  • SpringBoot2.0集成Swagger2访问404的解决操作

    SpringBoot2.0集成Swagger2访问404的解决操作

    这篇文章主要介绍了SpringBoot2.0集成Swagger2访问404的解决操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论