Autor Beitrag
-delphin-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: So 18.09.05 22:46 
Hallo, ich habe einen Spielplan programmiert, funktioniert auch soweit, jetzt würde ich nur gerne an den Feinheiten arbeiten. So soll eine Mannschaft oder ein Spieler nicht 2 Spiele nacheinander haben, d.h. wenn in der letzten Zeile im Memo die Variable x oder y (die beide zufällig ausgewählt werden) schon stehen, sollen x und y neue Zufallszahlen werden.
Mein Ansatz sieht bisher so aus: (MSpielplan.Lines[MSpielplan.Lines.Count-1]<>IntToStr(x)), aber das funktioniert nicht, da ich ja nicht den ganzen Text abfragen kann, der lautet allgemein: Spielerx gegen Spielery.
Thx 4 help :D
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 18.09.05 22:53 
Moin!

Du solltest deinen Spielplan in einer internen, "computerlesbaren" Struktur ablegen und nur eine Art "Visualisierung" ins Memo schreiben, also keine Daten, die du weiter auswerten willst.

Genaueres, wenn du mal etwas Quelltext zeigst. :wink:

cu
Narses
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: So 18.09.05 22:58 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);
var x, y: integer;
begin
  randomize;
  repeat
    x := random(rows-1)+1;
    y := random(rows-1)+1;
    If (StringGrid1.Cells[x,y]='') then
    begin
      StringGrid1.Cells[x,y]:='Gespielt!';
      MSpielplan.Lines.Add('Spieler'+IntToStr(x)+' gegen '+'Spieler'+IntToStr(y));
    end;
  until
    MSpielplan.Lines.Count=(StringGrid1.Colcount-1) * (StringGrid1.Rowcount-1) - (StringGrid1.Rowcount-1);
  showmessage('Es gibt '+IntToStr(MSpielplan.Lines.Count)+' Partien');
end;

Das ist meine Prozedur. Das Programm arbeitet so, dass ich ein StringGrid habe, wo alle Spieler doppelt aufgetragen sind und in jedem Kästchen, dessen Zufallszahlen x und y als Koordinaten ausgewählt worden sind, das Wort 'Gespielt!' eingetragen wird. Zudem verschafft mir ein Memo Übersicht über die Reihenfolge, in der gespielt wurde.
Edit: Natürlich ist es nicht günstig, meine Memodaten weiter zu verwerten, denn es "schreibt ja nur mit", praktisch gedacht. Aber ich kann ja schlecht abfragen, wo im StringGrid die letzte Veränderung stattgefunden hat und ihm dessen Koordinaten entnehmen und mehr verändert sich im Programm nicht, d.h. ich hab ja nur die zwei Ausgabeelemente
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 18.09.05 23:48 
Moin!

Wenn ich das richtig sehe, brauchst du dir bei deinem Ansatz doch nur in der Schleife zu merken, was du als letztes "gewürfelt" hast:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.Button1Click(Sender: TObject);  
  var
    x, y: Integer;  
    LastXY: Set of Byte;
begin  
  Randomize; // --> das sollte ins FormCreate()!
  LastXY := []; // nix ausgewählt
  repeat  
    x := Random(rows-1)+1;  
    y := Random(rows-1)+1;  
    if ( (StringGrid1.Cells[x,y] = '') // noch nicht gespielt
        and
         (NOT (x in LastXY)) and (NOT (y in LastXY)) // keine Mannschaften aus der letzten Auswahl
       ) then begin  
      StringGrid1.Cells[x,y] := 'Gespielt!';  
      MSpielplan.Lines.Add('Spieler'+IntToStr(x)+' gegen '+'Spieler'+IntToStr(y));  
      LastXY := [x,y];
    end;  
  until ( MSpielplan.Lines.Count
         =
          (StringGrid1.Colcount-1) * (StringGrid1.Rowcount-1) - (StringGrid1.Rowcount-1) );
  ShowMessage('Es gibt '+IntToStr(MSpielplan.Lines.Count)+' Partien');  
end;

Ungestetet, sollte aber laufen; Einschränkung: 0 <= x,y < 256 (wg. dem Set-Ansatz), heißt: es können max. 255 Mannschaften teilnehmen... :wink:

cu
Narses
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mo 19.09.05 09:53 
Scheint zu funktionieren.. Allerdings geht der Code erst ab 7 Spielern (42 Spielen). Sonst zickt er kurz vor dem Ende rum, weil er ja zwei Begrenzungen drin hat: Kein Spiel doppelt und keiner 2mal hintereinander. Bei bis zu 6 Spielern lässt sich das anscheinend jedoch nicht vermeiden.
Und die Zeile nach dem Until funktioniert nicht, wenn das '=' in einer einzelnen Zeile steht, warum auch immer
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 19.09.05 10:05 
Moin!

Ehrlichgesagt würde ich dir einen anderen Ansatz nahe legen wollen: :wink:
- Mach eine Stringliste auf, in die du die Namen der Teams/Spieler packst.
- Erzeuge alle relevanten (2 aus X)-Tupel (2er-Permutationen) und lege sie z.B. einer TList als Pointer ab (oberes Wort 1. Teamindex, unteres Wort 2.; 65536 Teams sollten reichen... :wink:) Geht gut und einfach mit zwei geschachtelten Schleifen
- Die Liste mischt du jetzt solange, bis es dir "passt" (Ansatz: Schleife von 0 bis Count-1 und im Körper eine Zufallszahl von 0 bis Count-1, dahin den Aktuellen per .Move verschieben, dann ist die Liste "durchgeschüttelt")
- Zur Ausgabe gehst du die Liste durch und leitest die Indices wieder aus dem Pointer ab (Worte aufspalten), dann kannste die als Index in die Namens-Stringliste nehmen und die Paare in z.B. ein Memo reinschreiben.

Dieser Ansatz hätte eine deterministische Richtung und enthält nicht diese "unseelige" Zufallsschleifenkonstruktion, die "bis es passt" läuft...

cu
Narses
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mo 19.09.05 10:20 
joa wenn man bei meinem ansatz 10000 teams hat läuft er schon mal ne ganze n8 :D is von mitternacht bis vorhin um 10 nich fertig geworden oO ne, aber geht schon so, ich bin zufrieden ;D