C#琐事游戏:在平局的情况下该怎么办?
我目前正在研究一个琐事游戏。我写了一个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轮。如果我这样做,我们应该选择哪支球队,最后是每轮的前两名球队。
感谢您的阅读!
如何使用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
}
或者,你可以做一个OrderBy
和Take(2)
。然后,您可以对第二队执行Where
和/或Any
。
我总是喜欢在我的程序中总是确保不可能有领带。所以,如果这是一个投掷硬币的游戏,我总是会有奇数的投掷。有了这样的东西,你可能会纳入时间,或者你可以添加奖励点的准确性。或者你可以有一个连续正确答案的答案的列表。
按分数排序并取第二个元素。只采取得分大于或等于该分数的球队。如果你得到2个以上的球队 - 所有得分等于该分数的球队都会进入平局。
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]’默认
做这样的事情:
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
}
获得最低分资格线以上,并指望有多少队有得分或更高:
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
}
按照这个步骤,你会得到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;
是你的数据源SQL吗?如果是这样,它有一个非常方便的[RANK()](http://msdn.microsoft.com/zh-cn/library/ms189798.aspx)函数,可以解决您的问题。 – Terry 2012-04-17 21:31:01