[JAVA]洗牌ArrayList的举例运用

本次想要创建的是模拟扑克牌(无大小鬼)

运用ArrayList实现,作为认识并使用的一个例子

首先对于一张牌,有花色和牌号

所以要先创建一个类来存储这两样东西

public class Card {
    //卡牌的格式
    public String suit;
    public int rank;

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

规定好了一张牌的类型后,我们就来创建出一副牌

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

public class CardDemo {
    //设计卡牌的花色
    public static String[] suits = {"♥","♠","♦","♣"};
    //创建牌
    public static List<Card> Cards(){
        //共四种花色,每种花色13张牌,先免去大小鬼
        ArrayList<Card> ret = new ArrayList<>();//创建一个list来存储牌
        for(int i = 0; i < 4; i++){//四种花色
            for(int j = 1; j <= 13; j++) {//每一种花色有13张牌
                Card card = new Card();//创建一张新牌
                card.suit = suits[i];//牌的花色赋值
                card.rank = j;//牌的牌号赋值
                ret.add(card);//将牌添加到牌堆中
            }
        }
        return ret;//返回创建好的一副牌
    }
}

看一下部分效果 

 既然是扑克牌,在使用之前我们通常要将其打乱。我们也可以实现这一个功能

洗牌

//洗牌
    public static void swap(List<Card> list,int i, int r){
        Card tmp = list.get(i);
        list.set(i,list.get(r));//将r下标的元素放置到下标i
        list.set(r,tmp);
    }

    public static void shuffle(List<Card> list){
        //打乱列表中的元素
        //从数组后面开始0~n,因为从前面开始的话,随机数前面还要给一一个限定值,n~size()
        Random random = new Random();
        for(int i = list.size()-1; i > 0; i--){
            int r = random.nextInt(i);//得到0~i-1的随机数
            swap(list,i,r);
        }
    }

下面我们实现的是,三个人轮流抽牌五回合

//三个人轮流抽牌五个回合
    public static List<List<Card>> pick(List<Card> Cards){
        List<List<Card>> ret = new ArrayList<>();
        //创建三list,相当于三个人的手牌
        for(int i = 0; i < 3; i++){
            ret.add(new ArrayList<>());
        }

        for(int i = 0; i < 5; i++){
            for(int j = 0; j < 3; j++){//0~2三个人,每个人每次抽一张,共抽五次
                ret.get(j).add(Cards.remove(0));//ret.get(j)等价于list[j]
            }
        }
        return ret;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值