12.6 纸牌的向量
优质
小牛编辑
136浏览
2023-12-01
本章选择纸牌作为研究对象的原因是,牌堆是一个很明显的纸牌向量的应用。 这是创建一副52张牌组成的新牌堆的代码:
apvector<Card> deck (52);
这是对象的状态图:
三个点代表我不想画出的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函数,该函数不接受任何参数并返回一个完全填充的纸牌向量。