Autor |
Beitrag |
Anka
      
Beiträge: 16
|
Verfasst: Mo 06.06.11 10:51
Hallo Leute,
habe gerade ein kleines Zahlenratenprogramm programmiert und wollte eigentlich den Zahlenbereich, in welchem der Computer sich eine Zahl ausdenkt, die der User erraten muss, vom User durch ein Editfeld frei wählbar machen.
Dabei bin ich aber auf das Problem gestoßen, dass ich die Zufallszahl bei FormCreate erstellen lassen muss, weil sonst bei jedem neuen Klick auf den Button Raten eine neue Zufallszahl erzeugt wird.
Mein Code sieht momentan so aus:
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.FormCreate(Sender: TObject); begin Randomize; Zufallszahl:= Random(StrToInt(EdtZahlenbereich.Text))+1; end; |
Allerdings kann der User vor Programmstart natürlich keinen Zahlenbereich angeben -.-
Möchte eigentlich aus optischen Gründen nicht noch einen Button für das Zahlenbereichbestätigen erstellen.
Irgendwer eine Idee, wäre super
Liebe Grüße
Anka
Moderiert von Christian S.: Delphi-Tags hinzugefügtModeriert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 07.06.2011 um 14:49
|
|
MaxWurzel
      
Beiträge: 77
Erhaltene Danke: 10
|
Verfasst: Mo 06.06.11 11:03
Benutze das OnChange Ereignis des Editfeldes.
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mo 06.06.11 11:04
oder das onExit des Editfeldes
(wenn Feld verlassen und Bereich geändert, dann neu Random, usw., sonst nix machen)
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
Anka 
      
Beiträge: 16
|
Verfasst: Mo 06.06.11 20:33
wie genau funktionieren die beiden Ereignisse bzw. welchen Code müsste ich verwenden?
Reicht es, wenn ich einfach
Zufallszahl:=Random(StrToInt(EdtZahlenbereich.Text));
in die procedure schreibe?
Ich stehe noch relativ am Anfang meiner Delphi-Karriere, also bitte vereziht mir solche (wahrscheinlich) sehr einfachen Fragen 
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 06.06.11 20:37
|
|
Anka 
      
Beiträge: 16
|
Verfasst: Mo 06.06.11 20:59
Zitat: | Wenn du damit fragen willst, wie du die Prozeduren für die Ereignisse erstellen kannst: Einfach im Objektinspektor auf Ereignisse schalten, die Namen raussuchen und doppelklicken. Die dann erstellte Prozedur wird immer dann ausgeführt, wenn das Ereignis auftritt. |
Nicht ganz, soweit komme ich glücklicherweise  Ich meinte eher, was die Ereignisse OnChange und OnExit jedes für sich machen, bei OnClick ist beispielsweise das "Draufklicken" angesprochen, etc.
Ok, irgendwas mache ich glaube ich gerade richtig falsch, die Zufallszahl wird nicht im richtigen Zahlenbereich erzeugt. Mein Code sieht wie folgt aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| implementation
{$R *.dfm} var Zufallszahl, Ratezahl, OptimaleZahl: Integer;
procedure TForm1.FormCreate(Sender: TObject); begin Randomize; ShowMessage ('Um ein neues Spiel zu starten, geben Sie bitte einen Zahlenbereich ein und drücken Sie den Neu-Button'); end;
procedure TForm1.BtnRatenClick(Sender: TObject); begin Ratezahl:= StrToInt(EdtRaten.Text);
if Ratezahl = Zufallszahl then LblErgebnis.Caption:= 'Richtig geraten!' else if Ratezahl < Zufallszahl then LblErgebnis.Caption:= 'Die Zahl ist zu klein!' else if Ratezahl > Zufallszahl then LblErgebnis.Caption:= 'Die Zahl ist zu groß!'; end;
procedure TForm1.EdtZahlenbereichChange(Sender: TObject); begin Zufallszahl:=Random(StrToInt(EdtZahlenbereich.Text))+1; end; |
Moderiert von Martok: Delphi-Tags hinzugefügt
|
|
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mo 06.06.11 21:05
Das Problem ist hier, dass du bei jeder neuen Eingabe eine neue Zufallszahl anlegst.
Willst du, dass der Benutzer mehrere Versuche hat?
|
|
Anka 
      
