-3

第 1 部分。我有一个名为 Cards 的对象。它具有名称、花色和价值属性(Jack、Diamonds、2)。我想计算一个玩家是否有四种(4张牌具有相同的名称属性)。如何实现?我正在寻找一种有效的算法。

第 2 部分。我需要一种算法来在同一花色的一排中找到 5 张牌(即 7、8、9、10、红桃 J)。非常感谢所有聪明的人!

为了澄清,每个玩家总共发了 8 张牌。玩家(对象)有一个名为 Hand 的属性,它是卡片 [对象] 的列表。

4

1 回答 1

4

对于第 1 部分,您可以这样做:

var has4ofaKind = cards.GroupBy(c => c.Name).Any(g => g.Count() >= 4);

Value对于第 2 部分,如果您有一个属性,例如,作为整数而不是字符串,那会容易得多。然后你可以这样做:

var firstSuit = cards.First.Suit();
var isFlush = cards.Skip(1).All(c => c.Suit == firstSuit);
var isStraight = !cards.OrderBy(c => c.Value)
                       .Select((c, i) => c.Value - i)
                       .Distinct().Skip(1).Any();
var isStraightFlush = isFlush && isStraight;

请注意,这假设一手牌是 5 张牌。要在 8 手牌中找到 5 张顺子/同花牌,您必须使用以下方法:

var hasFlush = cards.cards.GroupBy(c => c.Suit).Any(g => g.Count() >= 5);
var hasStraight = !cards.OrderBy(c => c.Value)
                        .Select((c, i) => c.Value - i)
                        .GroupBy(x => x)
                        .Any(g => g.Count() >= 5);

找到同花顺稍微有点棘手:

var hasStraightFlush= !cards.OrderBy(c => c.Value)
                            .Select((c, i) => new { x = c.Value - i, c.Suit })
                            .GroupBy(x => x)
                            .Any(g => g.Count() >= 5);
于 2013-06-03T21:23:40.967 回答