12.2 纸牌对象(Card)

优质
小牛编辑
127浏览
2023-12-01

如果你对玩纸牌尚不熟悉,那最好现在就去拿一副,否则你会感觉这一章没什么意思。一副牌有52张,每张都有一个花色(4种花色之一)和大小(13个值之一)。按桥牌中下降的顺序排列,4种花色分别是黑桃(Spades)、红桃( Hearts)、方块(Diamonds)和梅花(Clubs)。大小包括A、2、3、4、5、6、7、8、9、10、J、Q和K。根据不同纸牌游戏的规则,A可能比K大,也可能比2小。

如果要定义新对象表示纸牌,很明显,实例变量应该是大小和花色。不过,实例变量以什么类型定义可能就没这么明显了。一个方法是使用apstring类型,比如用字符串“Spade”表示花色,而用字符串“Queen”表示大小。其缺点是难以比较两张牌的花色和大小。

另一个可选的方法是,使用整型数给大小和花色编码。这里的编码,并不是很多人认为的加密(或者说译成密码)。在计算机科学家的心目中,编码就像是在数字序列和希望表示的事物之间定义一个映射。例如,

Spades          |→ 3
Hearts           |→ 2
Diamonds     |→ 1
Clubs             |→ 0

“ |→”是表示映射的数学符号。该映射最明显的特性是,花色按顺序映射到整型数,所以我们可以通过比较整型数来比较花色。牌大小的映射也是显而易见的,每个数字大小映射到相应的整型数,带人像的扑克牌以下面方式映射:

J        |→ 11
Q       |→ 12
K       |→ 13

使用数学符号表示映射的原因是,映射并非C++程序的一部分,而是程序设计的一部分,但是它们从来不会显式地出现在代码中。Card类型的定义如下:

struct Card
{
  int suit, rank;

  Card ();
  Card (int s, int r);
};

Card::Card () {
  suit = 0; rank = 0;
}

Card::Card (int s, int r) {
  suit = s; rank = r;
}

Card有两个构造函数,构造函数没有返回类型且与结构体同名,通过这两点可以识别它们。第一个构造函数不接受任何参数,它把实例变量初始化为无效值(梅花0)。

第二个构造函数更加有用,它有两个参数,分别是纸牌的花色和大小。

下面代码创建了一个名为threeOfClubs的对象,它表示梅花3。

Card threeOfClubs (0, 3);

第一个参数0表示花色为梅花,第二个参数自然是表示牌的大小为3。