简单洗牌算法

🎉欢迎大家收看,请多多支持🌹

🥰关注小哇,和我一起成长🚀个人主页🚀

⭐目前主更 专栏Java ⭐数据结构

⭐已更专栏有C语言计算机网络


在学习了ArrayList之后,我们可以通过写一个洗牌算法来练习练习。

一副扑克牌是由花色和数字及字母组成,我们这里用1~13的数字来代替所有字母和数字

我们用一个Card类来定义一个简单的扑克牌模型,包含两个成员变量来表示花色和数字,一个成员方法重写了toString方法 用于返回扑克牌卡片信息,还包含一个构造方法来给两个成员变量赋值:

java 复制代码
public class Card {
    public String suit;
    public int rank;

    public Card(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

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

再定义一个Game类来给扑克牌赋值、制作扑克牌、洗牌、发牌等操作。

用一个数组来存放花色:

java 复制代码
 public static final String[] SUITS = {"♥","♠","♣","♦"};

有了扑克牌花色之后,可以再利用循环给扑克牌添加数字:

java 复制代码
    //制造扑克牌
    public List<Card> createCards(){
        List<Card> cardList = new ArrayList<>();
        for(int i = 0; i < SUITS.length; i++){
            for(int j = 1; j <= 13; j++ ){
                Card card = new Card(SUITS[i],j);
                cardList.add(card);
            }
        }
        Card card1 = new Card("Great King",1);
        Card card2 = new Card("Little King",1);
        cardList.add(card1);
        cardList.add(card2);
        return cardList;
    }

这里创建一个createCards()方法来制作扑克牌,并将扑克牌放进cardList列表中 ,通过双层循环制作了1~13的4种花色的牌。

然后再单独制作大小王并添加进cardList列表。

另外这里需要导入java.util.ArrayList和java.util.List两个包。

扑克牌制作好后,就该洗牌了。我们可以遍历每张牌,通过产生随机数让该下标的牌与遍历的牌交换,进而达到洗牌的效果。这里用到Random类,需要导包java.util.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);//产生0~ i-1 的随机数
            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));//把牌j放到牌i的位置
        cardList.set(j,tmp);//把牌i(tmp)放到牌j的位置
    }

扑克牌洗好之后,我们就可以玩牌了,我们制定一个简单规则,三个人玩牌,轮流抽一张牌,各抽5张:

java 复制代码
 public List<List<Card>> play(List<Card> cardList){
        List<List<Card>> hand = new ArrayList<>();
        List<Card> hand0 = new ArrayList<>();
        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();

        hand.add(hand0);
        hand.add(hand1);
        hand.add(hand2);

        for(int i = 0; i < 5; i++){//每人各抽5张
            for(int j = 0; j < 3; j++){//3人轮流抽牌
                Card card = cardList.remove(0);//将抽到的牌取出
                hand.get(j).add(card);//谁抽的放谁手中
            }
        }
        return hand;
    }

我们再写一个Test类来测试以上代码,看看运行效果:

java 复制代码
import java.util.List;
public class Test {
    public static void main(String[] args) {
        Game game = new Game();
        List<Card> cardList = game.createCards();
        System.out.println("初始牌:" + cardList);

        game.shuffle(cardList);//洗牌
        System.out.println("洗过的牌:"+cardList);

        List<List<Card>> hand = game.play(cardList);
        for(int i = 0; i < hand.size();i++){
            System.out.println("第"+(i + 1)+"个人的牌是:"+hand.get(i));
        }
        System.out.println("剩下的牌:"+cardList);
    }
}

运行效果:

通过这个简单的洗牌算法,让我更好理解到了如何在程序中引入随机性、背后的逻辑,频繁使用ArrayList加深了对这种动态数组的认识与理解。


🥰感谢支持~~ 💕

相关推荐
菜鸟阿康学习编程3 分钟前
JavaWeb 学习笔记 XML 和 Json 篇 | 020
xml·java·前端
是小崔啊4 分钟前
Spring源码05 - AOP深入代理的创建
java·spring
yyytucj23 分钟前
python--列表list切分(超详细)
linux·开发语言·python
等一场春雨34 分钟前
Java设计模式 八 适配器模式 (Adapter Pattern)
java·设计模式·适配器模式
肖田变强不变秃1 小时前
C++实现有限元计算 矩阵装配Assembly类
开发语言·c++·矩阵·有限元·ansys
一弓虽1 小时前
java基础学习——jdbc基础知识详细介绍
java·学习·jdbc·连接池
王磊鑫1 小时前
Java入门笔记(1)
java·开发语言·笔记
喜欢猪猪1 小时前
分布式与微服务:构建现代应用的关键架构
开发语言·php
硬件人某某某1 小时前
Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)
java·开发语言·社区团购小程序·团购小程序·java社区团购小程序
程序员徐师兄1 小时前
Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)
java·spring boot·微信小程序·校园外卖点餐·外卖点餐小程序·校园外卖点餐小程序