第1部分。我有一个名为Cards的对象。它具有名称,套装和价值属性(杰克,钻石,2)。我想计算一个玩家是否拥有四个类别(4张牌具有相同的Name属性)。这如何实现?我正在寻找一种高效的算法。如何按属性值计算对象?
第2部分。我需要一个算法来找到同一套服装(即7,8,9,10,心中的杰克)连续5张卡片。非常感谢你们所有的聪明人!
为了澄清,每个玩家总共处理了8张牌。玩家(物体)有一个名为Hand的属性,它是卡片[物体]列表。
第1部分。我有一个名为Cards的对象。它具有名称,套装和价值属性(杰克,钻石,2)。我想计算一个玩家是否拥有四个类别(4张牌具有相同的Name属性)。这如何实现?我正在寻找一种高效的算法。如何按属性值计算对象?
第2部分。我需要一个算法来找到同一套服装(即7,8,9,10,心中的杰克)连续5张卡片。非常感谢你们所有的聪明人!
为了澄清,每个玩家总共处理了8张牌。玩家(物体)有一个名为Hand的属性,它是卡片[物体]列表。
对于部分1,你可以这样做:
var has4ofaKind = cards.GroupBy(c => c.Name).Any(g => g.Count() >= 4);
对于第2部分,它将如果你有一个属性是轻松了很多,说Value
,为整数,而不是字符串。然后,你可以这样做:
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);
得爱LINQ。很好的答案 –
对于部分1 :你有什么数据结构给玩家?也就是说,你如何表现玩家的卡片收藏?第二部分:从中找出5张牌? –
你的意思是发现玩家的手牌是否连续有5张牌? – MichelleJS
谢谢。每个玩家总共处理8张牌。 Player对象有一个Hand属性,它是一个卡片列表。希望我回答你的问题。我也会更新这个问题,以便更清楚。准确地说是 – pnduke