我正在尝试使用c#创建一个基本的扑克游戏。
到目前为止,我已经使用这三行随机处理了这些卡片:
Suit suit = (Suit)randomCardSelector.Next(4);
Value value = (Value)randomCardSelector.Next(13);
Card abc = new Card(suit, value);
现在我想要达到的目标是只处理那些尚未处理过的人。现在要做到这一点,我创建了两个“字典”集合,一个叫做“deck”,另一个叫做“deal”。我考虑过将所有卡片最初添加到卡座上,然后在桌面上处理时,它们将从卡座中删除并添加到使用卡片唯一键进行处理。
您认为最好的解决方法是什么?我基本上不想要重复的牌,例如Ace Hearts和Ace Hearts组合在同一个牌组中。我该如何防止这种情况?
答案 0 :(得分:2)
答案 1 :(得分:0)
我认为最简单的方法是:
答:覆盖GetHashCode()
函数,并使用卡片值和卡片套装创建哈希。
B:实施IEquatable<Card>
并比较套装和价值。
然后,只有一个HashSet<Card>
,其中包含所有已发牌(不需要字典),并让您的卡片生成器检查该卡是否已存在。
答案 2 :(得分:0)
你的Dictionary
方法应该有效,但我认为最简单的方法是生成一张List
张牌,最初按照自然顺序排列,然后将它们随机播放。然后,只需跟踪您已列出的列表中的卡数。当谈到洗牌时,你(以及其他尚未阅读的人)应该阅读excellent article on the pitfalls of shuffling。
答案 3 :(得分:0)
这不是通常的做法。我见过的大多数纸牌游戏都有一个Deck结构,它通常是0..51范围内的数组[0..51]。对于每个值,suit为(cardValue / 13),值为(cardValue%13)。您最初通过将阵列初始化为0..51然后随机地在另一个随机位置用卡片在每个位置交换卡片来为新游戏创建牌组。完成此操作后,您只需从一端挑选牌并根据需要“交易”给玩家。