运用集合知识做斗地主案例

方法中可变参数

一种特殊形参,定义在方法,构造器的形参列表里,格式:数据类型...参数名称;

可变参数的特点和好处

特点:可以不传数据给它;可以传一个或者同时传多个数据给它;也可以传一个数组给它。

好处:常常用来灵活的接收数据。

注意:

1.可变参数对内实际上就是一个数组。

2.可变参数在形参列表中只能有一个。

3.可变参数必须放在形参列表的最后面

Collections工具类

collection是一个用来操作集合的工具类

Collections提供的常用静态方法

java 复制代码
 public static void main(String[] args) {
        //Collection工具类
        List<Integer> list = new ArrayList<>();
        //1.Collectiohns批量添加数据
        Collections.addAll(list, 1,2,3,4,5,6,7,8,9,10);
        System.out.println(list);
        //2.打乱顺序
        Collections.shuffle(list);
        System.out.println(list);
        //3.升序排序
        Collections.sort(list);
        System.out.println(list);
        //4.降序排序
        Collections.sort(list,(o1, o2)->o2.compareTo(o1));
        System.out.println(list);
    }
运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[7, 1, 5, 2, 10, 8, 3, 9, 6, 4]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

斗地主案例

如何创建一副扑克牌并初始化

如何洗牌、发牌

如何对玩家手中的牌进行排序

Java 中集合的操作与 Lambda 表达式的使用

本项目涉及两个核心类:

Card 类:表示一张扑克牌

Room 类:代表游戏房间,负责游戏逻辑

doudizhuGame 类:程序入口

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Card {
    private String size;
    private String color;
    private int num;

    @Override
    public String toString() {
        return size+color;
    }
}

使用了 Lombok 注解简化开发,生成 getter/setter 和 toString() 方法。

size 表示点数,color 表示花色,num 是牌的"大小值",在排序时使用。

toString() 方法用于打印显示牌面信息。

java 复制代码
private List<Card> cards = new ArrayList<>();

{
    String[] sizes = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "2", "A"};
    String[] colors = {"♠", "♥", "♣", "♦"};

    int num = 0;
    for (String size : sizes) {
        num++;
        for (String color : colors) {
            cards.add(new Card(size, color, num));
        }
    }
    cards.add(new Card("JOKER", "小🃏", ++num));
    cards.add(new Card("JOKER", "大🃏", ++num));

    System.out.println(cards);
}

sizes 数组按从小到大的顺序排列,便于后续排序。

循环遍历点数和花色组合,构造普通扑克牌。

手动添加大小王,并赋予更高的权值 num。

num 值越大,牌力越强,在排序中排在前面

java 复制代码
public void start() {
    Collections.shuffle(cards); // 洗牌
    Map<String, List<Card>> players = new HashMap<>();
    List<Card> lhc = new ArrayList<>();
    List<Card> lhb = new ArrayList<>();
    List<Card> lhz = new ArrayList<>();

    players.put("令狐冲", lhc);
    players.put("令狐白", lhb);
    players.put("令狐张", lhz);

    // 发出51张牌,保留最后3张为底牌
    for (int i = 0; i < cards.size() - 3; i++) {
        Card card = cards.get(i);
        if (i % 3 == 0) {
            lhc.add(card);
        } else if (i % 3 == 1) {
            lhb.add(card);
        } else {
            lhz.add(card);
        }
    }

    // 获取底牌
    List<Card> lastCard = cards.subList(cards.size() - 3, cards.size());
    System.out.println("底牌是:" + lastCard);

随机选出地主

随机从三位玩家中选择一位

将三张底牌加入该玩家的手牌中

控制台输出地主的名字

java 复制代码
// ======【新增】随机选地主======
    String[] playerNames = {"令狐冲", "令狐白", "令狐张"};
    Random random = new Random();
    String landlordName = playerNames[random.nextInt(playerNames.length)];
    System.out.println("🎉 随机选出的地主是:" + landlordName);

    // 给地主发底牌
    players.get(landlordName).addAll(lastCard);

Collections.shuffle() 实现洗牌。

使用 Map<String, List<Card>> 存储三个玩家及其手牌。

使用 for 循环配合取模运算 (i % 3) 给每位玩家轮流发牌。

最后三张牌作为底牌单独保存。

java 复制代码
// 排序方法
private void sortCards(List<Card> hand) {
    Collections.sort(hand, (o1, o2) -> o2.getNum() - o1.getNum());
}

// 在 start() 中调用
sortCards(lhc);
sortCards(lhb);
sortCards(lhz);

使用 Collections.sort() 配合 Lambda 表达式进行自定义排序。

根据 num 字段降序排序,使得牌力从高到低展示。

java 复制代码
for (Map.Entry<String, List<Card>> entry : players.entrySet()) {
    String name = entry.getKey();
    List<Card> playerCards = entry.getValue();
    System.out.println(name + "的牌是:" + playerCards);
}

展示所有玩家的手牌

程序入口:doudizhuGame.java

java 复制代码
public class doudizhuGame {
    public static void main(String[] args) {
        Room room = new Room();
        room.start();
    }
}
相关推荐
小wanga2 小时前
C++知识
java·开发语言·c++
我是渣哥2 小时前
Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
java·开发语言·jvm·后端·算法·职场和发展·性能优化
工一木子2 小时前
深入Java并发:锁机制原理剖析与性能优化实战
java·性能优化·并发·
你我约定有三2 小时前
java--写在 try 中的创建连接
java·开发语言
ERP老兵-冷溪虎山2 小时前
Python/JS/Go/Java同步学习(第三篇)四语言“切片“对照表: 财务“小南“纸切片术切凭证到崩溃(附源码/截图/参数表/避坑指南/老板沉默术)
java·javascript·python·golang·中医编程·四语言同步学习·职场生存指南
科技树支点2 小时前
无GC的Java创新设计思路:作用域引用式自动内存管理
java·python·go·web·编程语言·编译器
码农小伙3 小时前
ConcurrentHashMap解析
java·开发语言
WhiteJunior3 小时前
Java基础知识点汇总(五)
java·开发语言
晚安里3 小时前
JVM相关 4|JVM调优与常见参数(如 -Xms、-Xmx、-XX:+PrintGCDetails) 的必会知识点汇总
java·开发语言·jvm·后端·算法
纪莫4 小时前
技术面:Java并发(线程池、ForkJoinPool)
java·java面试⑧股