# Liga: erstellen der Paarungen + Spieltage



## CrushLog (27. April 2005)

Hallo,

ich bin grad dabei eine kleine Test Liga zu programmieren. Alles in allem ja kein Problem, allerdings steh ich nun vor der Auslosung der Begegnungen. Das Ganze soll dem Prinzip der Bundesliga ähneln, also: 12 Spieler, 6 Spiele pro Spieltag, somit 11 Spieltage und insgesamt 66 Spiele. Soweit sogut, die Auslosung der möglichen Paarungen ist klar, da geh ich einfach die Spieler per Schleifen durch und lass sie gegen jeden anderen Spieler antreten, nur nicht gegen sich selbst. Das Eintragen funktioniert auch, nun aber das Problem: Die Match Tabelle enthält auch den Wert für den Spieltag, und der soll nun per random eingetragen werden, so dass 6 Paarungen pro Spieltag entstehen.
Egal wie ich es auch versuch, und wenns noch so simpel ist, ich bekomm es nicht hin. Hab bis jetzt einfach ein Array von 1-11 angelegt und die durchgemixt, und die dann eingetragen, sprich 6 Durchgänge, da es 66 Spiele sind, und dort dann immer die durchegmixten Werte des Arrays eingetragen. Nun ist es aber so, dass einige Spieler an einem Tag mehrmals ranmüssen, das soll natürlich nicht sein.
Ich steh vollkommen auf dem Schlauch und weiss echt nicht mehr weiter. Könnte sich vielleicht jemand mal damit gedanklich beschäftigen und mir ein wenig logische sowie praktische Hilfestellung geben?
Wäre euch echt dankbar!

Und sorry, falls ich etwas verquer und kompliziert geschrieben haben sollte, ich sitz bis jetzt an dem Script und bin extrem müde 

//Ben


----------



## mojitoweb (27. April 2005)

per random ist dies ein echt schweres Problem. Wir mussten soetwas schon als Gruppenarbeit lösen und wir haben einen Algorithmus gefunden, der allerdings in den letzten spielen der Hinrunde extrem lang braucht.
Es gibt allerdings eine Methode, welche unter dem begriff "Rutschsystem" oder so in den Google-newsgroups zu finden sein soll. Ich habe sie allerdings nicht gefunden.
Diese Methode wurde bis auf die letzte Saison die Bundesligaspieltage vom DFB berechnet.
Diese Methode soll auch auf ein ausgewogenen Verhältnix zwischen Heim- und Auswärtspartien achten.

Also falls du was findest ... stell es ruhig rein


----------



## CrushLog (29. April 2005)

Na toll, das heisst ich hab da ein ganz brandheisses Thema angefasst und keiner kennt eine Lösung? Na super, da fühl ich mich auf jeden Fall besser 
Aber gibt es dann eine andere Art der Lösung ohne alles, sagen wir mal manuell machen zu müssen?


----------



## Schneeflocke (29. April 2005)

CrushLog hat gesagt.:
			
		

> Na toll, das heisst ich hab da ein ganz brandheisses Thema angefasst und keiner kennt eine Lösung?



Doch, ich    

Ich bin auch Ligaleiter und habe auch lange gesucht bis ich was gefunden hatte und hier und da was verbessert oder meinen Wünschen angepasst.    


```
// ==================== Spielplan Generator ===============================

    // Array mit Spielern mischen
    shuffle ($teams);

    // Testen ob die Anzahl der Teams gerade ist, wenn nicht das Team "frei" hinzufügen.
    if(count($teams) % 2 ){
        array_push($teams , 'FREI');
    }

    $anz    = count($teams);      // Anzahl der Teams im Array $teams
    $paare  = $anz/2;            // Anzahl der möglichen Spielpaare
    $tage  = $anz-1;            // Anzahl der Spieltage pro Runde
    $spiele = $paare*$tage;    // Anzahl der Spiele pro Hin-/Rück-Runde
    $plan  = array();            // Array für den kompletten Spielplan
    $xpos  = $anz-1;            // höchster Key im Array $teams
    $tag    = 0;                  // Zähler für Spieltag
    $spnr  = 0;                  // Zähler für Spielnummer
    $sppaar = 0;                // Zähler für Spielpaar
    $i      = 0;                    // Schleifenzähler
    // ================================================================================
    for ($tag=1; $tag<$anz; $tag++) {
      array_splice ($teams, 1, 1, array(array_pop($teams),$teams[1]));
      for ($sppaar=0; $sppaar<$paare; $sppaar++) {
          $spnr++;
          // wechseln zwischen G und H -Spiel:
          if (($spnr%$anz!=1) and ($sppaar%2==0)) {
              $hteam = $teams[$sppaar];
              $gteam = $teams[$xpos-$sppaar];
          }  else {
              $gteam = $teams[$sppaar];
              $hteam = $teams[$xpos-$sppaar];
          }
          $plan[$tag][$spnr]["G"] = $gteam;                // für Hin-Runde
          $plan[$tag][$spnr]["H"] = $hteam;                // für Hin-Runde
          $plan[$tag+$tage][$spnr+$spiele]["G"] = $hteam;  // für Rück-Runde
          $plan[$tag+$tage][$spnr+$spiele]["H"] = $gteam;  // für Rück-Runde
      }
    }
    ksort($plan); // nach Spieltagen sortieren
    // ================================================================================
    $rueck = count($plan)/2 ;
    $Runde = 1;

    foreach($plan as $spieltag => $v1) {
        foreach($v1 as $spielnummer => $v2) {

        $H = $plan[$spieltag][$spielnummer]['H'];
        $G = $plan[$spieltag][$spielnummer]['G'];

        // Folgendes Echo für Test ohne Eintrag in DB
        // echo "Spieltag $spieltag: $H - $G <br>";

        // Hier könnte jetzt ein "INSERT INTO TABLE ..." mit den vg. '$values' erfolgen.
        mysql_query ("INSERT INTO ...........");
        }
        if ($spieltag == $rueck){
            $Runde = 2;
        }

    }

    sleep(1);
    // Hier ein Abfrage von den Paarungen um später die Spiele mit Frei zu löschen
    $sql2 = "SELECT * FROM ..........'";
    $result2 = mysql_query ($sql2);

    if (mysql_num_rows ($result2) > 0) {
        while ($data2 = mysql_fetch_array ($result2))
        {
            mysql_query("DELETE FROM ..... WHERE Heim='FREI' OR Gast='FREI'");
        }
    }
```

