12.12 练习
本章的示例代码位于仓库 ThinkJavaCode 的目录 ch12 中,有关如何下载这个仓库,请参阅前言中的“使用示例代码”一节。做以下的练习前,建议你先编译并运行本章的示例。
练习12-1
12.6 节介绍了创建一副扑克牌的代码,请将这些代码封装到一个名为 makeDeck 的方法中,它不接受任何参数并返回一个填充好的 Cards 数组。
练习12-2
在有些扑克牌游戏中,A 指定的点数比 K 大。请修改方法 compareTo 以支持这种排序方式。
练习12-3
在扑克牌游戏中,同花指的是这样一手牌,即包含 5 张或更多同花色的牌。一手牌可包含任意数量的牌。
(1) 编写一个名为 suitHist 的方法,让它将一个扑克牌数组作为参数,并返回这手牌的花色直方图。你的解决方案只能遍历这个数组一次。
(2) 编写一个名为 hasFlush 的方法,让它将一个扑克牌数组作为参数,并在这手牌为同花时返回 true,否则返回 false。
练习12-4
如果能够在屏幕上显示扑克牌,那么将更有趣。如果你还没有阅读介绍 2D 图形的附录 B,应先阅读再来完成这个练习。本章示例代码所在的目录 ch12 包含:
cardset-oxymoron,这个目录包含各种扑克牌图像;
CardTable.java,一个演示如何读取并显示图像的示例程序。
CardTable.java 演示了如何使用二维数组,具体地说是二维图像数组。这个数组的声明类似于下面这样:
private Image[][] images;
变量 images 指向一个二维的 Image 对象数组,其中的 Image 对象是在 java.awt 包中定义的。创建这种数组的代码如下:
images = new Image[14][4];
这个数组包含 14 行(每种点数占 1 行,还有一个未用的、表示点数 0 的行)、4 列(每种花色一列)。下面的循环填充了这个数组:
String cardset = "cardset-oxymoron";String suits = "cdhs";for (int suit = 0; suit <= 3; suit++) {char c = suits.charAt(suit);for (int rank = 1; rank <= 13; rank++) {String s = String.format("%s/%02d%c.gif",cardset, rank, c);images[rank][suit] = new ImageIcon(s).getImage();}}
变量 cardset 包含扑克牌图像文件所在目录的名称。suits 是一个字符串,包含各种花色的单字母缩写。这两个变量被用来设置变量 s 的值,使其依次为各个扑克牌图像的文件名。例如,rank=1 且 suit=2 时,变量 s 的值为 "cardset-oxymoron/01h.gif",这是红心 A 的图像。
循环中的最后一行代码读取图像文件并创建一个 Image 对象,再将其赋给索引为 rank 和 suit 的数组元素。例如,红心 A 的图像存储在索引 1 和索引 2 指定的位置。
如果编译并运行 CardTable.java,你将在一个绿色表格中看到整副扑克牌的图像。你可以用这个类来实现自己的扑克牌游戏。
