2012-04-17 56 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;