Beiträge: 16
|
Verfasst: Mo 06.06.11 21:11
jop 
|
|
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mo 06.06.11 21:15
Dann lege doch eine neue Variable an, die speichert wieviele Versuche er schon hatte.
Wenn er x-Versuche hatte, dann machst du halt eine neue Variable.
lg
|
|
Anka 
      
Beiträge: 16
|
Verfasst: Mo 06.06.11 21:18
Ich glaube ich stehe gerade auf dem Schlauch
Wenn ich jetzt eine neue Variable mit der Anzahl der bisherigen Versuche erstelle, löst das doch nicht mein Problem, dass ich bei jedem neuraten eine neue Zufallszahl erzeuge, oder=
Steht der Randombefehl eigentlich in meinem Code an der richtigen Stelle?
|
|
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mo 06.06.11 21:22
Anka hat folgendes geschrieben : |
Steht der Randombefehl eigentlich in meinem Code an der richtigen Stelle? |
Nein.
Mache den Random Befehle doch auf den Button Click!
Wenn die Versuche = 0 sind oder = x dann wird eine neue erzeugt.
Ansonsten bleibt die Alte.
|
|
Anka 
      
Beiträge: 16
|
Verfasst: Mo 06.06.11 21:36
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| implementation
{$R *.dfm} var Zufallszahl, Versuche, Ratezahl, OptimaleZahl: Integer;
procedure TForm1.FormCreate(Sender: TObject); begin Randomize; ShowMessage ('Um ein neues Spiel zu starten, geben Sie bitte einen Zahlenbereich ein und drücken Sie den Neu-Button'); Veruche :=0; end;
procedure TForm1.BtnRatenClick(Sender: TObject); begin Inc(Versuche);
if Versuche 10< then Zufallszahl:= Random(StrToInt(EdtZahlenbereich.Text))+1;
Ratezahl:= StrToInt(EdtRaten.Text);
if Ratezahl = Zufallszahl then LblErgebnis.Caption:= 'Richtig geraten!' else if Ratezahl < Zufallszahl then LblErgebnis.Caption:= 'Die Zahl ist zu klein!' else if Ratezahl > Zufallszahl then LblErgebnis.Caption:= 'Die Zahl ist zu groß!'; end; |
Ok, Änderungen übernommen, aber wie wird jetzt bei Programmstart eine neue Zufallszahl erzeugt?
|
|
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mo 06.06.11 21:55
So klappt das nicht, du erzeugst ja immernoch immer neue Zahlen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| implementation
{$R *.dfm} var Zufallszahl, Versuche, Ratezahl, OptimaleZahl: Integer;
procedure TForm1.FormCreate(Sender: TObject); begin Randomize; ShowMessage ('Um ein neues Spiel zu starten, geben Sie bitte einen Zahlenbereich ein und drücken Sie den Neu-Button'); Zufallszahl := Random(StrToInt(EdtZahlenbereich.Text))+1; Versuche := 0; end;
procedure TForm1.BtnRatenClick(Sender: TObject); begin if (Versuche in [0, 10]) then begin Versuche := 0; Zufallszahl := Random(StrToInt(EdtZahlenbereich.Text))+1; end;
Inc(Versuche);
Ratezahl:= StrToInt(EdtRaten.Text);
if Ratezahl = Zufallszahl then begin LblErgebnis.Caption:= 'Richtig geraten!'; Versuche := 0; end else if Ratezahl < Zufallszahl then LblErgebnis.Caption:= 'Die Zahl ist zu klein!' else if Ratezahl > Zufallszahl then LblErgebnis.Caption:= 'Die Zahl ist zu groß!'; end; |
So sollte es klappen.
lg
|
|
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Di 07.06.11 00:44
HenryHux hat folgendes geschrieben : | Das Problem ist hier, dass du bei jeder neuen Eingabe eine neue Zufallszahl anlegst.
Willst du, dass der Benutzer mehrere Versuche hat? |
- wo bitte wird bei jeder Eingabe die Zufallszahl verändert?
Das passiert erst im letzen Codebeispiel...
- mehrere Versuche hat der Spieler auch sonst, nur zum mitzählen brauchst du ne Variable
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Di 07.06.11 07:10
|
|
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Di 07.06.11 08:16
das ist doch aber beim Edit für die Eingabe der Zufallszahl. Die Eingabe für das Raten geschieht doch in einem anderen Editfeld...?
Anka hat folgendes geschrieben : | Zitat: | Wenn du damit fragen willst, wie du die Prozeduren für die Ereignisse erstellen kannst: Einfach im Objektinspektor auf Ereignisse schalten, die Namen raussuchen und doppelklicken. Die dann erstellte Prozedur wird immer dann ausgeführt, wenn das Ereignis auftritt. |
Nicht ganz, soweit komme ich glücklicherweise Ich meinte eher, was die Ereignisse OnChange und OnExit jedes für sich machen, bei OnClick ist beispielsweise das "Draufklicken" angesprochen, etc.
Ok, irgendwas mache ich glaube ich gerade richtig falsch, die Zufallszahl wird nicht im richtigen Zahlenbereich erzeugt. Mein Code sieht wie folgt aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| implementation
{$R *.dfm} var Zufallszahl, Ratezahl, OptimaleZahl: Integer;
procedure TForm1.FormCreate(Sender: TObject); begin Randomize; ShowMessage ('Um ein neues Spiel zu starten, geben Sie bitte einen Zahlenbereich ein und drücken Sie den Neu-Button'); end;
procedure TForm1.BtnRatenClick(Sender: TObject); begin Ratezahl:= StrToInt(EdtRaten.Text);
if Ratezahl = Zufallszahl then LblErgebnis.Caption:= 'Richtig geraten!' else if Ratezahl < Zufallszahl then LblErgebnis.Caption:= 'Die Zahl ist zu klein!' else if Ratezahl > Zufallszahl then LblErgebnis.Caption:= 'Die Zahl ist zu groß!'; end;
procedure TForm1.EdtZahlenbereichChange(Sender: TObject); begin Zufallszahl:=Random(StrToInt(EdtZahlenbereich.Text))+1; end; | |
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 07.06.11 15:04
Anka hat folgendes geschrieben : | Ok, irgendwas mache ich glaube ich gerade richtig falsch, die Zufallszahl wird nicht im richtigen Zahlenbereich erzeugt. |
Das war doch das ursprüngliche, noch ungelöste Problem. In welchem Bereich liegen die Zufallszahlen denn?
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Di 07.06.11 15:55
Anka hat folgendes geschrieben : | wie genau funktionieren die beiden Ereignisse bzw. welchen Code müsste ich verwenden?
Reicht es, wenn ich einfach
Zufallszahl:=Random(StrToInt(EdtZahlenbereich.Text));
in die procedure schreibe?
Ich stehe noch relativ am Anfang meiner Delphi-Karriere, also bitte vereziht mir solche (wahrscheinlich) sehr einfachen Fragen  |
wenn du mal das aus dem englischen übersetzt, wird eigtl. schon klar, was es mit den ereignissen auf sich hat.
onchange = bei Änderung = tritt auf, wenn das Feld geändert wird
onexit = bei Verlassen = tritt auf, wenn das Feld den Focus verliert
Um nur dann eine neue Zufallszahl zu generieren, wenn die Eingabe sich verändert, merkst du dir einfach immer die letzte Eingabe und benutzt die dann zum Vergleichen. So wird keine neue Zufallszahl erzeugt, wenn man einfach nur das Feld verlässt, ohne zu ändern (z.b. beim 'durchtabben').
ich empfehle dir mal, das beim onExit zu machen
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (AlterZahlenBereich <> StrToInt(EdtZahlenBereich.Text)) then begin Zufallszahl := Random(StrToInt(EdtZahlenbereich.Text))+1; AlterZahlenBereich := StrToInt(EdtZahlenBereich.Text); end; |
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
n1con
Hält's aus hier
Beiträge: 12
Erhaltene Danke: 1
Win7 Ultimate x64
Delphi 6, Delphi 2007
|
Verfasst: Do 23.06.11 13:44
Ich hab dir das jetzt mal zusammengefasst. Was wichtig ist, du musst die Variable Zufallszahl global deklarieren. Außerdem reicht es wenn du sie nur einmal im OnCreate Ereignis im Bereich Random(StrToInt(EdtZahlenbereich.Text))+1 generierst. Jetzt kannst du jedes mal im OnExit Ereignis des Edit Feldes das OnCreate Ereignis aufrufen und fertig. Ich häng dir mal meine Version an, dann siehst du wie ich es meine.
LG n1con
Einloggen, um Attachments anzusehen!
|
|