C#琐事游戏:如果打平局怎么办?

时间:2012-04-17 21:23:15

标签: c# arrays loops

我正在制作一个琐事游戏。我写了一个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

在这种情况下,没有必要打破平局,因为只有前两支球队才能进入下一轮。

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

感谢阅读!

7 个答案:

答案 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
}

或者,您可以执行OrderByTake(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;