![]() |
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:
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?
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; mfg |
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. |
Re: Mischen Funktion
Zitat:
Hast du ein bisschen Code für mich übrig ;-) ? MfG |
Re: Mischen Funktion
Hi!
Auf den ersten Blick erscheint die "Random" Funktion die richtige Wahl, die eine Ganzzahl zurückgibt.
Delphi-Quellcode:
Hier sind aber zwei Dinge zu beachten:
Ergebnis := random(IconZahl-1) + 1; // ergibt einen Wert zwischen 0 und 29 + 1 also 1 bis 30
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. |
Re: Mischen Funktion
Zitat:
MfG |
Re: Mischen Funktion
Hi,
es muss Random(30)+1 heißen, da bei Random die angegebene Zahl nicht zurückgegeben wird. ratte |
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 ![]() |
Re: Mischen Funktion
Zitat:
Wenn du gerade mal etas Zeit hättest :coder: :duck: MfG |
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. |
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 15:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz