Autor Beitrag
Lazarusboy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Do 08.09.11 19:13 
Hallo Leute,
Ich brauche eure Hilfe.
Ich soll einen Ball mit Delphi zeichen, der sich in einem begrenzten Raum zufällig bewegen soll.
Nur funktionert bei mir random nicht richtig, er bewegt sich immer noch in eine richtung.
wo liegt hier in der procedure der Fehler?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TBall.Bewegen;
begin
RX:=0;
RY:=0;
Ball:=TBall.Create(500,450,80);
Form1.Canvas.Ellipse(x,y,x+s,y+s);
repeat
tempx:=1;
tempy:=1;
randomize;
RX:=random(1)-2;
RY:=random(1)-2;
X:=x+tempx+RX;
y:=y+tempy+RY;
Form1.DoubleBuffered:=true;
Form1.Canvas.Ellipse(x,y,x+s,y+s);
Form1.Refresh;
until (x>(950-s)) or (x<=101or (y>(600-s)) or (y<=151);
Form1.Canvas.Ellipse(x,y,x+s,y+s);



Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 08.09.2011 um 21:29
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 08.09.11 19:33 
Hallo,

das ist alles etwas wirr.
Innerhalb von Tball.Bewegen erstellst Du einen neuen Ball in Zeile 5 oder ueberschreibst einen global vorhandenen.
Die Zeile muss weg.
Randomize wird nur einmal im gesamten Programm aufgerufen und gut ist.
Es hat also nichts innerhalb der Schleife zu suchen, also eher bei der Erstellung der Form.

ausblenden Delphi-Quelltext
1:
RX:=random(1)-2;					

Random(1) ist immer 0
random(n) erzeugt Zahlen von 0..n-1, also n verschiedene Zahlen.
Gemeint war wohl, Zahlen aus [-1..+1] zu erzeugen:
RX:=random(3)-1;
tempx und tempy muessen auch noch verschwinden...


Grusz Horst

Für diesen Beitrag haben gedankt: Lazarusboy
Lazarusboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Do 08.09.11 19:44 
okay danke soweit, aber wenn ich das nun teste, bewegt sich der Ball nun überhaupt nicht mehr.
hier der ganze Quelltext.
ausblenden volle Höhe 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:
46:
47:
48:
49:
50:
51:
52:
53:
54:
constructor TBall.Create(Posx,Posy,Size:integer);
begin
x:=PosX; y:=PosY; s:=Size;
end;

procedure TBall.Bewegen;
begin
Form1.Canvas.Ellipse(x,y,x+s,y+s);
repeat
X:=x+RX;
y:=y+RY;
Form1.DoubleBuffered:=true;
Form1.Canvas.Ellipse(x,y,x+s,y+s);
Form1.Refresh;
until (x>(950-s)) or (x<=101or (y>(600-s)) or (y<=151);
Form1.Canvas.Ellipse(x,y,x+s,y+s);
stop:=true;
end;

  //hier ggf. Code ergänzen


//-------- Refresh (public) --------------------------------------------
destructor TBall.Destroy;
begin
Form1.Destroy;
inherited Destroy;
  //hier ggf. Code ergänzen
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Dauerschleife:=True;
Ball:=TBall.Create(100,150,80);
Form1.Canvas.Brush.Color:=clRed;
stop:=false;
randomize;
RX:=random(10)-5;
RY:=random(10)-5;
end;

procedure TForm1.BStartClick(Sender: TObject);
begin
Ball.Bewegen;
end;

procedure TForm1.BStopClick(Sender: TObject);
begin
Ball.Destroy;
Stop:=true;
end;


end.
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 08.09.11 20:04 
Hallo,

Hallo,

wie sieht dein Objekt/Klasse TBall denn komplett aus.
Dort koennten auch die maximalen Bewgungsgrenzen (950-s,100,600-s,151 ) als Properties stehen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TBall.Bewegen;
// Bewegt den Ball in eine zufaellige Richtung 
var
  rx,ry: integer;
begin
Form1.Canvas.Ellipse(x,y,x+s,y+s);//lieber (TBall.)Draw(Form1.canvas) ???
rx := random(10)-5;
ry := random(10)-5;
while (x<(950-s)) AND (x>101AND (y<(600-s)) AND (y>151do
  begin
  Form1.Canvas.Ellipse(x,y,x+s,y+s);
  Form1.Refresh;
  X:=x+RX;
  y:=y+RY;
  end
stop:=true;
end;


Besser solltest Du rx,ry in TBall speichern und solange bewege aufrufen, bis Stopp wahr ist.
Ist stop eine Eigenschaft von TBall ?

Grusz Horst
Fiete
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 603
Erhaltene Danke: 340

W7
Delphi 6 pro
BeitragVerfasst: Fr 09.09.11 12:46 
Moin Lazarusboy,
vielleicht hift Dir www.delphi-forum.de/...ng+in+OOP_80910.html
Gruß Fiete

_________________
Fietes Gesetz: use your brain (THINK)