🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
如果你对玩纸牌尚不熟悉,那最好现在就去拿一副,否则你会感觉这一章没什么意思。一副牌有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。