Hoffe, du hast nichts dagegen, wenn statt rd4eva ich antworte
1)
rd4eva hat andere Nummern für die 4 Richtungen vergeben.
Links/Rechts sind -1 und 1
Unten/Oben -2 und 2
ri ist die aktuelle Richtung, nri die neue Richtung laut Tastendruck
Wenn ri+nri 0 ist, was bedeutet das dann? Entgegengesetzte Richtung.
zB. Schlange geht nach links und Benutzer will 180-Drehung nach rechts. Nicht erlaubt.
!= bedeutet "nicht gleich"
Also nur, wenn bei ri+nri nicht 0 rauskommt darf die neue Richtung übernommen werden
(und MoveSnake etc.)
Zweiter Teil der if-Bedingung: Wenn der Bentzer die Richtung drückt,
die die Schlange sowieso schon hat, kann man sich den Richtungswechselcode sparen.
3)
fp ist die Picturebox vom Futter, das gerade gefressen wurde.
Die wird unter Anderem aus der Futtersammlung rausgenommen etc., und dann das Dispose:
Mit "new Picturebox()" und Ähnlichem legt man ja neue Instanzen/Objekte von Klassen an.
Man muss sich aber nicht ums Aufräumen kümmern.
Hier:
C#:
Picturebox p;
p = new Picturebox();
p.machirgendwas();
...
p = new Picturebox();
p.machnochwas();
legst du beim zweiten new ja eine zweite Picbox an und schmeißt die erste praktisch weg.
Das wird beim C# automatisch erkannt, und alles von der ersten Picbox noch vorhandene
wird gelöscht. Großes Aber: Das muss nicht sofort passieren.
Je nachedem, wie ausgelastet der Prozessor gerade ist (etc.etc)
wartet der Aufräumdienst eventuell auf einen günstigen Zeitpunkt,
in dem der Computer gerade nicht so beansprucht ist,
und löscht dann allen angefallenen Müll in einem Schwung.
Es kann also passieren, dass sich "im Inneren" von C# viele alte Variablen ansammeln,
die in deinem Programm selbst eigentlich nicht mehr existieren.
Die brauchen Speicher. Und eine PictureBox mit ihrem Bild drin braucht
verglichen zu int´s und so extrem viel Speicher.
Um den Müllberg etwas einzudämmen kann man mit Dispose quasi eine Empfehlung abgeben,
das Ding jetzt schon wegzuräumen. Grade bei speicherhungrigen Sachen gut,
um zu viel Anhäufung zu Vermeiden.
Wenn man kein Dispose macht könnte das Programm zeitweise eben mehr Arbeitsspeicher
brauchen. Bei anderen Programmen (nicht Snake) eventuell mehr, als man überhaupt hat.
Deswegen Dispose.
2)
Zugriff auf die Variablen der grafischen Oberfläche (Pictureboxen, Panel, usw.)
soll/darf nur in dem Thread erfolgen, in dem das Fenster erstellt wurde.
Wenn man also zusätzlich zum schon vorhandenen Hauptthread weitere eigene erzeugt,
die gleichzeitig dazu ablaufen, kann man von dort aus eigentlich nichts mit dem Fenster machen.
Ein Workaround ist diese Invokegeschichte. Am Beispiel Movesnake:
"wenn ich hier in einem nichtpassenden Thread bin starte Movesnake
mit Grafikzugriff nocheinmal. Sonst eben das normale Zeug machen"
Movesnake kommt ja uA. im Timer vor.
Der wartet nebenbei, neben der Fensteranzeigung, und führt regelmäßig was aus.
Von daher könnte man ihn eigentlich als Thread sehen.
Soweit ich weiß ists aber kein Thread (sondern gehört zu den normalen Fensterereignissen,
"This Windows timer is designed for a single-threaded environment"),
das Invokezeug könnte man sich dann also sparen.
Andererseits schadet es nicht, auch wenn es keine anderen Threads gibt.
edit: Je nach verwendetem Timer ists einer oder nicht.
System.Timers.Timer ist mit Threadzeug, Windows.Forms.Timer ohne...
Was genau ein delegate ist und wie das hier rein passt...
unterhalten wir uns nach der Abgabe darüber
Über Delegates kann man auch einiges erzählen.