2011-03-04 40 views
0

我想創建一個基本的撲克遊戲使用c#。使用詞典試圖尋找一個值和關鍵(撲克遊戲)

到目前爲止,我已經拿到了卡使用這三條線隨機處理:

Suit suit = (Suit)randomCardSelector.Next(4); 
Value value = (Value)randomCardSelector.Next(13); 
Card abc = new Card(suit, value); 

現在我想實現的是,只有那些誰沒有被已經處理卡交易。現在要做到這一點,我創建了兩個'詞典'集合,一個叫'甲板',一個叫'dealt'。我想過把所有的牌都加到牌組中,然後當他們在牌桌上發牌時,他們將被從牌組中刪除,並添加到使用牌的唯一密鑰處理。

你認爲什麼是解決這個問題的最好方法?我基本上不想要重複的牌,例如Ace Hearts和Ace Hearts組合在同一張牌中。我怎樣才能防止這一點?

回答

0

我認爲最簡單的方法是:

答:重寫GetHashCode()功能,並創建使用該卡的價值和卡套裝哈希值。 B:執行IEquatable<Card>並比較這些套裝和值。

然後,只有一個HashSet<Card>其中包含所有髮卡(不需要字典),並讓你的卡發生器檢查卡是否已經存在。

0

您的Dictionary方法應該可行,但我認爲最簡單的方法是先生成一個List卡片,然後將它們洗牌。然後,只需跟蹤已列出的列表中有多少張卡。當涉及洗牌時,您(以及其他所有尚未閱讀的人)應閱讀此excellent article on the pitfalls of shuffling

0

這不是通常的做法。我見過的大多數紙牌遊戲都有一個Deck結構,它通常是0..51範圍內數組[0..51]的值。對於每個值,套裝是(cardValue/13),值是(cardValue%13)。初始化你的陣列爲0..51,然後在每個位置隨機交換一張卡片,然後在另一個隨機位置用卡片創建一個新遊戲的套牌。一旦你完成了這些,你只需從一端選擇卡牌,然後根據需要「交易」給選手。

2

爲什麼不只是預先生成一張卡片清單,然後洗牌並將它們推入堆棧。

當您處理卡片時,只需將下一張卡片從堆疊中彈出即可。

還有一個SO問題here關於如何在C#中對列表進行混洗。