0

我正在尝试使用 c# 创建一个基本的扑克游戏。

到目前为止,我已经使用这三行随机发牌:

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

现在我想要实现的是只处理那些尚未发牌的牌。现在为此,我创建了两个“字典”集合,一个称为“deck”,一个称为“dealt”。我最初考虑将所有卡片添加到甲板上,然后在桌子上处理时将它们从甲板上删除并使用卡片唯一键添加到处理中。

您认为解决此问题的最佳方法是什么?我基本上不希望重复的牌,例如 Ace Hearts 和 Ace Hearts 组合在同一个牌组中。我怎样才能防止这种情况?

4

4 回答 4

2

为什么不预先生成一张卡片列表,然后洗牌并将它们推入堆栈。

当你发牌时,只需将下一张牌从堆栈中弹出。

这里还有另一个关于如何在 C# 中随机播放列表的问题。

于 2011-03-04T00:54:19.683 回答
0

我认为最简单的方法是:

A:重写该GetHashCode()函数,并使用卡值和卡套创建哈希。B:实施IEquatable<Card>并比较花色和价值。

然后,只需要一张HashSet<Card>包含所有发牌的单张(不需要字典),然后让您的卡片生成器检查卡片是否已经存在。

于 2011-03-04T00:52:35.820 回答
0

你的Dictionary方法应该可行,但我认为最简单的方法是生成一张List卡片,最初以某种自然顺序,然后将它们洗牌。然后,只需跟踪您已发出的列表中的多少张牌。当谈到洗牌时,你(以及所有还没有读过它的人)应该阅读这篇关于洗牌陷阱的优秀文章

于 2011-03-04T00:53:30.370 回答
0

这不是通常的做法。我见过的大多数纸牌游戏都有 Deck 结构,它通常是 0..51 范围内的值的数组 [0..51]。对于每个值,花色是 (cardValue / 13),值是 (cardValue % 13)。您最初通过将数组初始化为 0..51 来为新游戏创建套牌,然后随机将每个位置的卡片与另一个随机位置的卡片交换。完成此操作后,您只需从一端挑选卡片并根据需要“发牌”给玩家。

于 2011-03-04T00:53:59.210 回答