![]() |
Spielplan erzeugen?
Ich bin dabei einen eigenen kleinen Fussball-Manager zu erzeugen und bin beim Erzeugen eines Spielplans auf Probleme gestoßen. Bisher bin ich so weit:
Delphi-Quellcode:
Im Moment kommt es vor, dass einige Partien doppelt vorkommen, da ich bei weitem nicht alle Bedingungen drinne habe. Hat jemand eine Idee wie man das ganze vereinfachen könnte (auch für eine größere Zahl von Spielen) oder bleibt mir nichts anderes überig als alle Bedingungen für jeden einzelnen Spieltag einzufügen?
for k:=1 to 6 do
begin case k of 1,3,5: begin partie[k].id:=k; x:=random(4)+1; partie[k].heim:=teams[x]; y:=random(4)+1; partie[k].auswaerts:=teams[y]; if (x=y) or (y=partie[k-2].auswaerts.id) or (y=partie[k-2].heim.id) then begin repeat y:=random(4)+1; until (x<>y) and (y<>partie[k-1].heim.id) and (y<>partie[k-1].auswaerts.id); end; partie[k].auswaerts:=teams[y]; end; 2,4,6: begin partie[k].id:=k; repeat x:=random(4)+1; until (x<>partie[k-1].heim.id) and (x<>partie[k-1].auswaerts.id); partie[k].heim:=teams[x]; repeat y:=random(4)+1; until (y<>x) and (y<>partie[k-1].heim.id) and (y<>partie[k-1].auswaerts.id); partie[k].auswaerts:=teams[y]; end; end; |
Re: Spielplan erzeugen?
sag mal, kannst du das selbst lesen? Keine Kommentare, sehr individuelle und kreative Einrückung :)
Nach welchen Regeln werden denn die Spiele zusammengesetzt? |
Re: Spielplan erzeugen?
Zitat:
Edit: Manchmal kommt ein roter Kasten, obwohl keine neuen Beiträge vorhanden sind; manchmal kommt keiner, obwohl welche vorhanden sind. Sehr mysteriös. |
Re: Spielplan erzeugen?
Danke für die Anmerkung. Ich hab das programmieren in der Schule gelernt und da die ersten Programme nicht wirklich lang und unübersichtlich sind, ist das Einrücken an mir vorbei gegangen.
Ich hab mir noch ein paar Gedanken gemacht und das auch ganz gut hinbekommen:
Delphi-Quellcode:
Das ganze klappt ganz gut, nur die repeat-Schleife wird nicht wiederholt obwohl gleich=true ist.
for k := 1 to 12 do
begin repeat gleich := false; x := random(4) + 1; partie[k].heim := teams[x]; //Mannschaft x wird ausgelost while (y = 0) or (y = x) do begin y := random(4) + 1; partie[k].auswaerts := teams[y]; //Mannschaft y wird ausgelost end; partiek[k] := strtoint(inttostr(x) + inttostr(y)); //die partie erhält den wert xy while (i < k) and (gleich = false) do begin if (partiek[k]) = (partiek[i]) // es wird geprüft ob xy bereits vorhanden ist then begin gleich := true; end else gleich := false; i := i + 1; y := 0; end; until gleich = false; m_spielplan.lines.add((partie[k].heim.name) + ('-') + (partie[k].auswaerts.name)); end; |
Re: Spielplan erzeugen?
Hallo,
löblich, dass Du Dir nochmals Gedanken gemacht hast; leider ist das Resultat nicht besser geworden. Kommentiere Deinen Code doch mal. Woher soll jemand ausser Dir wissen, was 'partie' und 'teams' sind? Desweiteren:
Delphi-Quellcode:
vor einem 'else' schreibt man kein ';' nicht - nein.
then gleich:=true;
else gleich:=false; Und besorg Dir einen CodeFormatter (bspw. 'DelForExp') |
Re: Spielplan erzeugen?
Habs mal geändert.
partiek ist ein array der alle bisher erstellten partien enthält. partie ist die neu erstellte partie |
Re: Spielplan erzeugen?
Ich hab mir den Code mal angesehen und analysiert. Kann sein, dass ich manche Sachen falsch eingeschätzt habe, weil ich das ganze nur mal im Kopf durchgespielt habe. Hinzu kommt noch, dass ich nicht weiß, was partiek ist. Und von Spielplänen hab ich keine Ahnung -.-'
Trotzdem hab ich dir ein paar Kommentare in den Source geschrieben und an manchen Stellen etwas gekürzt. Vielleicht hilft dir das ja, den Fehler zu finden.
Delphi-Quellcode:
for k := 1 to 12 do
begin repeat // gleich wird initialisiert: das ist wichtig, hast du allerdings bei einigen // variablen vergessen, was zu fatalen folgen führen kann gleich := false; // Zufällige Mannschaft ermitteln x := random(4)+1; // In aktuelle Partie Heimmannschaft eintragen partie[k].heim := teams[x]; // -> y muss entweder 0 sein oder die Zufallszahlx, also die Heimmannschaft. // Das hieße, die Auswärtsmannschaft muss entweder die Manschaft mit Index 0 // oder die Heimmannschaft sein // Macht das Sinn?! o_O while (y=0) or (y=x) do // Achtung, y ist nicht initialisiert! begin y := random(4)+1; // Hier wird die Zufallszahl ermittelt, die eh nur // 0 oder x sein darf! partie[k].auswaerts := teams[y]; // Wert wird eingetragen: das sollte man // lieber nach der Schleife machen end; // Hier werden die beiden Zahlen x und y aneinandergefügt, jedoch nicht addiert // Soll das so sein?? partiek[k] := strtoint(inttostr(x)+inttostr(y)); // Solange i kleiner ist als der Index der aktuellen Partie UND // partiek[k] nicht das gleiche ist wie partiek[i] // Frage: was ist partiek? // ACHTUNG: i ist nicht initialisiert // Es kann sehr gut sein, dass diese schleife NIE durchlaufen wird! while (i<k) and (not gleich) do begin gleich := (partiek[k]) = (partiek[i]); // hab das mal gekürzt inc(i); end; until not gleich; // bin mir nicht sicher, ob dieser Vergleich Sinn macht... // Du prüfst hier im Endeffekt, ob das item partiek[k] // sich von pariek[i] unterscheidet. end; |
Re: Spielplan erzeugen?
Zitat:
Auf der anderen Seite denke ich aber: Wenn ich demnächst mal wieder so schrecklich faul bin, kann ich Dir dann auch meine Sourcen geben, damit Du sie kommentierst? Dem gipfelstürmer sollte erstmal klar gemacht werden, wie man in einem Forum ordentlich seine Fragen formuliert, so dass diejenigen, die ihm helfen möchten, auch etwas mit seiner Fragestellung anfangen können. Ansonsten haben wir einen zweiten Takkitukki (Ähnlichkeiten mit bekannten Personen sind absolut zufällig). |
Re: Spielplan erzeugen?
Die Variablen sind an anderer Stelle initialisiert.
partiek ist ein array of integer der die bisher erstellen Partien in der Form xy (bewusst xy und nicht x+y). zur 1.while-Schleife: Die Bedingungen regeln doch, dass die Schleife ausgeführt wird wenn y=x oder y=0 um diese Fälle zu verhindern. Die repeat-Schleife soll solange durchlaufen werden (also x und y werte erzeugen) bis eine Partie ensteht die noch nicht vorhanden ist, daher der Vergleich. |
Re: Spielplan erzeugen?
Ich hab die Lösung gefunden und bin ein wenig schockiert von der Einfachheit der Lösung. Zu Beginn der Repeat-Schleife muss das i natürlich auf 1 zurück gesetzt werden.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz