14.9 练习

本章的示例代码位于仓库 ThinkJavaCode 的目录 ch14 中,有关如何下载这个仓库,请参阅前言中的“使用示例代码”一节。做以下的练习前,建议你先编译并运行本章的示例。

练习14-1

在方法 Player.play 中实现一种更佳的策略。例如,如果有多张牌匹配,且其中一张为 8,那么就出 8。

想想其他能最大限度地减少罚分的策略,如优先考虑出点数最大的牌。编写一个扩展 Player 的新类,并重写方法 play,以实现你制定的出牌策略。

练习14-2

编写一个循环,在其中玩 100 次本章介绍的游戏,并记录每位玩家分别赢了多少次。如果你实现了前一个练习介绍的多种出牌策略,那么可让这些策略进行较量,看看哪种策略的效果最好。

提示:设计一个扩展 PlayerGenius 类,并在其中重写方法 play,再将一个玩家声明为 Genius 对象。

练习14-3

本章编写的程序存在一个缺陷,那就是只支持两个玩家。请修改 Eights 类,在其中定义一个包含玩家的 ArrayList,并相应地修改选择下一个玩家的方法 nextPlayer

练习14-4

设计本章的程序时,我们力图将类数量降到最少,这导致有些方法不太合理。例如,cardMatchesPlayer 的一个静态方法,但将其作为 Card 的实例方法更合适。

问题是我们想让 Card 类可用于任何扑克牌游戏,而不仅仅是 Crazy Eights 中。为解决这种矛盾,可添加一个扩展 Card 的新类——EightsCard,并在其中定义方法 match,让它根据 Crazy Eights 的规则来检查两张牌是否匹配。

另外,你还可创建一个扩展 Hand 的新类——EightsHand,并在其中定义方法 scoreHand,让它累计手中所有牌的罚分。同时,顺便在 EightsCard 中添加一个名为 scoreCard 的方法。

无论你是否做了这些修改,都请绘制一个 UML 类图来显示这种继承层次结构。