Spielplan erstellen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Muck

Betreff: Spielplan erstellen

BeitragDo, Nov 24, 2005 4:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm ja, ich möchte einen automatisch generierten Spielplan haben, z.B. für die Bundesliga. Dafür hab ich erstmal folgende Felder angelegt:

dim Bundesliga1_Teams$(17)
dim heimteam$(33,8 )
dim auswaertsteam$(33,8 )

Jetzt müssen halt "nur" noch die Teamnamen korrekt auf die arrays verteilt werden, d.h. alle Teams müssen jeden Spieltag zum Einsatz kommen, jede Partie darf es nur einmal pro Runde geben und wenn möglich noch für jedes Team Heim- und AW-Spiel im Wechsel. Sitz jetzt schon ewig dran (wie man an der Zeit sieht Wink ), aber es will einfach nicht hinhaun. Hoffe es hat jemand ne gute Lösungsidee...
 

Klaas

BeitragDo, Nov 24, 2005 11:38
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich kenn mich nicht mit Fussball aus.
Es werden ja die teams in eine Lostrommel gesteckt und dann werden zufällig paarungen gezogen bis die Trommel leer ist oder?

Dann kann man das genau so machen, allerdigs geht das mit Types viel einfacher:
Code: [AUSKLAPPEN]

Type team
   Field name$
End Type

Type match
   Field team1.team
   Field team2.team
End Type

Type lostrommel
   Field team.team
End Type

;anzahl der teams
anzahl = 16

;teams erstellen
For i=1 To anzahl
   t.team = New team
   t\name = "Team_"+i
Next

;alle teams in die virtuelle lostrommel
For t.team = Each team
   l.lostrommel = New lostrommel
   l\team = t
Next

;die anzahl der matche ist die anzahl der teams durch 2
For i=1 To Floor(anzahl/2)
   team1.team = choose_team()
   team2.team = choose_team()
   
   ;das match anlegen
   m.match = New match
   m\team1 = team1
   m\team2 = team2
Next

;die paarungen ausgeben
For m.match = Each match
   match_num = match_num + 1
   Print "Match "+match_num + ": " + m\team1\name+" - "+m\team2\name
Next
WaitKey

Function choose_team.team()
   ;erstmal zählen
   For l.lostrommel = Each lostrommel
      anzahl = anzahl + 1
   Next
   
   ;zufällig eine Nummer ziehen
   SeedRnd(MilliSecs())
   r = Rand(0,anzahl-1)
   
   ;solange durch den Type gehen bis nummer erreicht ist
   l.lostrommel = First lostrommel
   For i=1 To r
      l.lostrommel = After l
   Next
   
   ;team merken und das los löschen
   team.team = l\team
   Delete l
   
   ;den type zurückgeben
   Return team
End Function

soli

BeitragDo, Nov 24, 2005 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
@klaas
Er braucht das für 18 Teams,
und das 17 mal nacheinander wobei
keine einzige Paarung identisch sein darf.

@muck
Ich habe das immer hardcodiert.
Will sagen, ich habe einen funktionierenden
Spielplan genommen, und dann die Mannschaften
per Zufall zugewiesen.
solitaire
 

Muck

BeitragFr, Nov 25, 2005 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hardcodiert?! Du meinst von Hand den ganzen Spielplan abgetippt oder wie? So hab ichs bisher gemacht - ist aber ne scheiss Lösung, denn 1.) braucht das nen Haufen Platz und 2.) ist das Problem ja, dass es auch Ligen mit 20 Teams oder so gibt. Da müsste ich dann nochmal nen ganzen anderen Spielplan eintippen..... Shocked

soli

BeitragFr, Nov 25, 2005 17:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich meinte natürlich hardgecodet.
Viel Platz ist das nicht,
ca 1 Data Zeile pro Mannschaft oder Spieltag,
wie man es nimmt.
Ist nur etwas unelegant.

