Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Mischalgorithmus Fehler (https://www.delphipraxis.net/159409-mischalgorithmus-fehler.html)

Matze1848 26. Mär 2011 19:26

Mischalgorithmus Fehler
 
ich hab mir das mit der liste zu herzen genommen und erstmal (ohne skat oder so) ein mischalgorithmus erstellt, der in ein Memofeld schreibt.

procedure TForm1.Button1Click(Sender: TObject);
var Karten: Integer;
Ausgabe: String;
x : Integer;
Liste1: TStringList;
begin
Memo1.Lines.Clear;
Randomize;
for x:= 1 to 32 do
begin
Karten:=Random(32)+1;
Liste1:=TStringList.Create;

if Karten=1 then
begin
Ausgabe:='Kreuz Bube';
Liste1.insert(1,'1');
end

[...]

else if Karten=32 then
begin
Ausgabe:='Karo 7';
Liste1.insert(32,'32');
end;

Memo1.Lines.Add(Ausgabe);
end;
Liste1.Free;
end;




Ich krieg jetzt aber leider, nachdem ich das Programm kompiliert habe den Fehler
'List index out of bounds(irgendeine random zahl)'.
Woran kann das liegen, wie kann ich das beheben?

Und noch eine Frage. Mit dem Mischen, werden da ja doppelte angezeigt, also zb. Herz10 doppelt und karoKönig 4mal. Wie behebe ich das, sodass jede nur einmal vorhanden ist?

omata 26. Mär 2011 23:44

AW: Mischalgorithmus Fehler
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
type
  TKarten = (
    Herz_7, Herz_8, Herz_9, Herz_10, Herz_Bube, Herz_Dame, Herz_Koenig, Herz_Ass,
    Karo_7, Karo_8, Karo_9, Karo_10, Karo_Bube, Karo_Dame, Karo_Koenig, Karo_Ass,
    Pik_7, Pik_8, Pik_9, Pik_10, Pik_Bube, Pik_Dame, Pik_Koenig, Pik_Ass,
    Kreuz_7, Kreuz_8, Kreuz_9, Kreuz_10, Kreuz_Bube, Kreuz_Dame, Kreuz_Koenig, Kreuz_Ass
  );
const
  cKarten:array[TKarten] of string = (
    'Herz 7', 'Herz 8', 'Herz 9', 'Herz 10', 'Herz Bube', 'Herz Dame', 'Herz König', 'Herz Ass',
    'Karo 7', 'Karo 8', 'Karo 9', 'Karo 10', 'Karo Bube', 'Karo Dame', 'Karo König', 'Karo Ass',
    'Pik 7', 'Pik 8', 'Pik 9', 'Pik 10', 'Pik_Bube', 'Pik Dame', 'Pik König', 'Pik Ass',
    'Kreuz 7', 'Kreuz 8', 'Kreuz 9', 'Kreuz 10', 'Kreuz Bube', 'Kreuz Dame', 'Kreuz König', 'Kreuz_Ass'
  );
var KartenIndex: Integer;
    Karten: TStringList;
    Karte:TKarten;
begin
  Memo1.Lines.BeginUpdate;
  Karten:=TStringList.Create;
  try
    Memo1.Lines.Clear;
    for Karte:=low(TKarten) to high(TKarten) do
      Karten.Append(cKarten[Karte]);

    while Karten.Count > 0 do begin
      KartenIndex:=Random(Karten.Count);
      Memo1.Lines.Append(Karten[KartenIndex]);
      Karten.Delete(KartenIndex);
    end;
  finally
    Karten.Free;
    Memo1.Lines.EndUpdate;
  end;
end;

Matze1848 27. Mär 2011 08:41

AW: Mischalgorithmus Fehler
 
Boah, danke, das funktioniert so gut.. :D

Mit dem Count-Befehl kann ich dann auch machen, dass die Karten in verschiedene memos eingeteilt werden (Karten austeilen)?

Sir Rufo 27. Mär 2011 08:57

AW: Mischalgorithmus Fehler
 
Der Fairnes halber sollte man aber sagen, dass mit dieser Vorgehensweise das Mischen und Anzeigen sehr gut funktioniert.

Weiter gedacht (Skat Regeln, Zählen, vergleichen) wird das Handling aber immer komplizierter und wird in einer If-Orgie enden mit String-Vergleichen.

Besser wäre hier ein OOP Ansatz.

DeddyH 27. Mär 2011 10:26

AW: Mischalgorithmus Fehler
 
Sehe ich auch so. Hier einmal ein Ansatz (im Editor heruntergetippt, daher komplett ungetestet):
Delphi-Quellcode:
type
  TFarbe = (Karo, Herz, Pik, Kreuz);
  TWert = (Sieben, Acht, Neun, Zehn, Bube, Dame, Koenig, Ass);
 
  TKarte = class
  private
    FFarbe: TFarbe;
    FWert: TWert;
    function GetDisplayname: string;
  public
    constructor Create(AFarbe: TFarbe; AWert: TWert);
    property Farbe: TFarbe read FFarbe;
    property Wert: TWert read FWert;
    property Displayname: string read GetDisplayname;
  end;
 
const
  Farben: array[TFarbe] of string = ('Karo', 'Herz', 'Pik', 'Kreuz');
  Werte: array[TWert] of string = ('7', '8', '9', '10', 'Bube', 'Dame', 'König', 'As');
 
function TKarte.GetDisplayname: string;
begin
  Result := Format('%s %s', [Farben[FFarbe], Werte[FWert]]);
end;

constructor TKarte.Create(AFarbe: TFarbe; AWert: TWert);
begin
  inherited Create;
  FFarbe := AFarbe;
  FWert := AWert;
end;

Matze1848 27. Mär 2011 10:57

AW: Mischalgorithmus Fehler
 
Danke für die schnellen Antworten. Ich versteh nur nicht ganz wo ich diesen Quelltext einfügen soll und inwiefern sich eine procedure darauf bezieht. Ich krieg andauernd einen Fehler, class könnte hier nicht deklariert werden und/oder = solle da stehen und wrong declaration..

DeddyH 27. Mär 2011 12:36

AW: Mischalgorithmus Fehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal eine kleine Demo erstellt, ich hoffe, das hilft Dir weiter. Erweitern musst Du sie allerdings selbst ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz