PHP: Berechung von Baumdarstellung mit <table> & PHP
-
Hallihallo,
um es kurz zu erklären, ich suche nach einem Algorithmus o.ä. mit dem ich dynamisch so Baumdarstellungen von Turnieren berechnen/anzeigen kann.
Ein Beispiel hier, das sollte die grobe Funktionsweise verdeutlichen und zeigen was ich als Ziel habe.
http://www.dotlan.net/gallery/archive/20040127-85ACE3/0004.pngIch hab shcon unendlich viele Ansätze versucht, habs bisher aber noch nicht hinbekommen und deswegen frag ich einfach mal hier.
Die Teams liegen in mehreren Tabellen die ungefähr so aussehen könnten. Damit lässt sich der prinzipielle Turnierverlauf korrekt berechnen (also wer wo hinverteilt wird, ausgescheiden ist etc ...) Das Problem ist nur, dass in so eine Baumansicht mit HTML-Tabellen umzusetzen. Hab auch shcon versucht die einzelnen Schritte in nem extra Table für die Baumansicht noch zu speichern, aber das Problem liegt wie gehabt an der HTML Ausgabe.
teams:
| teamid | name | round | side | seeding_no |matches:
| id | team1id | team2id | victoryid | loserid |hat sowas schonma jemand gemacht, oder hat jemand ne Idee/Tipp, kompletten Neuansatz ? ... das Problem lässt mich einfach nicht los, aber ich werd noch verrückt :|
-
Mit Tabellen wird das wohl sehr komplex! Ich würde da eher DIVs oder direkt eine Grafik nehmen - gemacht hab ich sowas aber noch nie
-
Wie wärs wenn du mal einen Entwickler eines solchen Systems fragst?
Aber die Position ist ja irgendwie logisch:
Das 1. Feld der X-Achse ist natürlich (Runden / 2) * Pixelbreite und Y-Achse 0, dann zeichnest du alle untereinander hin.
In der nächsten Runde werden die Verlierer um Pixelhöhe/2 nach unten verschoben die Gewinner ebenfalls bloß wird die X-Achse entweder verkürzt oder erhöht.
Wenn du nun jedes Feld (Paarung) als DIV anlegst (du kannst dort die Position absolut angeben) sollte das Problem doch gar nicht so groß sein?
MfG SideWinder
-
das Problem lässt mich einfach nicht los, aber ich werd noch verrückt :|
Das kenn ich...geht mir auch manchmal so...
Ich hab mir die Seite mal angeguckt und muss sagen: Respekt.
Das, was die das produzieren, sieht echt verdammt gut aus. Vielleicht hilft dir das ja weiter:
http://www.boutell.com/gd/
-
Wie wärs wenn du mal einen Entwickler eines solchen Systems fragst?
das hab ich natürlich als erstes getan
DIe ANtworten sind immer gleich: "Hmm das ist ein riesen scheiss das zu machen, ich kann dir auch nicht genau sagen wie das geht" O_ohier noch ein anderes Beispiel. Das ist 100% mit Tabellen gelöst:
http://www.kepler2004.de/bilder/treeview.jpgalso die <tr> sind dann Teamanzahl * 2, und dann quasi immer in die Lücken "gefüllt"
-
Klar, wenn sich die Boxen nicht überschneiden kannst du es auch so machen - sollte doch eigentlich gar nicht so schwer sein
-
hm tja, das hab ich mir auch gedacht, das war vor ca. 8-10 Wochen
Event. kannst du mir ja einen Denkanstoß o.ä. geben ?
-
Wenn du es unbedingt über eine Tabelle machen willst könntest du dir z.B. erst ein Array mit der entsprechenden Breite und Höhe (Manschaften + Zwischenräume) anlegen und dann die Daten aus der DB auslesen und in der entsprechenden Position des Arrays eintragen. Anschließend eben noch dieses Array entsprechend ausgeben
-
also ich bins mal wieder
Ich habs jetzt wohl mal soweit geschafft, einen normalen Baum richtig auszugeben. Allerdings hab ich für die linke Seite noch nix brauchbares basteln können. Eventuell kann sich ja hier mal jemand den Code anschaun und rumprobieren ?<?php function gameinfo($team_1 = "xXx", $team_2 = "xXx") { $gameinfo .= "<table width=\"70\" height=\"50\" cellspacing=\"0\" border=\"1\">"; $gameinfo .= " <tr><td align=\"center\">".$team_1."</td></tr>"; $gameinfo .= " <tr><td align=\"center\">vs.</td></tr>"; $gameinfo .= " <tr><td align=\"center\">".$team_2."</td></tr>"; $gameinfo .= "</table>"; return $gameinfo; } $teams = 16; $teams = $teams/2; $rounds = log($teams)/log(2); $y_max = $teams*2-1; $x_max = $rounds*2+1; echo "<table border=0 cellpadding=0 cellspacing=0><tr>\n"; for($i=1;$i<=$x_max;$i++) { echo ($i%2) ? "<td width=70 align=center><b>round ".++$round."</b></td>" : "<td width=70> </td>"; } echo "</tr></table><br>"; for($x = 1; $x <= $x_max; $x++) { for($y = 1;$y <= $y_max; $y++) { # Runde 1 if($x == 1 && $y%2) { $match[$x][$y] = gameinfo(); } # Runde 2 if($x == 3 && $y%2 == false && ++$temp2%2) { $match[$x][$y] = gameinfo();; for($i=$y-1; $i <= $y+1; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-1] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+1] = "<img src=\"right_up.gif\">"; } # Runde 3 if($x == 5 && $y%4 == false && ++$temp3%2) { $match[$x][$y] = gameinfo();; $match[$x-1][$y] = "<img src=\"middle.gif\">"; for($i=$y-2; $i <= $y+2; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-2] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+2] = "<img src=\"right_up.gif\">"; } # Runde 4 if($x == 7 && $y%8 == false && ++$temp4%2) { $match[$x][$y] = gameinfo();; $match[$x-1][$y] = "<img src=\"middle.gif\">"; for($i=$y-4; $i <= $y+4; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-4] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+4] = "<img src=\"right_up.gif\">"; } # Runde 5 if($x == 9 && $y%16 == false && ++$temp5%2) { $match[$x][$y] = gameinfo();; $match[$x-1][$y] = "<img src=\"middle.gif\">"; for($i=$y-8; $i <= $y+8; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-8] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+8] = "<img src=\"right_up.gif\">"; } # Runde 6 if($x == 11 && $y%32 == false && ++$temp6%2) { $match[$x][$y] = gameinfo();; $match[$x-1][$y] = "<img src=\"middle.gif\">"; for($i=$y-16; $i <= $y+16; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-16] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+16] = "<img src=\"right_up.gif\">"; } # Runde 7 if($x == 13 && $y%64 == false && ++$temp7%2) { $match[$x][$y] = gameinfo();; $match[$x-1][$y] = "<img src=\"middle.gif\">"; for($i=$y-32; $i <= $y+32; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-32] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+32] = "<img src=\"right_up.gif\">"; } # Runde 8 if($x == 15 && $y%128 == false && ++$temp8%2) { $match[$x][$y] = gameinfo();; $match[$x-1][$y] = "<img src=\"middle.gif\">"; for($i=$y-64; $i <= $y+64; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-64] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+64] = "<img src=\"right_up.gif\">"; } # Runde 9 if($x == 17 && $y%256 == false && ++$temp9%2) { $match[$x][$y] = gameinfo();; $match[$x-1][$y] = "<img src=\"middle.gif\">"; for($i=$y-128; $i <= $y+128; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-128] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+128] = "<img src=\"right_up.gif\">"; } # Runde 10 if($x == 19 && $y%512 == false && ++$temp10%2) { $match[$x][$y] = gameinfo();; $match[$x-1][$y] = "<img src=\"middle.gif\">"; for($i=$y-256; $i <= $y+256; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-256] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+256] = "<img src=\"right_up.gif\">"; } # Runde 11 if($x == 21 && $y%1024 == false && ++$temp11%2) { $match[$x][$y] = gameinfo();; $match[$x-1][$y] = "<img src=\"middle.gif\">"; for($i=$y-512; $i <= $y+512; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; } $match[$x-1][$y-512] = "<img src=\"right_down.gif\">"; $match[$x-1][$y] = "<img src=\"middle.gif\">"; $match[$x-1][$y+512] = "<img src=\"right_up.gif\">"; } } } // ausgabe echo "<table border=0 cellpadding=0 cellspacing=0>\n"; for($y = 1;$y <= $y_max; $y++) { echo "<tr>"; for($x = 1; $x <= $x_max; $x++) { if($match[$x][$y]) { echo " <td width=70 align=center>".$match[$x][$y]."</td>\n"; } else { echo " <td width=50> </td>\n"; } } echo "</tr>\n"; } echo "</table>\n"; ?>
-
Du meinst für die Loser-Runde? Ist doch vom Prinzip her auch nichts anderes
-
ja, aber natürlich ist die anders!
Es kommen ja je Runde immer neue Teams von rechts dazu. Und ich hab den mathematischen Zusammenhang zw. Runden & Teams auf der linken Seite gefunden.
-
Irgendwie verstehe ich das Problem nicht ganz. Du hast in der Mitte die Ausgangs-Mannschaften und bei jedem Match kommt eine Mannschaft nach links und die andere nach rechts´. Wo ist da vom Prinzip her der Unterschied zwischen links und rechts
-
hm also:
wer rechts verliert, kommt in die entsprechende Runde auf der linken Seite wieder rein. Die, die schon links sind und dann nochmal dort verlieren, die fliegen dann komplett raus.
d.h. wenn ich in Runde -1 (linke Seite = negativ) 4 Teams schon hab, dann kommen dazu nochmal z.B. 2 Teams dazu die rechts verloren haben. Das lässt sich auf dem 2. Link/Bild das ich gepostet hab gut erkennen.
Deswegen heisst das auch "Double-Elimination", man ist erst ausgeschieden wenn man 2mal verloren hat (also links zum 2ten Mal verliert).Also verhält sich die linke Seite NICHT wie die rechte, die rechte lässt sich darstellen wie ein normales K.O. System.
-
Hatte es mitr nicht ganz so genau angeschaut
- aber auf der rechten Seite gibt es doch auch noch das Finale der Sieger der beiden Seiten
Aber dann wirst du deine Tabelle (wenn du unbedingt weiterhin eine verwenden willst) wohl etwas umgestalten müssen - oder der Sieger einer Begegnung steht eben nicht immer in der Mitte, sodass im Falle, dass eine Manschaft von rechts rumwechselt einfach 2 Kästen direkt nebeneinander kommen.