一、案例效果演示
通过ArrayList集合实现斗地主发牌功能:
-
生成完整扑克牌(含大小王)
-
洗牌操作
-
模拟玩家抢地主
-
按规则排序手牌
最终效果图:
![运行效果示意图]
二、核心实现步骤
步骤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)排序
-
支持复杂排序逻辑(如先数值后花色)
四、开发经验总结
-
对象封装:将扑克牌抽象为card类,提高代码可读性
-
集合选择:根据业务场景选择合适集合(本例使用ArrayList)
-
排序优化:提前设置权重字段,避免动态计算影响性能
-
异常处理:实际开发中需添加空指针判断等容错机制
五、知识扩展
-
LinkedList更适合频繁插入/删除场景
-
HashMap可用于实现牌型判断
-
使用Stream API可以简化集合操作
推荐练习:
-
添加玩家类封装手牌操作
-
实现自动判断牌型功能
-
增加游戏流程控制
希望这篇实战教程能帮助你巩固集合知识!如果有疑问欢迎在评论区交流讨论~