![]() |
Zufallsvariable
Hallo,
hab eine Frage. Ich möchte ein Zahlenrätsel zum Einstieg in die Spieleprogrammierung machen. Hab Turbo Delphi. Soweit bin ich gekommen.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var z:0..50; var r:Real; begin r:=strtofloat(edit1.Text); If r<z Then begin Label2.Caption:='Die Zahl ist zu klein'; end; If r>z Then begin Label2.Caption:='Die Zahl ist zu groß'; end; If z=r Then begin Label2.Caption:='Richtig!!'; end; Die Lösungszahl ist immer 112. Das ist das Problem Danke für Hilfen! |
Re: Zufallsvariable
Delphi-Quellcode:
Randomize sollte nur ein mal aufgerufen werden. Random(51) erzeugt Zahlen zwischen 0 und 50 (einschließlich der Grenzen). ;)
procedure TForm1.Button1Click(Sender: TObject);
var r: real; i: Integer; begin Randomize; for i := 0 to 50 do begin r := Random(51); ListBox1.Items.add('Zahl: ' + FloatToStr(r)); end; end; |
Re: Zufallsvariable
Hallo,
bei mir ist die Lösung immer 0! Es wird eben die Zahl genommen, die zufällig in z steht - bis du einen sinnvollen Wert dort einträgst. Gruß Hawkeye |
Re: Zufallsvariable
Hallo.
Soll das Zahlenrätsel wirklich Real-Zahlen abfragen? Das wären dann Zahlen mit Komma. Oder möchtest du Integer-Zahlen, also ganzzahlige Werte? Bei den Real-Zahlen musst du darauf achten, dass du das amerikanische Komma, den Punkt nimmst. Außerdem ist die Notation "var z:0..50;" falsch. Was willst du damit genau aussagen? Als erstes müsstest du z einen gültigen Typen zuweisen, z.B. Integer:
Delphi-Quellcode:
und dann müsstet du im Code irgendwo z definieren/initialisieren.
var z: integer;
Ich glaube in diesem Falle meinst du
Delphi-Quellcode:
In diesem Falle wäre Random aber nur für ganzzahlige Zahlen gültig! Deswegen irritiert mich, dass du diese mit einem Fließkommawert vergleichen willst.
z := Random(51);
Möchtest du eine zufällige Kommazahl mit 2 Nachkommastellen, könntest du sowas machen:
Delphi-Quellcode:
Gruß
var z: real;
z := Random(51 * 100) / 100 blackdrake |
Re: Zufallsvariable
Hallo Daniel,
Zitat:
Gruß Hawkeye |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Windows API / MS.NET Framework API" nach "Object-Pascal / Delphi-Language" verschoben.
|
Re: Zufallsvariable
Hi
bin jetzt nicht wirklich schlau daraus geworden. Ich möchte nur eine Zahl in mein Edit-Feld eingeben. Die Zufallsvariable soll eine ganze Zahl zwischen 1 und 50 sein also
Delphi-Quellcode:
r muss dazu doch eine ganze Zahl sein
r:=Random(51)
also
Delphi-Quellcode:
aber was muss dann die zahl, die ich in das Edit-Feld einege sein? Integer oder Real? Eigentlich doch Integer da r auch Integer ist?!?!
r:Integer;
dann bin ich auf das gekommen
Delphi-Quellcode:
aber dann ist die Lösungszahl zwischen 10 und 11, asber wenn ich dann 9,5 oder 9.5 eingebe kommt eine Fehlermeldung!!
procedure TForm1.Button1Click(Sender: TObject);
var z,r:Integer; begin r:=strtoint(edit1.Text); z:=Random(51); If r<z Then begin Label2.Caption:='Die Zahl ist zu klein'; end; If r>z Then begin Label2.Caption:='Die Zahl ist zu groß'; end; If z=r Then begin Label2.Caption:='Richtig!!'; end; end; end. was nun?? |
Re: Zufallsvariable
Die Zufalls variable ändert sich auch bei jedem Button-Klick was natürlich nicht sein sollt sonst kann man ja die Zahl nie eraten :lol:
|
Re: Zufallsvariable
Sicher, weil du bei StrToInt keine Gleitkommazahlen verwenden kannst, sondern ganzzahlige Werte brauchst.
Nun versteh ich auch inwiefern du das machen willst ;-) Einfach dann die Zufallsvariable im FormCreate zuweisen und die Abfrage mit der Eingabe im ButtonClick-Ereignis.
Delphi-Quellcode:
Edit: Stimmt, hatte das einfach den Vorpostern entnommen ^^
TForm1 = class(TForm)
Edit1: TEdit; Button1: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); public z : integer; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var r : real; begin r := StrToFloat(Edit1.Text); //Gleitkommawert von Eingabe r zuweisen if r < z then Label2.Caption := 'Zu niedrig' else if r > z then Label2.Caption := 'Zu hoch' else if r = z then Label2.Caption := 'Erraten'; end; procedure TForm1.FormCreate(Sender: TObject); begin randomize; z := random(50)+1; //Zufallszahl im Bereich 1-50 end; |
Re: Zufallsvariable
Btw: Eine Zufallszahl im Bereich 1 bis 50 bekommt man mit Random(50) + 1.
|
Re: Zufallsvariable
Ja klappt auch soweit aber die zu erratenen zahl ist immer 0!!
auch wenn ich das Projekt schließe und dann nochmal starte. Muss das so sein? |
Re: Zufallsvariable
Poste mal deinen gesamten Quelltext. Bei mir kommen nach jedem Neustart des Programms neue Zufallszahlen heraus ...
Du darfst die Initialisierung des Zufallsgenerator, durch den Aufruf von der Prozedur Randomize nicht vergessen! |
Re: Zufallsvariable
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); public z : integer; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var r : real; begin r := StrToFloat(Edit1.Text); if r < z then Label2.Caption := 'Zu niedrig' else if r > z then Label2.Caption := 'Zu hoch' else if r = z then Label2.Caption := 'Erraten'; end; procedure TForm1.FormCreate(Sender: TObject); begin randomize; z := random(100)+1; end; end. |
Re: Zufallsvariable
Wieso vergleichst Du ganze mit Fließkommazahlen?
|
Re: Zufallsvariable
Warum? Ist das falsch?
Wenn ja wie mach ichs anders?? |
Re: Zufallsvariable
Hier mal ein schnell runtergetipptes Beispielprojekt (implementation-Teil):
Delphi-Quellcode:
uses Math;
procedure TfrmRaten.btnRatenClick(Sender: TObject); var Ratezahl: Integer; begin Ratezahl := StrToIntDef(edtEingabe.Text,0); case Sign(Ratezahl - Zahl) of 0: ShowMessage('Erraten'); 1: ShowMessage('Zu hoch'); -1: ShowMessage('Zu niedrig'); end; edtEingabe.SetFocus; edtEingabe.SelectAll; end; procedure TfrmRaten.FormCreate(Sender: TObject); begin Randomize; Zahl := Random(100) + 1; end; |
Re: Zufallsvariable
@Hans33: Wenn die zu erratende Zahl eine ganze Zahl sein sollte, wieso solltest du dann dem Benutzer erlauben, eine Fließkommazahl einzugeben? Wenn der Benutzer 9.5 eingibt, ist das schlicht und einfach ein falscher Wert. Das ist genau so, wie wenn er "a" eingibt, ist auch falsch.
StrToIntDef aus dem vorherigen Post wandelt eine ungültige Eingabe in 0 um und somit erhält der Benutzer keine Fehlermeldungen bei einer Kommazahl oder einem nicht-numerischen Wert. |
Re: Zufallsvariable
Macht sich bloß dumm, wenn der Benutzer dann nicht darauf hingewiesen wird, das er eine falsche Eingabe macht und immer weiter macht ...
Ich glaube aber das Grundproblem ist hier einfach das Verständnis, weswegen man nicht unbedingt eine Abfrage der Benutzereingabe machen sollte. |
Re: Zufallsvariable
Wer so blöd ist, beim Zahlenraten ein "a" oder sowas einzugeben, hat es nicht besser verdient :twisted:
|
Re: Zufallsvariable
was ist dann falsch?
Ich kann kein denkfehler erkennen!
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); public z :integer; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin randomize; z := random(50)+1; end; procedure TForm1.Button1Click(Sender: TObject); var r : real; begin r := StrTofloat(edit1.Text); if r < z then Label2.Caption := 'Zu niedrig' else if r > z then Label2.Caption := 'Zu hoch' else if r = z then Label2.Caption := 'Erraten'; end; end. |
Re: Zufallsvariable
ob ich r:Integer; oder r:Real; mach macht kein unterschied im Ergebnis
|
Re: Zufallsvariable
Wie äußert sich der Fehler denn?
|
Re: Zufallsvariable
Delphi-Quellcode:
Hi
procedure TForm1.Button1Click(Sender: TObject);
var r : integer; begin r := StrToInt(edit1.Text); z := random(50)+1; if r < z then Label2.Caption := 'Zu niedrig'; if r > z then Label2.Caption := 'Zu hoch'; if r = z then Label2.Caption := 'Erraten'; end; ich hab zwar selbst keine Ahnung von irgendwas aber probiers mal so! |
Re: Zufallsvariable
@DeddyH: also ich starte das programm.
Die Lösungszahl ist 0. Starte ich das Programm neu, ist die Lösungszahl 0. Das kann ich so oft ich will machen, immer 0. |
Re: Zufallsvariable
Zeig mal Deinen Code.
|
Re: Zufallsvariable
Scheint als würde bei dir Randomize nicht aufgerufen.
Hast du den Quellcode einfach nur kopiert? Klicke mal doppelt auf deine Form, das bei dir selber das OnCreate-Ereignis erzeugt wird ... |
Re: Zufallsvariable
Ist das FormCreate auch zugewiesen? Schau mal im Objektinspektor nach.
|
Re: Zufallsvariable
bei neuen delphiversionen muss mann oder frau den randomize nicht mehr extra aufrufen(zu mindest nicht für einfaches random ob man den noch für was anderes nutzen kann weiß ich net)
|
Re: Zufallsvariable
@forerster7891: Klappt nicht.
zB. 16 ist zu hoch 15 zu klein 15,5 oder 15.5 kommt eine fehlermeldung |
Re: Zufallsvariable
In meiner Hilfe (D2007) steht:
Zitat:
|
Re: Zufallsvariable
Hans, häng das Projekt doch mal als ZIP-Archiv an, sonst kommen wir wohl nicht weiter.
|
Re: Zufallsvariable
Mein Code:
Delphi-Quellcode:
nit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormClick(Sender: TObject); public z :integer; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin randomize; z := random(50)+1; end; procedure TForm1.Button1Click(Sender: TObject); var r : real; begin r := StrTofloat(edit1.Text); if r < z then Label2.Caption := 'Zu niedrig' else if r > z then Label2.Caption := 'Zu hoch' else if r = z then Label2.Caption := 'Erraten'; end; end. außerdem: Bei objektinspektor ist OnCreate zugewiesen |
Re: Zufallsvariable
hast bei dem was ich da geschrieben hab bei jedem klick nen andern wert(deshalb wars mal größer mal kleiner)
|
Re: Zufallsvariable
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin randomize; z := random(50)+1; ShowMessage(IntToStr(z)); //zur Kontrolle end; procedure TForm1.Button1Click(Sender: TObject); var r : integer; //real mit integer zu vergleichen macht selten Sinn begin r := StrToInt(edit1.Text); if r < z then Label2.Caption := 'Zu niedrig' else if r > z then Label2.Caption := 'Zu hoch' else if r = z then Label2.Caption := 'Erraten'; end; |
Re: Zufallsvariable
Liste der Anhänge anzeigen (Anzahl: 1)
So hier
das Projekt heißt Raten |
Re: Zufallsvariable
Das ist die Lösung:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin randomize; z := random(50)+1; end; procedure TForm1.Button1Click(Sender: TObject); var r : integer; begin r := StrToInt(edit1.Text); if r < z then Label2.Caption := 'Zu niedrig' else if r > z then Label2.Caption := 'Zu hoch' else if r = z then Label2.Caption := 'Erraten'; end; end. DeddyH hats richtig gemacht nun funktioniert es |
Re: Zufallsvariable
Vielen Dank für die Hilfe!!!!! :dancer:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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