You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Crazy Eights游戏问题:无法将Pile中的牌添加回Deck的ArrayList

问题分析与解决方案

我帮你找到了问题的核心原因,咱们一步步拆解来看:

1. Pile类的冗余Deck对象是关键问题

你写的Pile类已经继承了Deck(而Deck本身就是ArrayList<Card>的子类),这意味着Pile本身就具备了Deck的所有功能——它自己就是一个存储Card的集合。但你在Pile里又额外声明了一个Deck deck = new Deck();对象,这就造成了两个完全独立的牌组:一个是Pile继承来的自身集合,另一个是你手动创建的deck对象。

之前你对Pile的所有操作(比如pile.deck.addCard(...))都是在这个额外的deck对象上进行的,而不是Pile本身的集合。这就导致当你尝试把Pile里的牌移回主Deck时,根本找不到那些存在于额外deck对象里的牌,自然就加不进去了。

2. 修正Pile类的实现

把Pile里多余的Deck deck = new Deck();删掉,直接使用Pile继承来的Deck集合(也就是this,因为Deck是ArrayList的子类,Pile本身就是Card的容器)。修正后的Pile代码如下:

class Pile extends Deck {
    Card card = null;

    public Pile() {
        this.clear(); // 清空Pile自身的集合,而不是额外的deck对象
    }

    Card getTopCard() {
        // 增加空判断,避免集合为空时调用get(0)抛出异常
        if (this.isEmpty()) {
            return null;
        }
        card = this.get(0);
        this.remove(0);
        this.addCard(card); // 现在操作的是Pile自身的集合,把顶牌重新放回
        return card;
    }
}

3. 正确实现Pile到Deck的牌移动

现在你可以正常把Pile里的牌移回主Deck了,比如:

把Pile里的所有牌移回主Deck

// 循环取出Pile里的所有牌,添加到主Deck
while (!pile.isEmpty()) {
    deck.addCard(pile.removeCard());
}

把Pile的顶牌移回主Deck

// 先取出Pile的顶牌
Card topCard = pile.getTopCard();
// 从Pile中移除这张牌(因为getTopCard里又把牌加回去了,所以需要再移除一次)
pile.removeCard();
// 添加到主Deck
deck.addCard(topCard);

4. 额外的小优化建议

  • 在Deck的removeCard()方法里增加空判断,避免集合为空时抛出异常:
    Card removeCard() {
        if (this.isEmpty()) {
            return null;
        }
        Card card = this.get(0);
        this.remove(0);
        return card;
    }
    
  • Player类里的deck字段是public的,建议改成private并提供getter方法,符合面向对象的封装原则(如果老师没有强制要求public的话)。

内容的提问来源于stack exchange,提问作者Bert Hanz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:07:35