Sry, gestern nichtmehr hier reingeschaut. Ich guck mir mal den Source an heut abend.
Edit.: Ok rekursiv tust da direkt nix aufrufen. Jedoch setzt du in Zeile 182 die Laufvariable wenn dass Futter in der schlange ist wieder auf 0, was wohl der Grund des Fehlers sein wird.
Rekursiv wäre es, wenn du eine Function in sich selbst aufrufst, z.B.:
Code:
Func snake()
If False Then snake()
EndFunc
wiki sagt dazu:
Quote:
|
Wird eine Rekursion zu häufig durchgeführt, so kann das Computerprogramm abstürzen, weil der Speicher irgendwann nicht mehr ausreicht. Bei jedem Aufruf wird der Stack neu beschrieben, allerdings werden die alten Variablen und Adressen manchmal dabei nicht zerstört. Es empfiehlt sich daher den Speicher per Hand freizugeben (falls dies möglich ist) oder auf Rekursive Programmierung zu verzichten, da sich alle Probleme theoretisch auch mit Schleifen lösen lassen.
|
Ich probier mal zu erklären wie ich an das Snake Futter Problem rangehen würde. Und zwar ist die Schlange ein Array und der leere Raum ist ein Array. Alle Elemente beider Arrays zusammengenommen ist die Gesamte Spielfläche. Also Schlange + leerer Raum, ohne dass ein Element doppelt vorkommt.
Wenn die Schlange sich nun in den raum bewegt kannst du mit _ArrayPush das Array der Schlange und dass Array des Raumes anpassen.
Wenn die Schlange etwas frisst, kannst du mit _ArrayAdd den neuen wert ans SnakeArray hängen und mit _ArrayDelete in den leerenRaumArray löschen. Neues Futter bekommst du nun direkt, indem du dir einen zufälligen Index von den leerenRaumArray erzeugst. Da ja nun alle elemente in dem leerenRaumArray nicht in der Schlange sind, hast du gleich beim ersten Versuch dein Futter.
Einziger Haken an der Sache, _ArrayPush funktioniert nur bei eindimensionalen Arrays. Also musst du entweder selber so eine Funktion schreiben, oder du brichst das 2d array in ein 1d array runter. Indem du z.b. die Pixel von 0 bis 90000 durchnummerierst. Oder sie in einen String umwandelst, also z.B. "23|15" und diesen dann später wieder splittest...