Snake Tutorial - Ja oder Nein?

04/09/2010 18:39 Shadow992#16
Quote:
Originally Posted by .nAno View Post
ok, wie versprochen veröffentliche ich hier schonmal den Source Code.
Ich hab mir die Sache mit dem Tutorial nochmal durch den Kopf gehn lassen und mich entschieden lieber eine Art Workshop daraus zu machen ;)

Ziel davon soll es sein das Programm selbeständig und ohne größere Hilfe (abgesehn von kleinen Tipps) selber nochmal zu schreiben.
Ich werd dann in nem Spoiler am Ende des Tutorials natürlich auch den Source nochmal einfügen, falls man mal wirklich nicht weiterkommt.

Die bereits erwähnten Tipps befassen sich nicht mit den Funktionen die verwendet werden (da ich nichts weiter Ausgefallenes gebraucht habe sollte jeder etwas Fortgeschrittene das auch so verstehn ;)) sondern mit hartnäckigen Fehlerquellen oder Stellen an denen ich selber Probleme hatte.

Im Moment ist mir allerdings noch ein kleiner Bug bekannt:

Wenn man ne höhere Punktzahl erreicht friert sich das Programm irg. wann ein
Grund: Ich hab nen Scanner eingebaut der überprüft ob sich ein neues Futterkorn (also wenn die Schlange das Alte gefressen hat und eine Neues her muss) unter einem Segment des Körpers befindet.
Falls ja, soll er solange ne neue zufällige Position wählen und scannen bis alles passt.
Wenn das nun aber recht viele Körpersegmente sind ist a) die Warscheinlichkeit höher, dass die neue Position sich an einer schlechten Stelle befindet und b.) das Scannen dauert länger

Lösung:
1.) Den Pc über den Tag stehn lassen und warten (hat bei mir nach ca. 3 Stunden wieder geklappt :D)

2.) ...warten bis zum Workshop ;)

Ich denke ich werd ihn soweit mir nichts dazwischen kommt Samstag oder Sonntag schreiben, bis dahin:

Viel Spaß mit dem Source :)
Ach Schade und ich dachte du hast das mit GDI Plus gemacht ...
04/09/2010 18:43 .nAno#17
Ich fühl mich mit GDI noch nicht wirklich wohl und als ich hiermit begonnen hab hatte ich noch gar keinen Plan davon...

Vllt. mach ich das nächste Game damit (auch wenn ich jetzt wohl kaum zu jedem nen Tut oder so machen werde o0)
04/09/2010 19:01 HardCore.1337#18
Quote:
Ach Schade und ich dachte du hast das mit GDI Plus gemacht ...
.

Hab ich ihm auch gesagt, aber seine Umsetzung ist auch gut gemacht. GDI+ wäre hier nicht nötig. Es wäre eher ein Problem für die Anfänger.
Würde man ein größeres Projekt erstellen geb ich dir recht. GDI+ ist schneller und in großen Code´s auch strukturierter. Aber ich hab kein Problem, dass das Projekt mit GUI Elementen erstellt wurde ;)
04/09/2010 19:03 Shadow992#19
Quote:
Originally Posted by General Desert View Post
.

Hab ich ihm auch gesagt, aber seine Umsetzung ist auch gut gemacht. GDI+ wäre hier nicht nötig. Es wäre eher ein Problem für die Anfänger.
Würde man ein größeres Projekt erstellen geb ich dir recht. GDI+ ist schneller und in großen Code´s auch strukturierter. Aber ich hab kein Problem, dass das Projekt mit GUI Elementen erstellt wurde ;)
Ich habe auch kein problem damit , aber GDI+ hätte mich mehr interessiert als GUI-Elemente ;)
04/09/2010 19:05 .nAno#20
ich probier das mal zu brücksichtigen, wenn ich soweit bin mit GDI ;)
04/12/2010 18:33 | Moep |#21
Quote:
Originally Posted by .nAno View Post
...Wenn man ne höhere Punktzahl erreicht friert sich das Programm irg. wann ein
Grund: Ich hab nen Scanner eingebaut der überprüft ob sich ein neues Futterkorn (also wenn die Schlange das Alte gefressen hat und eine Neues her muss) unter einem Segment des Körpers befindet.
Falls ja, soll er solange ne neue zufällige Position wählen und scannen bis alles passt.
Wenn das nun aber recht viele Körpersegmente sind ist a) die Warscheinlichkeit höher, dass die neue Position sich an einer schlechten Stelle befindet und b.) das Scannen dauert länger...
Ich hab mir zwar deinen Source nicht angeschaut, bin grad auf Arbeit, aber so wie du den Fehler beschreibst scheint es mir dass du einen rekursiven Functionsaufruf nutzt beim scannen. Dadurch kann ein Stackoverflow entstehen, wodurch die Funktion nie beendet wird und sich dass Programm aufhängt.
04/12/2010 19:02 .nAno#22
Naja, gegen den Stackoverflow würde ja ne spezielle Speicherverwaltung helfen, Ich glaub aber ehr, dass es für die von dir genannte rekursive Funktion teilweise keinen Abbruch gibt ;)

Ich hab mal MsgBoxen in die Funktion eingesetzt umzu sehn wieoft das Programm durchläuft bis es eine Lösung gibt, nach ca. 10 Körperteilen wird die Überprüfung mehr als 1mal wiederholt, ab 20 oft deutlich mehr als 5mal (Im Spiel merkt man da nichts von, da das alles ja rasend schnell geschieht ).
Die MsgBoxen werden auch wenn lange keine Lösung gefunden wird immer wieder angezeigt.
Würde mich aber trotzdem freuen, wenn du mir mal genaueres dazu nach der Arbeit sagen könntest, wenn du dir den Source mal angesehn hast, bei meinem Praktikum hab ich nur sograde an der Oberfläche gekratzt was das angeht :o
04/13/2010 15:33 | Moep |#23
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...