Hier und da musst du natürlich die Werte deiner Tabelle anpassen und deine Bezeichnungen für die Arrays ändern.

Funktioniert sowohl bei geraden als auch bei ungeraden Spielerzahlen und ist auch nicht begrenzt.


----------



## CrushLog (30. April 2005)

Oh sauber, dann werd ich mich da morgen mal ransetzen und das mal austesten, dank dir


----------



## scherzkecks (27. Mai 2006)

Das funktioniert ja tatsächlich.
Nicht schlecht das skript da oben.
Aber wie bekommt man das hin dass man keine Rückrunde hat.
Also nur 1xGegen jeden.


----------



## Hattrix (14. März 2007)

Gibt es sowas auch für Pokalrunden?


----------



## NiliBO (10. Mai 2007)

was muss ich denn mache damit es wirksam wird versteh hier nur bahnhof. Kann jemand ne kurze Anleitung posten bitte ?


----------



## Hattrix (21. Mai 2007)

Du musst die Variable $teams definieren (Array) und dann in eine php-Datei stecken. Datei aufrufen und du hast den Spielplan!


----------



## djkuddel (21. Oktober 2009)

Hat jemand auch ein passendes Script um dann eine ensprechende Ligatabelle aufzubauen?


----------



## zentraldenker (8. August 2011)

Seht euch einmal dieses Liga-Auslosungs-Tool an.  Hier kann man nicht nur eine Auslosung online vornehmen, sondern davor auch bestimmte Spielpaarungen an Spieltagen vorgeben bzw. Heim/Auswärtsrechte festlegen.


----------



## erik s. (9. August 2011)

Sehr interessantes Thema, da der Algorithmus nicht wirklich einfach ist.
Ich bin das Ganze auch mal mit viel Enthusiasmus angegangen und habe es mit Javascript gelöst. Das war zumindest eine Grundvoraussetzung, da es sich dabei um eine Aufgabe aus der Berufsschule handelte. Hab dann irgendwann auch noch eine Export- und Import-Funktion hinzugefügt und die Möglichkeit, die Rückrunde zu deaktivieren bzw. zu aktivieren.

Zu finden ist das Skript unter http://www.web4ward.de/scripts/LigaTool/.

Noch ein Datensatz, den man mal importieren kann (copy & paste und auf "Importieren" klicken):
http://www.web4ward.de/scripts/LigaTool/Testdatensatz Bundesliga.txt.

PS: Die Import-/Export-Funktion war anfangs nur zum Debuggen gedacht. Daher erkennt sie keine Eingabefehler geschweigedenn Manipulationsversuche


----------



## Tim Bureck (9. August 2011)

Ich hatte letztens, als hier eine ähnliche Fragestellung kam, noch diesen netten und wie ich finde gut erklärten Algorithmus gefunden:

Klick


----------



## erik s. (9. August 2011)

Jap, diesen habe ich unter anderem auch genutzt.


----------



## JaWoo (25. August 2011)

erik, stellen Sie das Script evtl. zur verfügung****? 

Mit freundlichen Gruss
JaWoo


----------



## erik s. (25. August 2011)

Gern, der Quellcode und die Dateien sind auch frei zugänglich.


----------



## JaWoo (25. August 2011)

Ok, wollte nur nach fragen und nicht einfach benutzen.


----------

