Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Random-Funktion


Bob - Mi 19.04.06 15:37
Titel: Random-Funktion
Servus;)

Ich versuch grad ne Art WM-Tippspiel mit Delphi zu machen. Dazu gehört natrülich,dass die Ergebnisse zufällig gewählt werden wenn man auf den Button klickt. Mein Problem ist jetzt,dass ich es nicht hinbekomme, dass in den Editfeldern die Zahlen zufällig auftreten. Ich hab zwar eine Random-Funktion ausproiert,aber das ist eine wo dann ein Text überall erscheint oder wo der irgendwo erscheint. Aber cih finde nicht dazu, wie man zufällige Zahlen in Editfelder schafft...kann mir jemand helfen oder en Tipp geben?


Narses - Mi 19.04.06 15:39

Moin und :welcome: im Forum!

Zeig doch mal etwas Code oder sag uns, was du bisher gemacht hast und was nicht klappt, bzw. wie du es gerne machen möchtest; so können wir dir nicht helfen, weil du zu wenig Details geliefert hast... ;)

cu
Narses


der Berliner - Mi 19.04.06 15:46

:welcome:
Also ich versuch ihm mal trozdem zu helfen. :flehan:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
Edit1.Text:=IntToStr(Random(10));//Zufällige Zahl zwischen 1 und 10
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(Random(10));
end;


Gruß


Philipp_Reitter - Mi 19.04.06 15:56

probiers mal damit....


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
randomize; //startet random funktion
zahl:=random(deinezahl);  // wählt eine zufällige zahl aus
edit1.text:= inttostr(zahl); // trag die zahl in den edit ein
//fallst du ncith weißt inttostr heißt Integer to String also praktisch zahl zu text umwandeln
//es gibt auch StrtoInt also wenn du ne zahl als string hast (z.b. wenn du in einen edit ne zah reinschreibst)
//dann erkännt er diesen Strin als Integer


Bob - Mi 19.04.06 16:14

Also danke schon mal für die zahlreichen Antworten :)

DIe Random-Funtkion die ich gemeint hatte war die die unten im Quelltext ist.Hab halt noch nciht viel gemacht. Hab SPiele auf die Oberfläche geschrieben,die Editfelder erstellt und dann soll es eben für richtige Tipps Punkte geben...Bilder sollen ab eienr gewissen Punktzhahl erscheinen...aber erstmal muss ich eben Ergebnisse vorliegen haben damit die anderen Sachen ermöglicht werden können :D
Also danke schonmal für die Hilfe,ich probier das mal aus im Laufe des Tages un gebe dann mal Bescheid wie es aussieht 8)

PS: Wollt Quelltext hinzufügen...weiß net obs klappt bzw man dies macht. Wenn es net geht,das ist der Quelltext der RandomFunktion die ich benutzt habe:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var

   I: Integer;
 begin
   Randomize;
   for I := 1 to 50 do begin
     { Ausgabe an zufälligen Positionen im Fenster }
     Canvas.TextOut(Random(Width), Random(Height), 'Fang mich!');
 
 end;
end;


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


Bob - Fr 21.04.06 15:18

user profile iconder Berliner hat folgendes geschrieben:
:welcome:
Also ich versuch ihm mal trozdem zu helfen. :flehan:


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(Random(10));
end;


´
Also das ging;) Jetzt krieg ich schöne Zufallsergebnisse...danke schön;) Jetzt mal ne andere Frage...ich möchte jetzt, dass wnn 2 Editfelder übereinstimmen,also wenn das Ergebnis richtig ist, dass dann in einem anderen Editfeld automatisch die punkte angezeigt werden die man dafür bekommt...bzw braucht man dafür überhaupt ein Editfeld und nicht vllt label...?


bs-Hobbit - Fr 21.04.06 15:41


Delphi-Quelltext
1:
2:
If edit1.text = edit2.text then
  labe11.caption := IntToStr(punkte);


wobei Punkte eine variable vom Typ Integer/byte/word/cardinal/u.a. ist


Bob - Di 25.04.06 20:31

Danke für den Tipp..einmal hat es auch geklappt...nur dann irgendwie nicht mehr...

Mein Quelltext waroder ist:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
If edit1.text = edit9.text then
   label25.caption := IntToStr(5)
