在第13.6节我们编写了一个洗牌算法的伪代码。假设shuffleDeck函数实现洗牌功能,其参数为一个牌堆,我们就可以这样创建牌堆并洗牌:
Deck deck; // 创建一个标准的52张牌的牌堆
deck.shuffle (); // 洗牌
然后,使用subdeck函数来分几手牌:
Deck hand1 = deck.subdeck (0, 4);
Deck hand2 = deck.subdeck (5, 9);
Deck pack = deck.subdeck (10, 51);
这段代码将前5张纸牌分到一个牌堆中,接下来的5张分到一个牌堆中,剩下的作为一个牌堆。
在考虑发牌的时候,你是不是认为我们应该像实际游戏中常用的那样轮流着每次给每个玩家发一张牌?我也这样想过,但我意识到,对计算机程序而言这是不必要的。轮流发牌有两个目的,一是为了降低洗牌缺陷带来的问题,再就是使发牌者更难作弊。而这些对计算机而言都不是问题。
这个例子是个有益的提醒,那就是要小心工程隐喻的一点危险之处:有时我们给计算机施加了不必要的限制,或者期望计算机缺乏的功能,就是因为我们轻率地将隐喻扩展到了崩溃的边缘。一定要小心误导性的类比。