ArrayList 模拟发牌

Hello! 伙伴们 , 这期是我们用顺序列表实现模拟发牌的操作 , 里面包含了我自己学习时的代码 ,即理解注释 , 如果有什么不妥或理解不到位的地方欢迎指正 ,希望对你们有所帮助 。

package ArrayList;
//基于 ArrayList 实现洗牌和发牌

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

//表示玩家的手牌
class handCard{
    private ArrayList<Card> cards;
}

//使用 ArrayList 表示一张牌
class Card{
    private String suit;
    private String rank;

    public Card(String suit, String rank) {
        this.suit = suit;
        this.rank = rank;
    }
    public String getSuit(){
        return this.suit;
    }
    public String getRank(){
        return this.rank;
    }
    public void setSuit(String suit){
        this.suit = suit;
    }
    public void setRank(String rank){
        this.rank = rank;
    }

    @Override
    public String toString() {
        return "Card{" +
                "suit='" + suit + '\'' +
                ", rank='" + rank + '\'' +
                '}';
    }
}
public class Demo01 {
    public static void main(String[] args) {

        //这里创建了衣服新牌 , 然后通过调用函数 , 将创建的一副牌赋值给了 deck
        ArrayList<Card> deck = createDeck();
        System.out.println("原始的牌:");
        System.out.println(deck);

        //洗牌 打乱牌的顺序 标准库中提供了shuffle方法
        System.out.println("打乱后的牌:");
//        Collections.shuffle(deck);
        shuffle(deck);
        System.out.println(deck);

        //发牌 , 假设有三个人 , 每个人发五张(三行五列的二维数组)
        //hands 也是一个 ArrayList 里面的每个元素也是一个 ArrayList , 并且当前 hands 长度为 0
        ArrayList<ArrayList<Card>> hands = new ArrayList<>();
//        ArrayList<handCard> handCards = new ArrayList<>();
        //往 hands 里面添加三个元素 , 表示三个玩家的手牌
        for (int i = 0; i < 3; i++) {
            ArrayList<Card> hand = new ArrayList<>();
            hands.add(hand);
        }

        //给三人轮流发牌 , 重复五次
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                //得到每一个玩家对象
                ArrayList<Card> currentHand = hands.get(j);
                //取出第一张牌
                Card card = deck.remove(0);
                currentHand.add(card);
            }
        }


        //打印每个人的手牌
        for (int i = 0; i < 3; i++) {
            System.out.println("第" + i +"个人都手牌:"+hands.get(i));
        }
    }
    //自己实现以下洗牌操作
    public static void shuffle(ArrayList<Card> deck){
        //打乱扑克牌
        //把整个 ArrayList 从后往前遍历
        //针对每次取到一张牌 , 就生成一个随机的下标 , 拿着当前位置的牌和生成的随机下标位置的牌 , 进行交换

        //实例化一个随机数的对象
        Random random = new Random();
        for (int i = deck.size()-1; i > 0; i--) {
            //生成 deck.size() 范围内的随机数
            int j = random.nextInt(deck.size());
            //交换两张牌的位置
            //生成一副临时牌 , 用于存储 i 位置的牌面(其实是相当于复制了一份 i 位置的牌面)
            Card temp = new Card(deck.get(i).getSuit(),deck.get(i).getRank());
            //把下标为 i 的位置设置为 deck.get(i)
            deck.set(i,deck.get(j));
            //将 j 位置的牌设置为刚刚临时创建用于存储 i 的temp
            deck.set(j,temp);

        }
    }
    public static ArrayList<Card> createDeck(){
        //创建一副扑克牌
        ArrayList<Card> deck = new ArrayList<Card>();
        String[] suits = {"♠", "♥", "♦", "♣"};
        for(String suit :suits){
            //在每个花色中生成对应点数的牌
            for (int i = 2; i <= 10; i++) {
                Card card = new Card(suit,""+i);
                //将生成的 一种花色的十张牌 添加到 ArrayList<Card> 的数组 deck 中
                deck.add(card);
            }
            //继续考虑 J Q K A
            Card cardJ = new Card(suit, "J");
            Card cardQ = new Card(suit, "Q");
            Card cardK = new Card(suit, "K");
            Card cardA = new Card(suit, "A");
            deck.add(cardJ);
            deck.add(cardQ);
            deck.add(cardK);
            deck.add(cardA);

        }
        return deck;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值