我正在制作一个琐事游戏。我写了一个Team类,一个Question类和一个Round类。
这是我的Team类(我不会发布属性,构造函数和方法,因为它们与我的问题无关)。
public class Team
{
private int _teamNumber = 0;
private int _score = 0;
}
这是我的Round课程:
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
在这种情况下,没有必要打破平局,因为只有前两支球队才能进入下一轮。
所以我想知道是否有人可以帮我提出一个算法,可以帮助确定我是否需要打破平局。如果我这样做,我们应该选择哪支球队,最后是每轮比赛的前两支球队。
感谢阅读!
答案 0 :(得分:3)
如何使用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
。
答案 1 :(得分:1)
做这样的事情:
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
}
答案 2 :(得分:0)
我总是喜欢在我的程序中始终确保不可能有领带。所以,如果它是一个投掷硬币的游戏,我将总是有奇数的投掷。有了这样的东西,你可以将时间纳入时间,或者你可以为准确性添加奖励积分。或者您可以连续正确回答大多数答案的列表。
答案 3 :(得分:0)
按分数对队伍进行排序,然后选择第二个元素。只选择分数大于或等于该分数的团队。如果你有超过2支球队 - 所有得分等于该分数的球队都会进入决胜局。
答案 4 :(得分:0)
List<Team> n = [total teams in round];
int x = [number moving to next round];
OrderTeamsByScore(n);
// get participants by score uses value of x to determine whether tie-break is needed
Team p = RunTieBreaker(GetTeamsByScore(n[x-1].Score, x)); //zero based array
注意:如果只有1支球队得分为“n [x-1] .Score”,那么默认情况下它将赢得平局;如果不需要打破中断,默认情况下将返回“n [x-1]”
答案 5 :(得分:0)
获得高于排位赛的得分,并计算得分或更高的球队数:
int qualifyingCount = 2;
int score =
currentRound.Teams.Select(t => t.Score)
.OrderByDescending(s => s)
.Take(qualifyingCount).Last();
if (currentRound.Teams.Count(t => t.Score >= score) > qualifyingCount) {
// tie break needed
}
答案 6 :(得分:0)
按照以下步骤操作,您将获得一系列葡萄酒商和一系列并列团队。 通过这两个列表,您可以回答三个问题。
1)按分数排序。 2)确定并列团队的得分。如果没有平局,请设置-1。 3)获取非捆绑葡萄酒的名单。如果每个人都被绑定,则此列表为空。 4)获取关联团队列表。如果没有平局,则此列表为空。 5)检查葡萄酒商,是否有领带或任何你需要的东西。
var orderedTeams = currentRound.Teams.OrderBy(t => t.Score).ToList();
int tieScore = orderedTeams[1].Score == orderedTeams[2].Score ? orderedTeams[1].Score : -1;
List<Team> winers = tieScore > 0 ? orderedTeams.Where(t => t.Score > tieScore) : orderedTeams.Take(2).ToList();
List<Team> tiedTeams = orderedTeams.Where(t => t.Score == tieScore).ToList();
bool needTieBreak = tiedTeams.Count > 0;