Re: Skatblatt darstellen durch Random?
wuerde allerdings nicht die problematik lösen, das jede zahl nur 4x vorhanden sein darf
|
Re: Skatblatt darstellen durch Random?
Mit dem erwähnten MOD aber schon (hatte da einen Denkfehler).
|
Re: Skatblatt darstellen durch Random?
inwiefern? das müssteste mir genauer erklaeren
|
Re: Skatblatt darstellen durch Random?
man kann auch das Boolean-Array performant machen und sogar so lösen, daß kein Zug wiederholt werden muß und dieses teilweise sogar performanter, als mit einer rießigen Liste.
das Ziehen: - man zähle alle "freien" Karten (a) - x = Random(a) - nun nehme man einfach die x-te freie Karte davon - und vergesse nicht sie zu markieren |
Re: Skatblatt darstellen durch Random?
Hier ein (nicht optimiertes) Beispiel (Formular enthält eine Listbox und einen Button, mehr nicht):
Delphi-Quellcode:
[edit] Da muss natürlich noch ein Randomize ins OnCreate, hab ich vergessen. [/edit]
unit uKarten;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Contnrs; const MAXINDEX = 31; type TKartenIndex = 0..MAXINDEX; TKarte = class private FIndex: TKartenIndex; function GetName: string; public constructor Create(Index: TKartenIndex); property Name: string read GetName; end; TFrmKarten = class(TForm) ListBoxBlatt: TListBox; ButtonMischen: TButton; procedure ButtonMischenClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var FrmKarten: TFrmKarten; implementation {$R *.dfm} { TKarte } constructor TKarte.Create(Index: TKartenIndex); begin inherited Create; FIndex := Index; end; function TKarte.GetName: string; const Farben: array[0..3] of string = ('Karo', 'Herz', 'Pik', 'Kreuz'); Werte: array[0..7] of string = ('7','8','9','10','Bube','Dame','König','As'); begin Result := Format('%s %s',[Farben[FIndex div 8],Werte[FIndex mod 8]]); end; procedure TFrmKarten.ButtonMischenClick(Sender: TObject); var Buch, Blatt: TObjectList; Karte: TKarte; i: integer; begin Buch := TObjectList.Create(false); try for i := 0 to MAXINDEX do begin Karte := TKarte.Create(i); Buch.Add(Karte); end; Blatt := TObjectList.Create; try repeat i := Random(Buch.Count); Blatt.Add(Buch[i]); Buch.Delete(i); until Buch.Count < 1; for i := 0 to Blatt.Count - 1 do ListBoxBlatt.Items.Add(TKarte(Blatt[i]).Name); finally Blatt.Free; end; finally Buch.Free; end; end; end. |
Re: Skatblatt darstellen durch Random?
was meinst du denn mit nicht optimiert? was wäre denn optimiert?
|
Re: Skatblatt darstellen durch Random?
Delphi-Quellcode:
Schneller geht es nur, wenn man das SET z.B. gegen ein Boolean-Array ersetzt,
Type
TSkatKarte = ( skKaro7, skKaro8, skKaro9, skKaro10, skKaroBube, skKaroDame, skKaroKoenig, skKaroAs, skHerz7, skHerz8, skHerz9, skHerz10, skHerzBube, skHerzDame, skHerzKoenig, skrzAs, skPik7, skPik8, skPik9, skPik10, skPikBube, skPikDame, skPikKoenig, skPikAs, skKreuz7, skKreuz8, skKreuz9, skKreuz10, skKreuzBube, skKreuzDame, skKreuzKoenig, skKreuzAs); TSkatBlatt = Set of TSkatKarte; TSkatFarbe = (sfKaro, sfHerz, sfPik, sfKreuz); TSkatWert = (sw7, sw8, sw9, sw10, swBube, swDame, swKoenig, swAs); Const sbVollesBlatt = [skKaro7..skKreuzAs]; ssFarbe: Array[TSkatFarbe] of String = ('Karo', 'Herz', 'Pik', 'Kreuz'); ssWert: Array[TSkatWert] of String = ('7', '8', '9', '10', 'Bube', 'Dame', 'Koenig', 'As'); Function Skat_Ziehe(Var Blatt: TSkatBlatt): TSkatKarte; Var K: TSkatKarte; i: Integer; Begin If Blatt = [] Then Raise Exception.Create('keine Karten vorhanden'); i := 0; For K := skKaro7 to skKreuzAs do If K in Blatt Then Inc(i); i := Random(i); Result := TSkatKarte(-1); Repeat Inc(Result); While not (Result in Blatt) do Inc(Result); Dec(i); Until i < 0; Exclude(Blatt, Result); End; Function Skat_Farbe(Karte: TSkatKarte): TSkatFarbe; Begin Result := TSkatFarbe(Ord(Karte) div 8); End; Function Skat_Wert(Karte: TSkatKarte): TSkatWert; Begin Result := TSkatWert(Ord(Karte) mod 8); End; Function Skat_String(Karte: TSkatKarte): String; Begin Result := ssFarbe[Skat_Farbe(Karte)] + ' ' + ssWert[Skat_Wert(Karte)]; End; Procedure TForm1.FormCreate(Sender: TObject); Var i: Integer; Blatt: TSkatBlatt; Karte: TSkatKarte; Begin Randomize; Blatt := sbVollesBlatt; For i := 1 to 4 do Begin Karte := Skat_Ziehe(Blatt); Memo1.Lines.Add(Skat_String(Karte)); End; End; aber vom Speicher her, ist dieses das Optimalste, was geht. |
Re: Skatblatt darstellen durch Random?
Zitat:
Edit: @himi, wir arbeiten doch heute alles objektorientiert. Dein Bitgeschiebe war vor 20 Jahren In. :zwinker: |
Re: Skatblatt darstellen durch Random?
ach ja, auf das aktuelle Problem zurückgebaut, kommt z.B. sowas bei raus:
Delphi-Quellcode:
Type TBlatt = Set of 0..31;
Const cKarte: Array[0..7] of String = ('7', '8', '9', '10', 'Bube', 'Dame', 'Koenig', 'As'); Function Ziehe(Var Blatt: TBlatt): Integer; Var i, i2: Integer; Begin If Blatt = [] Then Raise Exception.Create('keine Karten vorhanden'); i := 0; For i2 := 0 to 31 do If i2 in Blatt Then Inc(i); i := Random(i); i2 := -1; Repeat Inc(i2); While not (i2 in Blatt) do Inc(i2); Dec(i); Until i < 0; Exclude(Blatt, i2); Result := i2 div 4; End; Procedure TForm1.FormCreate(Sender: TObject); Var i, i2: Integer; Blatt: TBlatt; Begin Randomize; Blatt := [0..31]; For i := 1 to 32 do Begin i2 := Ziehe(Blatt); Memo1.Lines.Add(cKarte[i2]); End; End; |
Re: Skatblatt darstellen durch Random?
ah gut.. ich werd mir das ganze in ruhe anschauen und durchgehen, evtl komm ich später nochmal drauf zurück falls fragen auftreten :)
erstmal vielen vielen dank für eure hilfe, denke ddas ich damit was anfangen kann |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 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