【发布时间】:2017-03-01 22:42:15
【问题描述】:
我正在开发一款扑克游戏,它计算出你拿到的牌是什么牌。我目前停留在顺子的逻辑上(5 张牌以增量顺序排列,例如 3、4、5、6、7)。我使用的 Card 对象有一个表示其值的 int 属性(ace 默认为 14)。
这是我目前所拥有的:
private static bool CheckForStraight()
{
List<Card> tmpCards = new List<Card>(_cards); //local copy of the cards
if (tmpCards.Count < 5) //need atleast 5 cards to make a straight
return false;
tmpCards = tmpCards.DistinctBy(v => v.CardValue).ToList(); //remove duplicate values
tmpCards = tmpCards.OrderBy(x => x.CardValue).ToList(); //order list
int count = 0;
if (tmpCards.Zip(tmpCards.Skip(1), (a, b) => (a.CardValue + 1) == b.CardValue).Any(x => x))
{
count++;
}
else
{
count = 0;
}
return false;
}
运行此代码时,linq 表达式将检查列表中的任何卡片值是否按顺序排列...因此,如果列表包含值为 2、3、5、8、11 的卡片,它将 +1算作 2 和 3 是连续的。所以 count 总是要么是 0 要么是 1,这对我来说没用。理想情况下,如果顺序有五张牌,我希望计数为 5。然后,如果计数等于 5,我就可以继续找出构成顺子的牌。
(如果一个 linq 表达式可以确定哪 5 张卡片是按顺序排列的,那就更好了,不确定在一个表达式头脑中是否可能)。
我的问题:如何修改我当前的 linq 表达式以获得我需要的结果?或者,如果我以错误的方式进行此操作,我能否指出正确的方向,提前致谢。
【问题讨论】:
-
简单的
for循环遍历排序数组有什么问题,而不是使用 LINQ。 ?在您的情况下,看起来代码会更加清晰。 -
对于 5 张扑克这有效: List
input = new List () { 1, 3, 5, 6, 7 };布尔直 = (input.Distinct().Count() == 5) && (input.Max() - input.Min() == 4); -
找到更好的解决方案,参见上面的编辑