前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【Java】ArrayList的具体实现:简单的洗牌算法

【Java】ArrayList的具体实现:简单的洗牌算法

作者头像
喜欢做梦
发布2024-11-25 18:09:18
发布2024-11-25 18:09:18
6900
代码可运行
举报
文章被收录于专栏:学习
运行总次数:0
代码可运行

引言

实现一个简单的洗牌算法,这幅牌一共52张,不包含大小王,将这副牌进行打乱(这幅牌一共52张,不包含大小王),一个五个人,每个人每轮摸一张牌,一共摸五轮。

需要实现的操作:

1.52张牌; 2.洗牌; 3.发牌:一共三人,5轮,每轮摸一张牌

简单的洗牌算法

我们需要一幅牌,但是我们没有牌类这个类,所以我们要先自己定义一个牌类

Card类(牌类)

属性:大小、花色

代码语言:javascript
代码运行次数:0
复制
public class Card {
    //大小
    public int size;
    //花色
    public String suit;
    //初始化
    public Card(int size, String suit) {
        this.size = size;
        this.suit = suit;
    }
    @Override
    public String toString() {
        return "{"  + size+ suit +
                '}';
    }
}

既然有了牌类,那么我们就需要定义出一副牌了

CardList(一副牌)

这副牌有哪些属性? 大小:1-13; 花色:♥,♦,♣,♠

将每一张牌的大小和花色定义好,添加到整副牌中

代码语言:javascript
代码运行次数:0
复制
public class CardList {
    //四种花色
    public String[] suits={"♣","♥","♦","♠"};
    public List<Card> buyCard(){
        List<Card> cardList=new ArrayList<>();
        for (int i = 1; i <= 13; i++) {
            //cardList:放所有牌
            for (int j = 0; j < 4; j++) {
                //定义每一张牌的大小以及花色
                Card card=new Card(i,suits[j]);
                //将每张牌放到这幅牌中
                cardList.add(card);
            }
        }
       return  cardList;
    }
}

测试

代码语言:javascript
代码运行次数:0
复制
  public static void main(String[] args) {
        CardList cardList=new CardList();
        System.out.println(cardList.buyCard());
    }

结果:

0013d788e2764def8043384d085392b4.png
0013d788e2764def8043384d085392b4.png

washCard(洗牌)

有了牌,我们就要像将其进行洗牌,但是我们要怎么进行洗牌呢?

这是一副牌,我们要将其位置进行打乱

0ae68defc90e43e1a74ec2c7924acda5.png
0ae68defc90e43e1a74ec2c7924acda5.png

那么我们是不是可以从后开始往前,将后面的牌与任意一张牌进行交换,这样顺序就被打乱了

ca2a6143d284443ca7a31d3790c0ea81.png
ca2a6143d284443ca7a31d3790c0ea81.png

所以我们要生成一个随机的数,用来当中随机与之要交换的下标

随机数的生成:

代码语言:javascript
代码运行次数:0
复制
        Random random=new Random();
        int index=random.nextInt();

因为他要不断进行交换,随机生成数也有一个范围,并且每一次交换完,生成范围减少。所以我们用for循环语句,其i的起始位置从最后一位牌开始,向前交换

代码语言:javascript
代码运行次数:0
复制
 public void washCard(List<Card> cardList){
        Random random=new Random();
        for (int i = cardList.size()-1; i >0 ; i--) {
            //生成范围在0到51之间,随着交换次数,范围不断减少
            int index=random.nextInt(i);
            //交换牌
            swap(i,index,cardList);
        }
    }

接下来我们需要写一个swap方法用来交换牌

swap()

可能你想这么写,但是他是错误的,因为他不是数组,且他的里面有数组

代码语言:javascript
代码运行次数:0
复制
private void swap(int i,int j,List<Card> cardList){
          Card tmp=cardList[i];
          cardList[i]=cardList[j];
          cardList[j]=tmp;
   
    }

正确写法:

代码语言:javascript
代码运行次数:0
复制
private void swap(int i,int j,List<Card> cardList){
        Card tmp=cardList.get(i);
        cardList.set(i,cardList.get(j));
        cardList.set(j,tmp);
    }

测试:

代码语言:javascript
代码运行次数:0
复制
   public static void main(String[] args) {
        CardDemo cardDemo=new CardDemo();
        List<Card> cardList=cardDemo.buyCard();
        System.out.println(cardList);
        CardFunctions cardFunctions1=new CardFunctions();
        cardFunctions1.washCard(cardList);
        System.out.println(cardList);
    }

结果:

e76c516c34fb431db207ec589e10ef89.png
e76c516c34fb431db207ec589e10ef89.png

dealCard(发牌)

一共三人,5轮,每轮摸一张牌

所以我们先定义三个人,然后利用for循环语句,进行每轮的抽牌

代码语言:javascript
代码运行次数:0
复制
  //发牌
    public void dealCard(List<Card> cardList){
        List<Card> hand1=new ArrayList<>();
        List<Card> hand2=new ArrayList<>();
        List<Card> hand3=new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {

            }

        }
    }

每个人从牌的最上方揭走一张牌,我们要使用到remove

代码语言:javascript
代码运行次数:0
复制
cardList.remove(0);

但是我们要怎么将这些牌放到对应的手里面,因为hand1,2,3里面是一维,所以我们可以定义一个二维来储存他们

代码语言:javascript
代码运行次数:0
复制
  public void dealCard(List<Card> cardList){
        List<Card> hand1=new ArrayList<>();
        List<Card> hand2=new ArrayList<>();
        List<Card> hand3=new ArrayList<>();
        List<List<Card>> 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++) {
                Card card=cardList.remove(0);
                //将摸到的手牌分别放到handj手中
                hand.get(j).add(card);
            }
        }
    }

测试:

代码语言:javascript
代码运行次数:0
复制
    public static void main(String[] args) {
        //一副牌52张
        CardDemo cardDemo=new CardDemo();
        List<Card> cardList=cardDemo.buyCard();
        System.out.println(cardList);
        //洗牌
        CardFunctions cardFunctions1=new CardFunctions();
        cardFunctions1.washCard(cardList);
        System.out.println(cardList);
        //分牌
        List<List<Card>> ret=cardFunctions1.dealCard(cardList);
        for (int i = 0; i < ret.size(); i++) {
            System.out.println("第"+(i+1)+"人:"+ret.get(i));
        }
    }

结果:

054fe5a9b01d4c878d12134340dd078d.png
054fe5a9b01d4c878d12134340dd078d.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 简单的洗牌算法
    • Card类(牌类)
    • CardList(一副牌)
    • washCard(洗牌)
    • dealCard(发牌)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档