C# 如何比较列表中元素的枚举数?
我必须使用测试驱动开发实现一个扑克游戏。现在我必须检查给定的手是否包含直冲。因此,我必须检查每一张卡的枚举数是否大于前一张卡的枚举数。让我展示一些代码C# 如何比较列表中元素的枚举数?,c#,enums,C#,Enums,我必须使用测试驱动开发实现一个扑克游戏。现在我必须检查给定的手是否包含直冲。因此,我必须检查每一张卡的枚举数是否大于前一张卡的枚举数。让我展示一些代码 public bool IsStraightFlush(IHand hand) { var sortedCards = hand.Cards.OrderBy(card => card.Face).ThenBy(card => card.Suit); } 每张卡都由两个枚举参数声明:公共卡(CardF
public bool IsStraightFlush(IHand hand)
{
var sortedCards = hand.Cards.OrderBy(card => card.Face).ThenBy(card => card.Suit);
}
每张卡都由两个枚举参数声明:公共卡(CardFace、CardSuit套装)
CardFace和CardSuits是枚举。
下面是我现在写的东西——我将给定的手分类为由五张卡片组成的参数。我先是当面点菜,然后是西服。现在我必须知道如何检查手牌的下一张牌的CardFace enum是否比当前的卡的CardFace enum+1。下面是CardFace的枚举
public enum CardFace
{
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven = 7,
Eight = 8,
Nine = 9,
Ten = 10,
Jack = 11,
Queen = 12,
King = 13,
Ace = 14
}
我希望这能奏效:
public bool IsStraightFlush(IHand hand)
{
var sortedCards = hand.Cards.OrderBy(card => card.Face).ThenBy(card => card.Suit).ToList();
bool straightFlush = true;
for (int i = 1; i < sortedCards.Count(); i++)
{
if ((int)sortedCards[i].Face != (int)sortedCards[i - 1].Face + 1)
{
straightFlush = false;
break;
}
}
return straightFlush;
}
public bool IsStraightFlush(IHand)
{
var sortedCards=hand.Cards.OrderBy(card=>card.Face).ThenBy(card=>card.Suit.ToList();
bool-slightflush=true;
对于(int i=1;i
这可能会帮助您将序列强制转换为int,然后检查下一个元素-1
是否等于当前元素:
static bool CheckForSequence(List<int> input)
{
input.Sort();
var result = true;
for (int i = 0; i < input.Count - 1; i++)
{
result = input[i] == input[i + 1] - 1;
if (!result)
break;
}
return result;
}
在这种情况下,如果按顺序收集,则所有元素的项目和索引之间的差异将相同。尝试使用
分组方式,然后检查是否存在单个组,以及其中的所有车辆是否按顺序排列
public bool IsStraightFlush(IHand hand)
{
var sortedCards = from c in hand.Cards
group c by c.Suit into d
select new
{
Suit = d.Key,
Cards = d.OrderBy(x => x.Face)
};
// all cards are the same suit
if(sortedCards.Count() == 1)
{
Card previousCard = null;
foreach (var card in sortedCards.First().Cards)
{
if(previousCard != null && (card.Face - previousCard.Face > 1))
{
return false;
}
previousCard = card;
}
return true;
}
return false;
}
void Main()
{
var hand = new Hand
{
Cards = new List<Card>
{
new Card { Face = CardFace.Two, Suit = CardSuit.Clubs },
new Card { Face = CardFace.Three, Suit = CardSuit.Clubs },
new Card { Face = CardFace.Four, Suit = CardSuit.Clubs },
new Card { Face = CardFace.Five, Suit = CardSuit.Clubs },
new Card { Face = CardFace.Six, Suit = CardSuit.Clubs },
}
};
Console.WriteLine(IsStraightFlush(hand));
}
public bool IsStraightFlush(IHand)
{
var sortedCards=从手中的c.卡
c组由c组分为d组
选择新的
{
西装=d.钥匙,
Cards=d.OrderBy(x=>x.Face)
};
//所有的牌都是一样的
if(sortedCards.Count()==1)
{
卡片上一张卡片=空;
foreach(sortedCards.First()卡中的var卡)
{
if(previousCard!=null&(card.Face-previousCard.Face>1))
{
返回false;
}
以前的卡片=卡片;
}
返回true;
}
返回false;
}
void Main()
{
var手=新手
{
卡片=新列表
{
新卡{Face=CardFace.Two,Suit=CardSuit.Clubs},
新卡{Face=CardFace.3,Suit=CardSuit.Clubs},
新卡{Face=CardFace.Four,Suit=CardSuit.Clubs},
新卡{Face=CardFace.5,Suit=CardSuit.Clubs},
新卡{Face=CardFace.Six,Suit=CardSuit.Clubs},
}
};
控制台。写入线(IsStraightFlush(手动));
}
如果我正确理解您的问题,您希望比较两个相同类型的Ienumarable列表。您可以使用Enumerable.SequenceEqual方法进行比较。不,我想比较列表中每张卡片的卡片面枚举。好的,完全通过我之前写的所有测试。非常感谢你。
public bool IsStraightFlush(IHand hand)
{
var sortedCards = from c in hand.Cards
group c by c.Suit into d
select new
{
Suit = d.Key,
Cards = d.OrderBy(x => x.Face)
};
// all cards are the same suit
if(sortedCards.Count() == 1)
{
Card previousCard = null;
foreach (var card in sortedCards.First().Cards)
{
if(previousCard != null && (card.Face - previousCard.Face > 1))
{
return false;
}
previousCard = card;
}
return true;
}
return false;
}
void Main()
{
var hand = new Hand
{
Cards = new List<Card>
{
new Card { Face = CardFace.Two, Suit = CardSuit.Clubs },
new Card { Face = CardFace.Three, Suit = CardSuit.Clubs },
new Card { Face = CardFace.Four, Suit = CardSuit.Clubs },
new Card { Face = CardFace.Five, Suit = CardSuit.Clubs },
new Card { Face = CardFace.Six, Suit = CardSuit.Clubs },
}
};
Console.WriteLine(IsStraightFlush(hand));
}