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 演示了如何使用二维数组,具体地说是二维图像数组。这个数组的声明类似于下面这样:

  1. private Image[][] images;

变量 images 指向一个二维的 Image 对象数组,其中的 Image 对象是在 java.awt 包中定义的。创建这种数组的代码如下:

  1. images = new Image[14][4];

这个数组包含 14 行(每种点数占 1 行,还有一个未用的、表示点数 0 的行)、4 列(每种花色一列)。下面的循环填充了这个数组:

  1. String cardset = "cardset-oxymoron";
  2. String suits = "cdhs";
  3. for (int suit = 0; suit <= 3; suit++) {
  4. char c = suits.charAt(suit);
  5. for (int rank = 1; rank <= 13; rank++) {
  6. String s = String.format("%s/%02d%c.gif",
  7. cardset, rank, c);
  8. images[rank][suit] = new ImageIcon(s).getImage();
  9. }
  10. }

变量 cardset 包含扑克牌图像文件所在目录的名称。suits 是一个字符串,包含各种花色的单字母缩写。这两个变量被用来设置变量 s 的值,使其依次为各个扑克牌图像的文件名。例如,rank=1suit=2 时,变量 s 的值为 "cardset-oxymoron/01h.gif",这是红心 A 的图像。

循环中的最后一行代码读取图像文件并创建一个 Image 对象,再将其赋给索引为 ranksuit 的数组元素。例如,红心 A 的图像存储在索引 1 和索引 2 指定的位置。

如果编译并运行 CardTable.java,你将在一个绿色表格中看到整副扑克牌的图像。你可以用这个类来实现自己的扑克牌游戏。