Einzelnen Beitrag anzeigen

ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Zahl sollte nich im Set1 und im Set2 sein ist aber in Set2

  Alt 16. Nov 2008, 15:43
Erstmal Hi
Ich bin dabei mir ein kleines Programm zu schreiben welches aus einer ListBox mit Namen zufällig 2, 4 oder 6 Namen auswählt.
Wenn die Funktion das 2. mal aufgerufen wird sollten die letzten Namen nich wieder auftauchen.

Der Code sieht nun so aus:
Delphi-Quellcode:
procedure TForm1.cmdGetPlayersClick(Sender: TObject);
 type
  TPlayersResult = set of 1..255; //Set für den neuen Durchgang
  TPlayersLastResult = set of 1..255; //Set für den vorherigen Druchgang
  //Zufallszahlen generation Count= druchläufe der Schleife; MaxValue= MaxVal für Rnd; TPlayersResult= Set mit den Zahlen
function Players(ACount : Byte; AMaxValue : Byte) : TPlayersResult;
var
  i: Byte;
  number: Byte;
  LastResult : TPlayersLastResult; //Init der Variablen
begin
  if ACount > AMaxValue then //Ist die Anzahl der durchläufe größer als der Maximale Wert für Rnd?
    raise EInvalidOp.Create('Man kann nicht mehr Namen aus der Liste ziehen, als vorhanden!');

  Result := []; //Set leeren
  for i := 1 to ACount do // Starten der Schleife
  begin
    repeat
      number := Random(aMaxValue); //Generieren der Zahlen
    until not(number in Result) AND not(number in LastResult); //Vergleich der Zahlen ob schon im Set; 2. Vergleich geht nicht?O.o
    Include(Result, number); //Zahl einfügen in das Set
  end;
end;


var
max : Integer;
PlayersResult: TPlayersResult;
PlayersLastResult : TPlayersLastResult;
i: Byte; //Init der Variablen
begin
max := ListBox1.Items.Count; //max = MaxValue der Zufallfunktion

     if valAnzahl2.Checked = true then begin //Funktionsaufruf für die zufalls wahl von 2Spielern
        PlayersResult := Players(2, max); //Funktion Players(Spieler, MaxAnzahlSpieler)
        Memo1.Lines.Clear; //Memo für die Ergebnisanzeige leeren
        for i := 0 to max do //Schleife zum Übertragen der Namen
            begin
             if i in PlayersResult then //Auslesen des Strings
             Memo1.Lines.Add(ListBox1.Items.Strings[i]); //Namen von der ListBox ins Memo
             PlayersLastResult := []; //Set mit dem letzten ergebnis leeren
             PlayersLastResult := PlayersResult; //Aktuelles Ergebnis wird zu letztem Ergebnis
        end;
     end
     else if valAnzahl4.Checked = true then begin //Das ganze für 4 Spieler
         PlayersResult := Players(4, max);
         Memo1.Lines.Clear;
        for i := 0 to max do
            begin
             if i in PlayersResult then
             Memo1.Lines.Add(ListBox1.Items.Strings[i]);
             PlayersLastResult := [];
             PlayersLastResult := PlayersResult;
            end;
     end
     else if valAnzahl6.Checked = true then begin //Das ganze für 6 Spieler
         PlayersResult := Players(6, max);
         Memo1.Lines.Clear;
        for i := 0 to max do
            begin
             if i in PlayersResult then
             Memo1.Lines.Add(ListBox1.Items.Strings[i]);
             PlayersLastResult := [];
             PlayersLastResult := PlayersResult;
            end;
      end
end;
Aber leider tauchen die Namen vom letzten mal nach dem neuen Klick wieder auf.
Irgendwie erkenn ich den Fehler nicht

Weiß wer von euch Hilfe?
Markus
  Mit Zitat antworten Zitat