![]() |
random zahl genau 2 mal
hallo, ich hab eine form mit 36 buttons und ich will das in der caption der buttons eine zahl steht. hierbei besteht nun mein problem, ich will eine art memory machen und dazu brauch ich also 18 zahlen, jede aber 2 mal. und damit das spiel nicht langweilig ist, sollen die zahlen zufällig angeordnet werden.
das mit dem zufall is nich das problem, sondern das die zahl genau 2mal vorkommt, nicht weniger und nicht mehr |
Könntest ein Array nehmen, das die 36 Werte enthält und dann durchmischeln...
|
hmm...wie geht das denn??
|
Hi,
noch ne Lösung: Ermittel 16 Zufallszahlen und verteile diese incl. ihrer Duplikate per Zufallsgenerator auf die 32 Buttons. So nach dem Motto wenn erst mal die 16 Zufallszahlen ermittelt sind (und zwischenspeichern; Array ist da eine Lösung) dann nächste Schleife (Anzahl 32 für die Buttons) und 32 Zufallszahlen zwischen 1 und 32 ermitteln und Werte zuweisen. hierbei prüfen, dass ein Button nicht zweimal belegt wird. Gruß oki |
Hallo wo0zy,
wir hatten ähnliche Fragen schon mal in der Vergangenheit diskutiert. Suche mal in unserem Forum nach "Zufall". ![]() |
loesung
hy,
denke auch du nimmst 16 zufallszahlen + 16 dublikate und daach mir random jede zahl 2mal versenden! und beim random schleisst du jedes mal 2 buttons aus die du rausschreeiwst oder si einfach deaktiviert, so kannst du ne if abfrage starten mir :
Delphi-Quellcode:
ciao :P
if (btnX.Enabled = true) then
btnX.Caption := ZAHL; [edit=Daniel B]BB-Code wieder eingeschaltet, damit die Tags funktionieren. MfG Daniel B.[/edit] |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Woozy,
Versuchs doch mal so:
Delphi-Quellcode:
Einziger Nachteil, es werden mehrere gleiche Paare angezeigt.
procedure TForm1.FormCreate(Sender: TObject);
begin Randomize; end; procedure TForm1.Button1Click(Sender: TObject); var Values: TStringList; x, y: Integer; Rnd: Integer; CurrentIndex, NewIndex: Integer; begin Values:=TStringList.Create; Values.Duplicates:=dupIgnore; // Zufallswerte erzeugen While Values.Count < 32 do begin Rnd:=random(60); Values.Add(inttostr(rnd)); Values.Add(inttostr(rnd)); end; // Zufallswerte mischen y:=random(9999); for x:=1 to y do begin CurrentIndex:=random(Values.Count); NewIndex:=random(Values.Count); While CurrentIndex=NewIndex do begin CurrentIndex:=random(Values.Count); NewIndex:=random(Values.Count); end; Values.Move(CurrentIndex, NewIndex); end; // Zufallswerte zuweisen for x:=0 to ComponentCount-1 do begin if Components[x].ClassType =TSpeedButton then begin (Components[x] as TSpeedButton).Tag:=strtoint(Values.Strings[x]); if CheckBox1.Checked then begin (Components[x] as TSpeedButton).Glyph:=nil; (Components[x] as TSpeedButton).Caption:=''; ImageList1.GetBitmap(strtoint(values.Strings[x]), (Components[x] as TSpeedButton).Glyph); end else begin (Components[x] as TSpeedButton).Glyph:=nil; (Components[x] as TSpeedButton).Caption:=Values.Strings[x]; end; end; end; Values.Free; end; Gruß, Tom |
Hallo,
ich würde das Problem so lösen:
Delphi-Quellcode:
Achtung: Die Größe des Array korespondiert mit der Anzahl der TSpeedButtons
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; const MaxMemoryArray = 32; type TMemoryArray = Array[1..MaxMemoryArray] of Integer; TForm1 = class(TForm) Button1: TButton; SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; SpeedButton4: TSpeedButton; SpeedButton5: TSpeedButton; SpeedButton6: TSpeedButton; SpeedButton7: TSpeedButton; SpeedButton8: TSpeedButton; SpeedButton9: TSpeedButton; SpeedButton10: TSpeedButton; SpeedButton11: TSpeedButton; SpeedButton12: TSpeedButton; SpeedButton13: TSpeedButton; SpeedButton14: TSpeedButton; SpeedButton15: TSpeedButton; SpeedButton16: TSpeedButton; SpeedButton17: TSpeedButton; SpeedButton18: TSpeedButton; SpeedButton19: TSpeedButton; SpeedButton20: TSpeedButton; SpeedButton21: TSpeedButton; SpeedButton22: TSpeedButton; SpeedButton23: TSpeedButton; SpeedButton24: TSpeedButton; SpeedButton25: TSpeedButton; SpeedButton26: TSpeedButton; SpeedButton27: TSpeedButton; SpeedButton28: TSpeedButton; SpeedButton29: TSpeedButton; SpeedButton30: TSpeedButton; SpeedButton31: TSpeedButton; SpeedButton32: TSpeedButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } FMemoryArray : TMemoryArray; procedure FillArray; procedure Scramble; procedure SetSpeedButtons; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Randomize; // Zufallsgenerator initialisieren FillArray; Scramble; SetSpeedButtons; end; procedure TForm1.FillArray; var iCnt : Integer; jCnt : Integer; Ok : Boolean; begin {Die Schleife muss nur über das halbe Array laufen, da ja Paare im Array stehen sollen.} For iCnt:=Low(FMemoryArray) to High(FMemoryArray) div 2 do begin Repeat Ok:=True; FMemoryArray[iCnt]:=Random(100); // liefere Zahlen im Bereich 0 bis 99 //Prüfe, ob die Zahl im Array vorhanden ist For jCnt:=Low(FMemoryArray) to iCnt-1 do begin If FMemoryArray[iCnt]=FMemoryArray[jCnt] then begin Ok:=False; // Wenn vorhanden, dann Ok:=False damit neue Zahl "gezogen wird" Break; end; // If FMemoryArray[iCnt]=FMemoryArray[jCnt] then end; // For jCnt:=Low(FMemoryArray) to iCnt-1 do Until Ok; {Schreibe den "Partner" an die Stelle iCnt+High(FMemoryArray) div 2 im Array. Dadurch wird das Paar erzeugt.} FMemoryArray[iCnt+High(FMemoryArray) div 2]:=FMemoryArray[iCnt]; end; // For iCnt:=Low(FMemoryArray) to High(FMemoryArray) div 2 do end; procedure TForm1.Scramble; var iCnt : Integer; jCnt : Integer; Swap : Integer; begin For iCnt:=Low(FMemoryArray) to High(FMemoryArray) do begin jCnt:=Random(High(FMemoryArray))+1; // wähle einen zufälligen Index in FMemoryArray Swap:=FMemoryArray[iCnt]; FMemoryArray[iCnt]:=FMemoryArray[jCnt]; FMemoryArray[jCnt]:=Swap; end; end; procedure TForm1.SetSpeedButtons; var iCnt : Integer; SpeedButton : TSpeedButton; begin For iCnt:=Low(FMemoryArray) to High(FMemoryArray) do begin SpeedButton:=TSpeedButton(FindComponent('SpeedButton'+IntToStr(iCnt))); SpeedButton.Caption:=IntToStr(FMemoryArray[iCnt]); end; // For iCnt:=Low(FMemoryArray) to High(FMemoryArray) div 2 do end; end. |
ich hab das ganze jetzt mal gemacht wie jens, und das funzt auch, doch nun wollte ich das spiel erweitern, undzwar sollen immer dann die letzen beiden buttons verschwinden, wenn diese die gleich caption haben. das ganze hab ich so gemacht
Code:
doch
procedure TForm1.OnBtnClick(Sender: TObject);
var Sender1:TObject; begin If Sender is TFlatBtn then count:=count+1; if count=1 then Sender1:=Sender; if count=2 then begin count:=0; if (Sender1 as TFlatBtn).Caption=(Sender as TFlatBtn).Caption then begin //(Sender as TFlatBtn).Color:=clRed; (Sender as TFlatBtn).hide; //(Sender1 as TFlatBtn).Color:=clRed; (Sender1 as TFlatBtn).hide; end; end; end;
Code:
wird nie erreicht, vor dem erreichen bekomme ich immer folgenden fehler
if (Sender1 as TFlatBtn).Caption=(Sender as TFlatBtn).Caption
Zitat:
|
Hallo,
das liegt daran, das Du Sender1 als lokale Variable deklariert hast. Wenn Du aus Sender1 ein Formularfeld machst sollte es klappen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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