AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Skatblatt darstellen durch Random?

Offene Frage von "Lotus"
Ein Thema von Lotus · begonnen am 9. Nov 2009 · letzter Beitrag vom 11. Nov 2009
Antwort Antwort
Seite 2 von 3     12 3      
Lotus

Registriert seit: 26. Feb 2007
85 Beiträge
 
Delphi 7 Personal
 
#11

Re: Skatblatt darstellen durch Random?

  Alt 10. Nov 2009, 17:45
wuerde allerdings nicht die problematik lösen, das jede zahl nur 4x vorhanden sein darf
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Skatblatt darstellen durch Random?

  Alt 10. Nov 2009, 17:48
Mit dem erwähnten MOD aber schon (hatte da einen Denkfehler).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Lotus

Registriert seit: 26. Feb 2007
85 Beiträge
 
Delphi 7 Personal
 
#13

Re: Skatblatt darstellen durch Random?

  Alt 10. Nov 2009, 18:01
inwiefern? das müssteste mir genauer erklaeren
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#14

Re: Skatblatt darstellen durch Random?

  Alt 10. Nov 2009, 18:06
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Skatblatt darstellen durch Random?

  Alt 10. Nov 2009, 18:23
Hier ein (nicht optimiertes) Beispiel (Formular enthält eine Listbox und einen Button, mehr nicht):
Delphi-Quellcode:
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.
[edit] Da muss natürlich noch ein Randomize ins OnCreate, hab ich vergessen. [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Lotus

Registriert seit: 26. Feb 2007
85 Beiträge
 
Delphi 7 Personal
 
#16

Re: Skatblatt darstellen durch Random?

  Alt 11. Nov 2009, 12:45
was meinst du denn mit nicht optimiert? was wäre denn optimiert?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#17

Re: Skatblatt darstellen durch Random?

  Alt 11. Nov 2009, 13:23
Delphi-Quellcode:
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;
Schneller geht es nur, wenn man das SET z.B. gegen ein Boolean-Array ersetzt,
aber vom Speicher her, ist dieses das Optimalste, was geht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Skatblatt darstellen durch Random?

  Alt 11. Nov 2009, 13:31
Zitat von Lotus:
was meinst du denn mit nicht optimiert? was wäre denn optimiert?
Es an dein restliches Programm anzupassen. Da kann man dann genau überlgen, wie man die Klassen strukturiert und wie die Schnittstellen aussehen.

Edit: @himi, wir arbeiten doch heute alles objektorientiert. Dein Bitgeschiebe war vor 20 Jahren In.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#19

Re: Skatblatt darstellen durch Random?

  Alt 11. Nov 2009, 13:32
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Lotus

Registriert seit: 26. Feb 2007
85 Beiträge
 
Delphi 7 Personal
 
#20

Re: Skatblatt darstellen durch Random?

  Alt 11. Nov 2009, 13:37
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 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