Java集合实战:手把手教你用ArrayList模拟斗地主发牌

一、案例效果演示

通过ArrayList集合实现斗地主发牌功能:

  1. 生成完整扑克牌(含大小王)

  2. 洗牌操作

  3. 模拟玩家抢地主

  4. 按规则排序手牌

最终效果图:
![运行效果示意图]

二、核心实现步骤

步骤1:创建扑克牌对象

public class card {
    private String number; // 牌面值
    private String color;  // 花色
    private int size;      // 权重值

    // 构造方法、getter/setter省略
    @Override
    public String toString() {
        return color + number;
    }
}

步骤2:初始化牌桌

public class room {
    private ArrayList<card> arr = new ArrayList<>();
    
    public room() {
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        String[] colors = {"♠","♥","♦","♣"};
        
        int size = 0;
        for(String num : numbers){
            size++;
            for(String color : colors){
                arr.add(new card(num, color, size));
            }
        }
        // 添加大小王
        arr.add(new card("X", "∷", ++size));
        arr.add(new card("D", "※", ++size));
    }
}

步骤3:洗牌与发牌

public void start() {
    Collections.shuffle(arr); // 随机打乱
    
    List<card> A = new ArrayList<>();
    List<card> B = new ArrayList<>();
    List<card> C = new ArrayList<>();
    
    // 分发基础牌
    for(int i=0; i<arr.size()-3; i++){
        switch(i%3){
            case 0: A.add(arr.get(i)); break;
            case 1: B.add(arr.get(i)); break;
            case 2: C.add(arr.get(i)); break;
        }
    }
    
    // 分发地主牌
    List<card> lordCards = arr.subList(arr.size()-3, arr.size());
    A.addAll(lordCards); // 模拟A抢地主
}

步骤4:手牌排序

private void sortCards(List<card> handCards) {
    Collections.sort(handCards, new Comparator<card>(){
        @Override
        public int compare(card o1, card o2) {
            return o1.getSize() - o2.getSize();
        }
    });
}

三、关键知识点解析

1. ArrayList特性应用

  • 动态数组结构适合频繁增删

  • 通过索引快速访问元素

  • 自动扩容机制保障容量

2. Collections工具类

  • shuffle() 实现随机洗牌

  • sort() 配合Comparator自定义排序

  • subList() 截取子列表

3. Comparator比较器

  • 通过重写compare方法定义排序规则

  • 本案例按牌的权重值(size)排序

  • 支持复杂排序逻辑(如先数值后花色)

四、开发经验总结

  1. 对象封装:将扑克牌抽象为card类,提高代码可读性

  2. 集合选择:根据业务场景选择合适集合(本例使用ArrayList)

  3. 排序优化:提前设置权重字段,避免动态计算影响性能

  4. 异常处理:实际开发中需添加空指针判断等容错机制

五、知识扩展

  • LinkedList更适合频繁插入/删除场景

  • HashMap可用于实现牌型判断

  • 使用Stream API可以简化集合操作


推荐练习

  1. 添加玩家类封装手牌操作

  2. 实现自动判断牌型功能

  3. 增加游戏流程控制

希望这篇实战教程能帮助你巩固集合知识!如果有疑问欢迎在评论区交流讨论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值