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
相关产品推荐
相关产品推荐