Paarungen erstellen wäre ja kein Problem.
Nur H/A abwechselnd geht erstmal gar nicht,
weil alle Teams die am Anfang zu Haus spielen,
ja irgendwann auch gegeneinander antreten müssen.
Und die Ausnahmen prüfen dürfte etwas schwer werden.
solitaire

SoNenTyp

BeitragFr, Nov 25, 2005 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Man Macht eine Liste, in dieser Stehen alle Möglichen Paarungen.

2. Davon Wählt man dann, durch Zufall, eine aus.

3. Diese und das Rückspiel werden dann in einer weiteren Liste gespeichert.

4. Anhand dieser Liste kann man dann Wieder eine Liste Machen, in der nur die noch möglichen Paarungen vor kommen.

5. Wenn noch eine oder Mehrere Paarungen fehlen geht es wieder zu Punkt 2, wenn nicht ist hier schluss.


Hoffe das ist so verständlich.
Gruss Der Typ.

User posted image

soli

BeitragSa, Nov 26, 2005 6:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hoffe das hilft dir weiter.
H/A hab ich noch nicht ausführlich getestet,
dürfte aber so in etwa hinkommen.

Code: [AUSKLAPPEN]

; spielplan erstellen
;
; soli - andsa @ web.de
;


;vari
anzahlmannschaften=18


spielplan(anzahlmannschaften)

Function spielplan(anzahlmannschaften)

;für weniger mannschaften nicht notwendig
If anzahlmannschaften<4 Then Return;



   If anzahlmannschaften Mod 2=0
      modus$="gerade"
      spieltage=anzahlmannschaften-1
   Else
      modus$="ungerade"
      spieltage=anzahlmannschaften
   EndIf
   

   For x=1 To spieltage
   
      Cls
      Locate 0,0
      
      Print x + ".Spieltag"
      
      If modus$="gerade"
      
         paarungen=anzahlmannschaften/2
                  
         ;reihum - mannschaftA-rechtsherum - mannschaftB-linkssherum
         
         For y=1 To paarungen
                  
            mannschaftA= (x+1 + y-3) Mod (anzahlmannschaften-1) + 1
            mannschaftB= (anzahlmannschaften + x - y-1 )   Mod (anzahlmannschaften-1) + 1
            
            ;mannschaft des spieltages spielt immer gegen die letzte mannschaft
            If mannschaftA=x
               mannschaftB=anzahlmannschaften
            EndIf
            
      
            ;gerader spieltag - paarungen drehen wegen Heim/Auswärts
            If x Mod 2 = 0
               tmp=mannschaftA
               mannschaftA=mannschaftB
               mannschaftB=tmp
            EndIf
            
            
            Print mannschaftA + " : " + mannschaftB
                     
         Next
         
      EndIf
      
   ;Stop   
      If modus$="ungerade"
      
         paarungen=Int(anzahlmannschaften/2)
         
         ; mannschaft identisch mit spieltag ist spielfrei
         Print "Spielfrei:" + x
         
         For y=1 To paarungen

            mannschaftA= (x+1 + y-2) Mod (anzahlmannschaften) + 1
            mannschaftB= (anzahlmannschaften + x - y -1  )   Mod (anzahlmannschaften) + 1
   
            ;gerader spieltag - paarungen drehen wegen Heim/Auswärts
            If x Mod 2 = 0            
               tmp=mannschaftA
               mannschaftA=mannschaftB
               mannschaftB=tmp
            EndIf
            
            
            Print mannschaftA + " : " + mannschaftB
                                       
         Next
         
      EndIf
      
      WaitKey()
   
   Next
   
 End Function
solitaire
 

Muck

BeitragDi, Nov 29, 2005 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hab mir das jetzt mal angeschaut und deine Formel klappt tatsächlich! Genau sowas wollte ich haben, danke Smile
H/A sind auch meistens im Wechsel, nur zweimal kommt es vor, dass zwei H- oder A-Spiele hinternander sind. Das ist aber nicht schlimm, gibt's in echt auch.

Damit haste dir nen Eintrag in den Credits verdient... Wink

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group