我现在正在做一个琐碎的游戏。我写了一个团队类,一个问题类和一个圆形类。
这是我的团队类(我不会发布属性、构造函数和方法,因为它们与我的问题无关)。
public class Team
{
private int _teamNumber = 0;
private int _score = 0;
}
这是我的圆形课程:
public class Round
{
Team[] _teams = new Team[4];
Question[] _questions = new Clue[30];
bool _done = true;
}
我遇到的问题是在平局的情况下该怎么办。一共有8个队。前两轮(每轮4支球队)各有两名获胜者将有资格进入第三轮也是最后一轮。
因此,如果发生这样的事情:
currentRound.Teams[0].Score = 300;
currentRound.Teams[1].Score = 300;
currentRound.Teams[2].Score = 100;
currentRound.Teams[3].Score = 350;
如你所见,第二名打成平手。
我知道我可以检查重复次数,但是如果球队有像这样的分数
500,400,200,200
或
500,500,200,100
在这种情况下,没有必要打破平局,因为只有前两名的球队才能晋级下一轮。
所以我想知道是否有人能帮我想出一个算法来帮助我确定是否需要一个平局决胜轮。如果我这样做了,我们应该选择哪支球队,最后每轮前两名是哪支球队。
感谢您的阅读!
发布于 2012-04-17 21:29:59
如何使用LINQ来确定是否有并列第二的球队?
var orderedResults = currentRound.Teams.OrderBy(x=>x.Score).ToList();
if(orderedResults.Any(x=>x.Score == orderedResults[1].Score))
var team2 = RunTieBreaker(
orderedResults.Where(x=>x.Score == orderedResults[1].Score).ToList());
如果你使用这个实现,你甚至可以去掉if,只做RunTieBreaker:
Team RunTieBreaker(List<Team> teamsToTieBreak)
{
if(teamsToTieBreak.Count == 1)
return teamsToTieBreak[0];
//Do tiebreaker
}
或者,您可以执行OrderBy
和Take(2)
。然后,您可以对第二个团队运行Where
和/或Any
。
发布于 2012-04-17 21:38:18
这样做:
var result = currentRound.Teams.OrderBy(t => t.Score).GroupBy(t => t.Score).Take(2);
if (result.Sum(m => m.Count()) > 2)
{
//Need extra round
}
else
{
//No extra round
}
发布于 2012-04-17 21:29:50
我总是喜欢在我的程序中总是确保不可能有平局。因此,如果这是一场抛硬币的游戏,我总是会有奇数次的掷硬币。有了这样的东西,你可以加入时间,或者你可以添加加分来提高准确性。或者,您可以在一行中列出最多答案的正确答案。
https://stackoverflow.com/questions/10199375
复制相似问题