Programm zur Ligaplan auslosung

  • Hallo Leute,

    für ein Spiel möchte ich ein Programm erstellen, dass mit automatisch einen Liga-Spielplan macht.
    Damit ist folgendes gemeint:
    Ich Trage die Namen der Vereine ein zB. Verein A, Verein B, Verein C, Verein D.

    Nun soll das Programm die Spiele auslosen und mir dann zB. anzeigen:
    1. Spieltag
    Verein A - Verein C
    Verein D - Verein B

    2. Spieltag
    Verein C - Verein B
    Verein A - Verein D

    3. Spieltag
    Verein D - Verein A
    Verein B - Verein C

    und so weiter, also jeweils mit Hin und rückspiel. Leider habe ich keinerlei Ahnung wie ich das anstellen soll. Ich weiß nur, dass ich die Vereine über eine .txt Datei aufrufen könnte und dann der Spielplan in einer anderen Textdatei abgespeichert wird, aber wie ich das mit der Auslosung mache habe ich leider keine Ahnung.

    Hoffe eienr kann mir weiterhelfen, danke!

  • Du solltest die Vereine in ein Array einlesen und dann die Spieltage ausrechnen...

    • Offizieller Beitrag

    Na dann wollen wir dir mal helfen ;)

    Edit: Ich habe es noch mal überarbeitet und etwas "professionalisiert" :D
    Ich gehe mal von aus, dass immer eine geradzahlige Anzahl an Mannschaften vorhanden ist.

    Edit2: Ich habe mal noch 2 Funktionen zum Ermitteln der Spiele eines Teams (Hin- und/oder Rückspiele) bzw. der Paarungen eines bestimmten Spieltages hinzugefügt.

    Spoiler anzeigen
    [autoit]


    #Include <Array.au3>
    Global $a[10] = ['Team A','Team B','Team C','Team D','Team E','Team F','Team G','Team H','Team I','Team J']

    [/autoit] [autoit][/autoit] [autoit]

    Global $iTeams = UBound($a)
    Global $iMatchDays = $iTeams + Mod($iTeams, 2) -1
    Global $iMatchesPerDay = ($iTeams - Mod($iTeams, 2))/2
    Global $iMatches = $iMatchDays*$iMatchesPerDay

    [/autoit] [autoit][/autoit] [autoit]

    Global $aPairs[$iMatches][3]

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $iMatchDays
    _CreatePairs($aPairs, $a, $i)
    _MoveEntries($a)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($aPairs, 'Paarungen je Spieltag')

    [/autoit] [autoit][/autoit] [autoit]

    ;~ $aRet = _GetMatchesTeam($aPairs, 'Team F') ; == Heim + Auswärts
    $aRet = _GetMatchesTeam($aPairs, 'Team F', 'H') ; == nur Heim
    _ArrayDisplay($aRet, 'Spiele "Team F"')

    [/autoit] [autoit][/autoit] [autoit]

    $aRet = _GetMatchesDay($aPairs, 2) ; == alle Paarungen eines bestimmten Spieltages
    _ArrayDisplay($aRet, 'Spiele "Tag 2"')

    [/autoit] [autoit][/autoit] [autoit]

    Func _MoveEntries(ByRef $_a)
    Local $aTmp = $_a
    For $i = 0 To UBound($aTmp) -3
    $_a[$i+1] = $aTmp[$i]
    Next
    $_a[0] = $aTmp[UBound($aTmp)-2]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _CreatePairs(ByRef $_aP, $_a, $_n)
    Local Static $indx = 0
    Local $i = 0, $i1 = UBound($_a) -1
    For $z = 1 To $iMatchesPerDay
    $_aP[$indx][0] = $_n
    $_aP[$indx][1] = $_a[$i]
    $_aP[$indx][2] = $_a[$i1]
    $i += 1
    $i1 -=1
    $indx += 1
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetMatchesTeam(ByRef $_aPairs, $_sTeam, $_sType='G')
    Local $aOut[1][3] = [[0]] ; == [Spieltag,Typ(A/H),Gegner]
    Local $sOpp, $iHome = 0, $aType[2] = ['A','H']
    For $i = 0 To UBound($_aPairs) -1
    If $_aPairs[$i][1] = $_sTeam Or $_aPairs[$i][2] = $_sTeam Then
    $sOpp = $_aPairs[$i][1]
    If $_aPairs[$i][1] = $_sTeam Then
    $sOpp = $_aPairs[$i][2]
    $iHome = 1
    EndIf
    Switch $_sType
    Case 'G' ; == Gesamt (Heim + Auswärts)
    __AddToList($aOut, $_aPairs[$i][0], $aType[$iHome], $sOpp)
    Case 'H' ; == Heim
    If $aType[$iHome] = 'H' Then __AddToList($aOut, $_aPairs[$i][0], 'H', $sOpp)
    Case 'A' ; == Auswärts
    If $aType[$iHome] = 'A' Then __AddToList($aOut, $_aPairs[$i][0], 'A', $sOpp)
    EndSwitch
    EndIf
    Next
    Return $aOut
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetMatchesDay(ByRef $_aPairs, $_iDay)
    Local $aOut[1][2] = [[0]]
    For $i = 0 To UBound($_aPairs) -1
    If $_aPairs[$i][0] = $_iDay Then
    $aOut[0][0] += 1
    ReDim $aOut[$aOut[0][0]+1][2]
    $aOut[$aOut[0][0]][0] = $_aPairs[$i][1]
    $aOut[$aOut[0][0]][1] = $_aPairs[$i][2]
    EndIf
    Next
    Return $aOut
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func __AddToList(ByRef $_a, $_iDay, $_sType, $_sOpp)
    $_a[0][0] += 1
    ReDim $_a[$_a[0][0]+1][3]
    $_a[$_a[0][0]][0] = $_iDay
    $_a[$_a[0][0]][1] = $_sType
    $_a[$_a[0][0]][2] = $_sOpp
    EndFunc

    [/autoit]
  • Dank dir, sieht schon super aus. Aber verstehen tue ich nicht viel, also sobald ich das Programm öffne, werden die ganzen Paarungen angezeigt. Wenn ich es schkließe öffnet sich ein weiteres Fenster was mit von Team F alle Heimspiele anzeigt. Beim erneuten schließen bekomme ich alle Spiele vom Spieltag 2 angezeigt. Danach ist das Programm beendet.
    Was mir aber auffällt ist, dass er nicht die Paarungen jedes mal neu auslost, sondern immer das selbe angezeigt wird.

    Will ja nicht meckern oder so, finde es echt klasse das du das Programm für mich geschrieben hast, werde auch ein Copyright von dir draufmachen, wäre toll, wenn du die paar kleinigkeiten ändern könntest. Also das die Paarungen jedesmal neu gemischt werden. Ansonsten weiß man ja jede Saison schon das der erste Spieltag Team A gg Team J antreten muss.

    Danke für deine Mühe! :)

    €: An sich bräuchte ich nur die Paarungen, musst dir keine extrearbeit machen um die extras zu verbessern :)
    €²: 10 Teams sind genau perfekt, soviele sind auch in der Liga dabei^^

    Einmal editiert, zuletzt von NewAnime (12. Mai 2012 um 13:27)

    • Offizieller Beitrag

    also sobald ich das Programm öffne, werden die ganzen Paarungen angezeigt.

    Das erste Ergebnis-Array zeigt dir alle Paarungen für alle Spieltage. Jeder spielt einmal gegen jeden. Dazu sind eine von der Gesamtzahl der Mannschaften abhängige Spieltage erforderlich. Deshalb auch die Anzeige: Spieltag | Paarung

    Wenn ich es schkließe öffnet sich ein weiteres Fenster was mit von Team F alle Heimspiele anzeigt

    Das ist nur ein Bsp.-Aufruf. Das kannst du für jede Mannschaft aufrufen. Denn sicher ist es in deinem Game erforderlich, dass du weißt, welchen Gegner an welchem Spieltag deine Mannschaft hat.

    Beim erneuten schließen bekomme ich alle Spiele vom Spieltag 2 angezeigt.

    Wiederum ein Bsp.-Aufruf. Diese Funktion ermöglicht dir alle Paarungen an einem bestimmten Spieltag abzurufen.

    Was mir aber auffällt ist, dass er nicht die Paarungen jedes mal neu auslost, sondern immer das selbe angezeigt wird.

    Also das die Paarungen jedesmal neu gemischt werden. Ansonsten weiß man ja jede Saison schon das der erste Spieltag Team A gg Team J antreten muss.

    Das wäre ja katastrophal, wenn die Paarungen neu gemischt werden, obwohl der Ligaplan nicht ausgespielt wurde!
    Am ersten Spieltag stehen alle Paarungen für die gesamte Saison fest. Da ändert sich bis Saisonende nichts mehr dran.
    Für eine neue Saison kannst du dann ja die Mannschaften im Array zufällig umsortieren und dann einen neuen Spielplan generieren.
    Das Skriptbsp. von mir ist übrigens, wie du vielleicht bemerkt hast, nur eine Halbsaison. Dieselben Paarungen (nur Heim/Auswärts wechselnd) hast du natürlich dann in der Rückrunde. Überleg dir einfach einen sinnvollen Algorithmus um diese Umverteilung vorzunehmen.
    Ich habe auch nicht integriert, dass eine Mannschaft abwechselnd Heim und Auswärts spielt. Das solltest du natürlich in die Funktion _CreatePairs() mit einfließen lassen. Etwas Arbeit soll ja auch für dich bleiben. :D
    Ich wollte dir nur den rechnerischen Anstoß geben, wie man die Kombinationen für beliebig viele (geradzahlige) Mannschaften bilden kann.

  • Okay ersteres ist einfach, dazu erstell ich mir einfach ein Programm was mir die Teams einfach mischt und das trag ich dann im Auslosungsprogramm in dieser reihenfolge ein für jede Saison.

    Was mir aber auffällt ist, das Team A nur heimspiele hat. Kann man das nicht irgendwie mischen?