2012-04-17 36 views
5

我目前正在研究一个琐事游戏。我写了一个Team类,一个Question类和一个Round类。C#琐事游戏:在平局的情况下该怎么办?

这是我的团队类(我不会发布属性,构造函数和方法,因为它们与我的问题无关)。

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

在这种情况下,不需要平局,因为只有前两名球队晋级下一轮。

所以我想知道是否有人可以帮助我想出一个算法,可以帮助确定我是否需要一个tie-Breaker轮。如果我这样做,我们应该选择哪支球队,最后是每轮的前两名球队。

感谢您的阅读!

+1

是你的数据源SQL吗?如果是这样,它有一个非常方便的[RANK()](http://msdn.microsoft.com/zh-cn/library/ms189798.aspx)函数,可以解决您的问题。 – Terry 2012-04-17 21:31:01

回答

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()); 

你也许即使删除,只是做RunTieBreaker如果你使用这个实现:

Team RunTieBreaker(List<Team> teamsToTieBreak) 
{ 
    if(teamsToTieBreak.Count == 1) 
     return teamsToTieBreak[0]; 
    //Do tiebreaker 
} 

或者,你可以做一个OrderByTake(2)。然后,您可以对第二队执行Where和/或Any

0

我总是喜欢在我的程序中总是确保不可能有领带。所以,如果这是一个投掷硬币的游戏,我总是会有奇数的投掷。有了这样的东西,你可能会纳入时间,或者你可以添加奖励点的准确性。或者你可以有一个连续正确答案的答案的列表。

0

按分数排序并取第二个元素。只采取得分大于或等于该分数的球队。如果你得到2个以上的球队 - 所有得分等于该分数的球队都会进入平局。

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]。分数”,那么它会赢得默认决胜;如果不需要抢七将返回‘N [X-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 
} 
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 
} 
0

按照这个步骤,你会得到winers的列表,并追平球队名单有了这两个列表,你可以回答。你的三个问题。

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;