2009-02-26 16 views
8

Ich bin dabei, meine Tournament Organizer-Software, die das Erstellen und Bearbeiten von Double Elimination Turnieren ermöglicht, in das MVVM-Designmuster zu konvertieren, damit es einfacher getestet werden kann. Dabei entkomme ich das "Modell" von einem Code in der Benutzeroberfläche, der direkt die Klammerstruktur manipuliert.Datenstruktur für Double Elimination Turnier

Dies wird die dritte Iteration der Software sein, die ich für Turniere geschrieben habe. Die erste wurde in PHP geschrieben und die Daten in einer Datenbank gespeichert. Die zweite Version ist die von mir erstellte WPF-Version. Sie speichert die Daten im Speicher und serialisiert sie dann in eine XML-Datei. In beiden Versionen gibt es jedoch Aspekte der Implementierung, die meiner Meinung nach nicht sauber sind und anscheinend das DRY-Gesetz verletzen.

Wenn Sie eine Datenstruktur von Grund auf neu erstellen, um doppelte Eliminierungsklammern zu behandeln, wie würden Sie es tun?

Beachten Sie, dass es nicht in der Lage sein muss, die Klammern automatisch algorithmisch zu generieren (Laden von einer vorgefertigten Doppel-Eliminierung mit 4/8/16/32 Leuten ist, wie ich es jetzt mache), nur der Hauptanwendungsfall, Gewinner von Spielen zu setzen und sie durch die Bracket "voranzubringen".

Edit: Um es klar zu machen, muss die Datenstruktur Double Elimination Turniere behandeln, so dass der Gewinner eines Matches potentiell gegen den Verlierer eines anderen Matches antreten könnte.

Antwort

1

Meine Lösung dieses Problems war zwei Sätze von Datenstrukturen zu haben. Eine für das Halterungsteil und eine für die Sitze.

class Match 
{ 
    string Id; 
    MatchSeat red; 
    MatchSeat blue; 
    MatchSeat winner; 
    MatchSeat loser; 
} 

class MatchSeat 
{ 
    string Id; 
    Entry Entry; 
} 

Und dann, um es einzurichten, machte ich einige Hilfsfunktionen, die die Klammer Informationen und baute die Strukturen.

{ "1", "seed1", "seed4", "W1", "L1" }, 
{ "2", "seed2", "seed3", "W2", "L2" }, 
{ "3", "W1", "W2", "W3", "L3" }, 
{ "4", "L1", "L2", "W4", "L4" }, 
{ "5", "W4", "L3", "W5", "L5" }, 
{ "F", "W3", "W5", "WF", "WF" } 

Dann, wenn die Samen und Gewinner/Verlierer ausgefüllt sind, wird der Wert nur an einer Stelle gesetzt.

0

Was ist mit einem vollständigen Binärbaum, wo die erste Runde an den Blattknoten beginnt und dann nach oben geht.

+0

Leider behandelt das nicht Double Elimination Turniere :( – FryGuy

2

Also an den Endpunkten haben Sie 64 Teams. Es gibt also eine Sammlung von 64 Teams.

Aber sie sind paarweise aus, und für jedes Paar gibt es einen Gewinner. Und in der Mitte Klammern, dass Sieger hervorging tatsächlich aus einer Konsole, so dass ich denke, Ihre Konsole Objekt tatsächlich aussieht:

public class Bracket 
{ 
    Team winner; //if this is null or whatever, then we don't have a winner yet 
    Bracket topBracket; 
    Bracket bottomBracket; 
} 

... und wenn Sie Ihre Enden sind instanziiert wird, würden Sie lassen Sie die beiden Sub-Klammern null, mit nur einem Gewinner.

Um Double-Elimination zu behandeln, gibt es eine zweite Klammer, die eine Verliererklammer ist. Es wäre schön, wenn Sie automatisch das Hinzufügen von Verlierern in diese Klammer übernehmen könnten (entwerfen Sie eine Klammer, die mit 32 beginnt, die auf 16 herunterspielt, fügen Sie die 16 Verlierer aus Runde 2 der Siegerklammer hinzu), aber das ist alles Umsetzung. Die Datenstruktur muss nicht geändert werden, um dies zu berücksichtigen, Sie brauchen nur mehr von ihnen.

+0

Das funktioniert gut, bis auf die Tatsache, dass es für die doppelte Beseitigung sein muss (siehe bearbeiten) – FryGuy

0

Ich habe gerade bemerkt, diese Frage in der Seitenleiste einer anderen Frage, die ich auf war, und dachte, ich läuten würde:

ich dabei bin ein voll funktionsfähiges Turnier API zu entwickeln, und ich bin Open Sourcing es.

Es gibt noch keine Double-Elimination-Turniere, aber die Datenstruktur für die Single-Elimination-Turniere wurde kürzlich überarbeitet, um die Double-Elim-Baumstruktur zu unterstützen.

http://tournaments.codeplex.com/

+0

Ja, ich sah und heruntergeladen es. Leider (zum Glück?), Ich bin bereits vorangegangen und habe es implementiert, also wäre es schwierig, zu diesem Zeitpunkt noch etwas anderes zu verwenden :( – FryGuy