2012-04-17 3 views
5

私は現在、トリビアゲームに取り組んでいます。私はチームクラス、質問クラス、ラウンドクラスを書いています。C#trivia game:ネクタイの場合はどうすればいいですか?

これは私のチームクラスです(私の質問には関係ないので、プロパティ、コンストラクタ、およびメソッドは投稿しません)。

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つのチームがあります。最初の2回のラウンド(それぞれ4チーム)からの2人の勝者が第3ラウンドと最終ラウンドに参加できます。

したがって、このような場合、何かが起こる:

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

のようなスコアを持っているものならば

この場合、上位2チームだけが次のラウンドに進むので、タイブレークの必要はありません。

誰かが私がタイブレーカーが必要かどうかを判断するのに役立つアルゴリズムを考えてもらえるかどうかは疑問でした。そしてもし私がしたら、どのチームが選ぶべきか、最終的には各ラウンドの上位2チームです。

読んでいただきありがとうございます!

+1

データソースはSQLですか?もしそうなら、あなたの問題を解決する本当に便利な[RANK()](http://msdn.microsoft.com/en-us/library/ms189798.aspx)関数があります。 – Terry

答えて

3

LINQを使用して、2番目に結ばれたチームがあるかどうかを判断するにはどうすればよいですか?

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を2番目のチームに対して実行することができます。

0

いつも私は自分のプログラムで常にネクタイができないことを確認したいと思っています。だから、コイン投げのゲームのように、私はいつも奇妙な投球数を持つだろう。このようなものでは、時間を組み込むこともできますし、正確さのためにボーナスポイントを追加することもできます。または、ほとんどの回答のリストに正しく回答してもらうことができます。

0

スコアでチームを順位付けし、2番目の要素を取る。スコア以上のスコアを持つチームのみを採点する。 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のリストと結ばチームのリストを取得しますをあなたが答えることができ、これらの二つのリストで。あなたの3つの質問。

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; 
関連する問題