C++ 洗牌與發(fā)牌

2023-03-20 16:24 更新

在第13.6節(jié)我們編寫了一個洗牌算法的偽代碼。假設(shè)shuffleDeck函數(shù)實現(xiàn)洗牌功能,其參數(shù)為一個牌堆,我們就可以這樣創(chuàng)建牌堆并洗牌:

Deck deck;       // 創(chuàng)建一個標(biāo)準(zhǔn)的52張牌的牌堆
deck.shuffle (); // 洗牌

然后,使用subdeck函數(shù)來分幾手牌:

Deck hand1 = deck.subdeck (0, 4);
Deck hand2 = deck.subdeck (5, 9);
Deck pack = deck.subdeck (10, 51);

這段代碼將前5張紙牌分到一個牌堆中,接下來的5張分到一個牌堆中,剩下的作為一個牌堆。

在考慮發(fā)牌的時候,你是不是認為我們應(yīng)該像實際游戲中常用的那樣輪流著每次給每個玩家發(fā)一張牌?我也這樣想過,但我意識到,對計算機程序而言這是不必要的。輪流發(fā)牌有兩個目的,一是為了降低洗牌缺陷帶來的問題,再就是使發(fā)牌者更難作弊。而這些對計算機而言都不是問題。

這個例子是個有益的提醒,那就是要小心工程隱喻的一點危險之處:有時我們給計算機施加了不必要的限制,或者期望計算機缺乏的功能,就是因為我們輕率地將隱喻擴展到了崩潰的邊緣。一定要小心誤導(dǎo)性的類比。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號