else label25.caption := IntToStr(0);

If edit5.text = edit13.text then
   label30.caption := IntToStr(5)
else label30.caption := IntToStr(0);

If edit2.text = edit10.text then
   label26.caption := IntToStr(5)
else label26.caption := IntToStr(0);


der zeigt mir wenn ich aber die Tipps eingegeben habe und die Zufallsergebnisse erscheinen immer die 0 an. Aber irgendwie ging es schon einmal...?


Bob - Di 02.05.06 20:56

Hat niemand vllt ne Idee woran liegts?:)


DnC - Di 02.05.06 21:21

ich seh erstmal keinen Fehler


ganz sicher, dass du richtig getippt hast?
dann wärs ja logisch


Bob - Di 02.05.06 21:23

Also wie gesagt..er compaliert...nur auch wenn die Ergebnisse übereinstimmen zeigt er null Punkte an...


DnC - Mi 03.05.06 14:47

zeige mal den Rest des Quellcodes


chriss1988 - Mi 03.05.06 14:53

versuchs mal so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TSingleplayergame.Button1Click(Sender: TObject);
begin
randomize;
Zahl:=random(7);
edit2.text:=floattostr(zahl);

spielzahl:=strtofloat(edit1.text);
if spielzahl=Zahl then        //wenn Spielerzahl gleich zahl ist
   begin
     Spielerpunkte:=Spielerpunkte+1;      // bekommt er +1 Punkt
     label4.caption:=floattostr(Spielerpunkte);
   end;

if Spielerpunkte=5 then  //wenn spieler 5 punkte hat
   showmessage(panel1.caption+' hat gewonnen'); //hat er gewonnen
end;


Bob - Fr 05.05.06 13:56

@DnC:

Also sehr viel mehr Quelltext hab ich kaum..davor halt was...der vollständige ist:


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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit9.Text:=IntToStr(Random(5));
Edit10.Text:=IntToStr(Random(5));
Edit11.Text:=IntToStr(Random(5));
Edit12.Text:=IntToStr(Random(5));
Edit13.Text:=IntToStr(Random(5));
Edit14.Text:=IntToStr(Random(5));
Edit15.Text:=IntToStr(Random(5));
Edit16.Text:=IntToStr(Random(5));
If edit1.text = edit9.text then
   label25.caption := IntToStr(5)
else label25.caption := IntToStr(0);

If edit5.text = edit13.text then
   label30.caption := IntToStr(5)
else label30.caption := IntToStr(0);

If edit2.text = edit10.text then
   label26.caption := IntToStr(5)
else label26.caption := IntToStr(0);

 If edit6.text = edit14.text then
   label31.caption := IntToStr(5)
else label31.caption := IntToStr(0);

If edit3.text = edit11.text then
   label27.caption := IntToStr(5)
else label27.caption := IntToStr(0);

If edit7.text = edit15.text then
   label32.caption := IntToStr(5)
else label32.caption := IntToStr(0);

If edit4.text = edit12.text then
   label28.caption := IntToStr(5)
else label28.caption := IntToStr(0);

If edit8.text = edit16.text then
   label33.caption := IntToStr(5)
else label33.caption := IntToStr(0);

end;

end.


@Chris:
Hab ich mal auf die Schnelle ausprobiert,hat aber noch nicht geklappt weil ich dann ja im Prinzip das Gerüst des Quelltexts umändern muss.Dauert bestimmt nicht so lang aber hab ich noch nicht geschafft.
Aber ich find der sieht gut aus vor allem dass dann diese Nachricht erscheint "hat gewonnen",da ich so was auch machen wollte bei einer bestimmen Punktzahl...


Bob - Mo 08.05.06 20:53

Alsoooo..des mit den Punkten hab ich hinbekommen:)hab nur noch ein Problem...ich will,dass das programm jetzt die Teilpunkte zusammenaddiert...tut es aber nicht richtig...sondern es schreibt nur die Zahlen nebeneinander...weiß jemand wie man das beheben kann...?


DelphiAnfänger - Mo 08.05.06 21:06

was hast du denn probiert was nicht geklappt hat?


Bob - Mo 08.05.06 21:10

Ich habe zum Beispiel geschrieben:

label1.caption + label2.caption + label3.caption usw...

