12.6 纸牌的向量

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

本章选择纸牌作为研究对象的原因是,牌堆是一个很明显的纸牌向量的应用。 这是创建一副52张牌组成的新牌堆的代码:

apvector<Card> deck (52);

这是对象的状态图: enter image description here

三个点代表我不想画出的48张牌。记住,我们尚未初始化纸牌实例变量。有些环境中,它们会初始化为0,就像图中这样,而在其他环境中它们可能包含任何可能的值。

一种初始化方法是,以一个Card对象为第二个参数调用向量的构造函数:

Card aceOfSpades (3, 1);
apvector<Card> deck (52, aceOfSpades);

这段代码创建了一副由52张同样的牌组成的牌堆,就像变魔术用的特殊牌。当然,创建一副由52张不同的牌组成的牌堆才更有意义。这可以使用嵌套循环实现。

外层循环枚举了花色,从0到3。对于每种花色,内部循环枚举了牌的大小,从1到13。因为外部循环迭代4词,内部循环迭代13词,循环体总的执行次数是52次(即13乘以4)。

int i = 0;
for (int suit = 0; suit <= 3; suit++) {
  for (int rank = 1; rank <= 13; rank++) {
    deck[i].suit = suit;
    deck[i].rank = rank;
     i++;
  }
}

我们使用变量i记录牌堆中要使用的下一张牌。

注意,我们可以把数组元素选择语法([]操作符)和对象的实例变量选择语法(点操作符)组合起来。比如表达式deck[i].suit意思是“牌堆中第i张卡的花色”。

作为练习,请把构建牌堆的代码封装为buildDeck函数,该函数不接受任何参数并返回一个完全填充的纸牌向量。