Rekursion

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

The Yeti

Betreff: Rekursion

BeitragFr, Sep 10, 2004 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hier soll eigentlich ein Karo malen (brauch ich für ne Bewegung, also wundert euch nicht über die umständliche Art und Weise Wink ), aber es funzt nur (dann aber halt nur zur Hälfte), wenn ich eine der Rekursionen entferne, bei denen die Y-Parameter geändert werden.

Code: [AUSKLAPPEN]
Graphics 1024,768,16,2
Global Basebild=LoadImage("Graphics/Base.PNG")
Global bewegungsbild=CreateImage (401,401)

Function move(px,py,x,y,counter)
If counter<200
Plot x,y
If Not ImageRectCollide(bewegungsbild,0,0,0,x,y+1,1,1) Then move(0,0,x,y+1,counter+1)
If Not ImageRectCollide(bewegungsbild,0,0,0,x,y-1,1,1) Then move(0,0,x,y-1,counter+1)
If Not ImageRectCollide(bewegungsbild,0,0,0,x+1,y,1,1) Then move(0,0,x+1,y,counter+1)
If Not ImageRectCollide(bewegungsbild,0,0,0,x-1,y,1,1) Then move(0,0,x-1,y,counter+1)
EndIf
If counter=0
DrawImage Basebild, x-20, y-20
SetBuffer BackBuffer()
DrawImage bewegungsbild,px-200,py-200
EndIf
End Function

Repeat
Cls
WaitMouse
SetBuffer ImageBuffer(bewegungsbild)
Cls
move(MouseX(),MouseY(),200,200,counter)
Flip
Until KeyHit(1)
End



EDIT: Hab´s jetzt anders (besser) gemacht. Interesse, was falsch war, ahb ich aber immer noch Smile .
 

sdjh

BeitragSa, Sep 11, 2004 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei meinem Überflug des Textes fand ich keine Endbedingung.

Rekursionen sollten auch irgendwann aufhören ^^.

The Yeti

BeitragSa, Sep 11, 2004 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Ding hört auf, sich weiter selbst abzurufen, wenn counter>199.
 

zocker2150

BeitragMo, Sep 13, 2004 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
HI,

(falls das der vollständige code ist...)

ich würde counter einen startwert geben.

Code: [AUSKLAPPEN]
Function move(px,py,x,y,counter)
If counter<200 Then  <--- Then würde ich hier mal reinmachen (End If dann nicht vergessen).


Dann seh ich noch ein Problem mit
Code: [AUSKLAPPEN]
If Not ImageRectCollide(bewegungsbild,0,0,0,x,y+1,1,1) Then move(0,0,x,y+1,counter+1)

das bedeutet ja, das er so lange runterläuft (y+1), bis eine Kollision stattfindet.
Wenn dem nicht der fall ist läuft der counter bis 199 und er geht aus der Funktion.
Die anderen prüft er ja solange nicht.
Müsste man mal mit dem Debuger nachschauen aber ich bin mit fast sicher, das er gleich aus der Funktion raussprinkt und sich selber wieder aufruft.

Dann geht das Hauptprogramm weiter mit...
Code: [AUSKLAPPEN]
move(MouseX(),MouseY(),200,200,counter)

...was dann keinen Sinn mehr machen kann weil "counter" schon 199 ist.

Hoffe ich konnte helfen Smile

Blatolo

BeitragDi, Sep 14, 2004 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach den counter global und übergib ihn nicht als parameter.
Im main loop als 5. parameter counter zu übergeben ist sinnlos da diese variable immer 0 ist da sie nicht global ist.
Denn sonst wird die funktion 4^200 mal aufgerufen, wenn jedes mal die funktion 4 mal aufgerufen wird.
Und das ist natürlich klar dass der speicher überlastet wird.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group