beispiel is dann:

5 + 0 + 5

und statt er addiert und 10 schreibt schreibt er:

505...


DelphiAnfänger - Mo 08.05.06 21:28

du kannst keine strings addieren du musst sie vorher umwandel die einfache Variante ist:

Delphi-Quelltext
1:
lbAusgabe.caption:=floattostr(strtofloat(label1.caption)+strtofloat(label2.caption)+strtofloat(label3.caption))                    

etwas komplizierter aber übersichtlicher ist folgende variante:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.addiere;
VAR 
 iZahl1, iZahl2, iZahl3, iErgebnis:real; //wenn es nur ganze zahlen sind kannst du auch integer nehmen
begin
 iZahl1:=strtofloat(label1.caption); //wenn du integer genommen hast schreibst du strtoint
 iZahl2:=strtofloat(label2.caption); //wenn du integer genommen hast schreibst du strtoint
 iZahl3:=strtofloat(label3.caption); //wenn du integer genommen hast schreibst du strtoint
 iErgebnis:=iZahl1+iZahl2+iZahl3;
 lbAusgabe.caption:=floattostr(iErgebnis); //wenn du integer genommen hast schreibst du inttostr
end;


Bob - Mo 08.05.06 21:46

Ok...danke schön...muss ich dann mal probieren morgen :)


Bob - Do 18.05.06 16:46

Also ich bin jetzt eigentlich so gut wie fertig:) Danke schon mal an alle die mir mal irgendwie geholfen haben. Nur ein Problem hab ich noch.
Ich möchte am ende jetzt eine while Schleife einbauen die wie folgt aussieht:

Delphi-Quelltext
1:
2:
3:
while StrToFloat(label34.caption) >=15  do

Image1.Picture.LoadFromFile('pokal.bmp');


Das heisst ja wenn laben34.caption größer gleich 15 ist, dass dann das Bild erscheinen soll.Nur sobald die Zahl größer gleich 15 ist, hängt sich das programm auf und ich kann nur Programm zurück setzen machen. Wenn ich allerdings diesen Befehl außerhalb der Schleife verwende, dann funkitoniert es...hat jemand eine Idee woran es liegen kann?


Horschdware - Do 18.05.06 16:51

while ist ein schleife.

in worten heisst dein code:

Solange die "Zahl" in Label 1 größer oder gleich 15 ist, solange immer wieder das bild reinladen.
da sich die zahl während dem bild-laden nicht ändert hast du somit eine endlosschleife die auf ewig das bild lädt.


mit einem if sollte das gehen:

Delphi-Quelltext
1:
2:
if StrToFloat(label34.Caption) >= 15 then
  Image1.Picture.LoadFromFile('pokal.bmp');


wenn das bild einmal geladen wurde musst du es nicht nochmal laden - es sei denn du willst ein anderes bild laden.


Bob - Sa 20.05.06 01:42

Ja das klingt logisch...
Das Dumme ist nur ich muss da ne Schleife einbauen...hat vllt jemand eine Idee was man für eine Schleife, bzw was für einen Zweck sie haben kann,man bei solch einem Projekt venutzen kann?


der Berliner - Sa 20.05.06 12:54

Warum mußt du denn in einer schleife das Bild laufend laden ?
Horschdware hat dir doch schon ne Lösung angeboten.
immer wieder das selbe Bild inner schleife aufend zu laden ist doch blödsinn.
Gruß


Bob - Sa 20.05.06 17:32

Also ne so war das nicht gemeint..ich brauch keine Schleife ür das Bild..sondern einfach so ne Schleife...nur mir fällt nicht ein was eine Schleife in dem projekt bezwecken kann...es kann auch was sein was net unbedingt mit dem Tippspiel zusammenhöngt sondern allgemein mit Fussball..nur mir fällt absolut nichts ein und andere die ich gefragt habe auch nicht...


der Berliner - Sa 20.05.06 18:31

Hmmm, lass doch alle WM-Teilnehmer in einem Label nacheinander anzeigen.
zb.: mit ner for Schleife.

Alle teilnehmer in ein *.txt datei und die dann Zeilenweise in einer schleife auslesen.

HINWEIS: Die EXE lässt sich erst beenden wenn alle Teilnehmer angezeigt wurden.
gruß