Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mischen Funktion (https://www.delphipraxis.net/29915-mischen-funktion.html)

testzugang 16. Sep 2004 16:15


Mischen Funktion
 
HI,

ich bin gerade dabei ein memory zu schreiben und eigentlich läuft es auch perfekt, bis auf das kleine Problem. Ich lade meine Bilder so:

Delphi-Quellcode:
begin
   x:=0; y:=10;
   For i:=1 to IconZahl DO begin
     NextPos(x,y);
     IcoName:= 'Icon'+IntToStr(i);
     TKarte.Create(Self,x,y,IcoName);
   end;

For i:=IconZahl downto 1 DO begin
     NextPos(x,y);
     IcoName:= 'Icon'+IntToStr(i);
     TKarte.Create(Self,x,y,IcoName);
     Brueckseite.Click;
   end;
Also einmal meine 30 Icons rauf und einmal wieder runter. Ist ja ganz lustig, aber jetzt möchte ich eine "mischen" Funktion einbauen. Hat jmd. eine Hilfestellung evtl. mit Code für mich?

mfg

Matze 16. Sep 2004 16:27

Re: Mischen Funktion
 
:hi:

Du könntest die Kartennummern in einem Array durcheinander verteilen und dann in der for-Schleife die Nummern aus dem Array lesen.

testzugang 16. Sep 2004 16:31

Re: Mischen Funktion
 
Zitat:

Zitat von Matze
:hi:

Du könntest die Kartennummern in einem Array durcheinander verteilen und dann in der for-Schleife die Nummern aus dem Array lesen.

Ich hab nur null Ahnung von Array(s). Ich habe mich gestern abend mal eingelesen, aber ich bekomme es definitv nicht hin. :wall:

Hast du ein bisschen Code für mich übrig ;-) ?

MfG

Anthauri 16. Sep 2004 16:39

Re: Mischen Funktion
 
Hi!

Auf den ersten Blick erscheint die "Random" Funktion die richtige Wahl, die eine Ganzzahl zurückgibt.

Delphi-Quellcode:
 Ergebnis := random(IconZahl-1) + 1; // ergibt einen Wert zwischen 0 und 29 + 1 also 1 bis 30
Hier sind aber zwei Dinge zu beachten:

a.)
Die Random Funktion liefert Ergebnisse von Null an. Da Deine Icons anscheinend ab eins gezählt werden, darf also nur ein Random(29) erzeugt werden. Das Ergebnis muss also danach um eins erhöht werden.

b.)
Random kann nicht wirklich zufällig Zahlen liefern.
Die Random Funktion würde so bei jedem Aufruf die gleiche Reihenfolge von "Zufallszahlen" liefern, daher muss vor dem Aufruf ein "Randomize;" her, dass in der Reihe von Zufallszahlen jeweils an einem anderen Punkt aufsetzt.

Ggf. kann jemand anderes die genaue interne Funktion der Zufallszahlenermittlung erklären.


Jetzt wären die Icons also zufällig. Das reicht aber wohl nicht, denn wenn ich mich an Menory recht erinnere gibt es jedes Kärtchenpaar nur einmal. Du musst also die gültigen IconZahlen irgendwie zwischenspeichern (zB. in einem Array oder einer Stringliste oder so) und dann die bereits benutzten Einträge herausnehemn um zu vermeiden, dass ein Kartenpaar mehrfach benutzt wird.

Bei meinem MP3 Player hatte ich für die Zufallswiedergabe ein ähnliches Vorhaben. Hier habe ich die Liednummern/Dateinamen mittels einer Stringlist zu Beginn ermittelt und dann nach und nach die benutzten aus der Liste gelöscht. Dann muss das Random sich aber natürlich auf die restliche Anzahl Einträge der Liste und nicht der Gesamtliedanzahl, bzw Iconanzahl beziehen.

testzugang 16. Sep 2004 16:41

Re: Mischen Funktion
 
Zitat:

Zitat von Anthauri
Hi!

Auf den ersten Blick erscheint die "Random" Funktion die richtige Wahl, die eine Ganzzahl zurückgibt.

Delphi-Quellcode:
 Ergebnis := random(IconZahl-1) + 1; // ergibt einen Wert zwischen 0 und 29 + 1 also 1 bis 30

Randomize; und Random sind ja kein Problem, das Problem ist, Random muss solange laufen, bis alle Zahlen genau! 1 mal verteilt worden sind.

MfG

Ratte 16. Sep 2004 16:43

Re: Mischen Funktion
 
Hi,

es muss Random(30)+1 heißen, da bei Random die angegebene Zahl nicht zurückgegeben wird.

ratte

Matze 16. Sep 2004 16:45

Re: Mischen Funktion
 
Du kannst ja ein Array füllen und in einer for-Schleife immer Zufällige Index-Werte miteinander vertauschen, was besseres fällt mir nicht ein.

So kommt jeder Zahl auch nur einmal vor.

Zum Tauschen musst du hier mal nach Hier im Forum suchenSwap suchen, ansonsten schreib ich das schnell zusammen... (ansonsten = wenn du nicht fündig wirst ;) )

testzugang 16. Sep 2004 16:53

Re: Mischen Funktion
 
Zitat:

Zitat von Matze
Du kannst ja ein Array füllen und in einer for-Schleife immer Zufällige Index-Werte miteinander vertauschen, was besseres fällt mir nicht ein.

So kommt jeder Zahl auch nur einmal vor.

Zum Tauschen musst du hier mal nach Hier im Forum suchenSwap suchen, ansonsten schreib ich das schnell zusammen... (ansonsten = wenn du nicht fündig wirst ;) )

ich habe zwar ein Memory gefunden, aber um das zu verstehen müsste ich mich in den Code einarbeiten :?

Wenn du gerade mal etas Zeit hättest :coder: :duck:

MfG

Matze 16. Sep 2004 17:15

Re: Mischen Funktion
 
Hmm, finde den Fehler (da ist einer drin) grad nicht, evtl. siehst du ihn ja, aber so in der Art sollte es klappen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

const
  KartenAnzahl = 25;

var
  Form1: TForm1;
  Karten: array of integer;

implementation

{$R *.dfm}

//Die Zahlen Z1 und Z2 vertauschen
procedure Swap(var Z1, Z2: integer);
var Temp: integer;
begin
  Temp := Z1;
  Z1 := Z2;
  Z2 := Temp;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
    KartenIndex1, KartenIndex2: integer;
begin
  SetLength(Karten, KartenAnzahl);

  //Array füllen
  for i := 1 to KartenAnzahl do
    Karten[i] := i;

  //Karten mischen:
  for i := 1 to 100 do //Anzahl der Vertauschdurchgänge
  begin
    KartenIndex1 := random(KartenAnzahl) + 1;

    repeat
      KartenIndex2 := random(KartenAnzahl) + 1;
    until
      KartenIndex2 <> KartenIndex1;

    Swap(Karten[KartenIndex1], Karten[KartenIndex2]);
  end;
end;



procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(Karten);
end;

end.

testzugang 16. Sep 2004 17:40

Re: Mischen Funktion
 
Mann, mann mann ich brauche dringend ein neues Lehrbuch...

Ich checke das nícht..

MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:31 Uhr.
Seite 1 von 2  1 2      

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