Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Spielplan erzeugen? (https://www.delphipraxis.net/99934-spielplan-erzeugen.html)

gipfelstürmer 19. Sep 2007 18:56


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:
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;
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?

Nikolas 19. Sep 2007 18:59

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?

s-off 19. Sep 2007 19:00

Re: Spielplan erzeugen?
 
Zitat:

Zitat von gipfelstürmer
Hat jemand eine Idee wie man das ganze vereinfachen könnte

Ich zumindest nicht, da ich keine Lust habe, Deinen Code zu entschlüsseln...

Edit: Manchmal kommt ein roter Kasten, obwohl keine neuen Beiträge vorhanden sind; manchmal kommt keiner, obwohl welche vorhanden sind. Sehr mysteriös.

gipfelstürmer 20. Sep 2007 19:44

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:
  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;
Das ganze klappt ganz gut, nur die repeat-Schleife wird nicht wiederholt obwohl gleich=true ist.

s-off 20. Sep 2007 19:56

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:
    then gleich:=true;
       else gleich:=false;
vor einem 'else' schreibt man kein ';' nicht - nein.

Und besorg Dir einen CodeFormatter (bspw. 'DelForExp')

gipfelstürmer 20. Sep 2007 20:11

Re: Spielplan erzeugen?
 
Habs mal geändert.

partiek ist ein array der alle bisher erstellten partien enthält.
partie ist die neu erstellte partie

Namenloser 20. Sep 2007 20:34

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;

s-off 20. Sep 2007 20:39

Re: Spielplan erzeugen?
 
Zitat:

Zitat von NamenLozer
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.

Einerseits löblich von Dir, dass Du Dir so viel Mühe gibst.

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).

gipfelstürmer 21. Sep 2007 14:39

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.

gipfelstürmer 21. Sep 2007 17:44

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