5

私は現在、トリビアゲームに取り組んでいます。Team クラス、Question クラス、Round クラスを作成しました。

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

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;

ご覧のとおり、2 位は同点です。

繰り返しを確認できることはわかっていますが、チームが次のようなスコアを持っている場合はどうなりますか

500、400、200、200

また

500、500、200、100

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

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

読んでくれてありがとう!

4

7 に答える 7

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

この実装を使用する場合、おそらく if を削除して RunTieBreaker を実行することもできます。

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

OrderByまたは、 and を実行することもできますTake(2)。次に、2 番目のチームに対してWhereand/orを実行できます。Any

于 2012-04-17T21:29:59.167 に答える
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
}
于 2012-04-17T21:38:18.410 に答える
0

この手順に従うと、勝者のリストと同点のチームのリストが表示されます。これらの 2 つのリストを使用して、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;
于 2012-04-17T21:49:38.563 に答える
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
}
于 2012-04-17T21:38:21.457 に答える
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

注:「n[x-1].Score」のスコアを持つチームが 1 つだけの場合、デフォルトでタイブレークに勝ちます。タイブレークが不要な場合、デフォルトで「n[x-1]」が返されます

于 2012-04-17T21:33:24.687 に答える
0

私は常に自分のプログラムで、同点になることが不可能であることを常に確認したいと思っています。コイントスゲームのように、投げる回数は常に奇数です。このようなものを使用すると、時間を組み込むことができます。または、正確さのためにボーナス ポイントを追加することもできます。または、最も多くの回答が連続して正しく回答されたリストを作成することもできます。

于 2012-04-17T21:29:49.813 に答える
0

チームをスコア順に並べ、2 番目の要素を取ります。そのスコア以上のスコアを持つチームのみを取ります。2 チーム以上獲得した場合、そのスコアと等しいスコアを持つすべてのチームがタイ ブレーカーに進みます。

于 2012-04-17T21:30:46.387 に答える