Hi
1)
Also...dass da die Position der am Anfang vorhandenen Schlangenteile berechnet wird,
ist ja klar. Wenn man mal so tut, als ob die zwei while-Schleifen nicht existieren:
Höhe und Breite vom Panel halbieren ergbit als Koordinaten gesehen die Mitte.
Dort kommt dann (bei der for Schleife unten) als Erstes der Kopf hin).
Jedes weitere Teil ist dann 10 auf der y-Achse weiterverschoben, also vertikal stehende Schlange.
Jetzt muss sichergestellt werden, dass die Koordinaten immer nur Vielfache von 10 sind.
zB. wenn die Schlange oben/unten ausgerichtet ist, kann das Kopfkästchen auf der x-Achse
zB. zwischen 100 und 110 sein, oder 240-250 usw. Aber nicht sowas wie 123-133.
Grund: Das Futter wird auch auf 10-Vielfache ausgerichtet,
damit stellt man sicher, dass das Futter immer genau in der "Spur" der Schlange liegt.
Wenns nur irgendwie zufällig wäre könnte das Futter auch mal zwischen
zwei Schlangenspuren liegen. Schaut komisch aus und erschwert die Kollisionsberechnung.
So, also immer Vielfache von 10 Pixeln bei den Koordinaten.
Der Kopf beginnt in der Panelmitte.
Was ist aber, wenn das Panel zB. 344x266 groß ist?
Jeweils die Hälfte, der Kopf wäre an 172x133.
Mit den zwei while-Schleifen wird das jetzt auf 10er aufgerundet, in dem Fall 180x140
% ist keine normale Division wie / sondern der Rest
(Grundschule/Volkschule: 172 durch 10 ist 17 und 2 Rest. Dieser Rest).
172/10 bei float/double wäre korrekt 17.2,
bei ints (die ja keine Kommastellen können) 17 und mit % (genannt Modulo) Rest 2.
Die Schleifen addieren jetzt solange 1, bis der Rest 0 ist, also ein voller Zehner erreicht ist.
Die (etwas umständliche) Vorgehensweise passt dienem Lehrer hier wohl nicht,
das könnte man mit einer gezielten Addition auch lösen. Statt eine Schleife +1, +1, +1...
C#:
x = x - x%10 + 10;
y = y - y%10 + 10;
statt der zwei while-Schleifen hat den selben Effekt, auf die nächste volle 10 aufrunden
(zuerst abrunden, indem alles subtrahiert wird, was über 10 raussteht,
dann +10 ist man beim höheren Rundungsende).
Bei der Futterpositionierung sind übrigens auch zwei solche while-Schleifen,
können auch so gemacht werden.
2) Ist doch schön, mehr Zeit.
Der Lehrer hat die Ranzerei hier wohl gelesen
Beenden: Beide Timer beenden (wie beim Gameover)
und Form.Close (so irgendwie, Google
)
Das Form-closen könnte man übrigens auch beim Gameover noch einbauen.
Pause: Eine Variable, die bei den Menüpunkten umstellen,
und beim Timer jedesmal fragen, ob die Variable auf "An" steht, sonst nichts machen.
C#:
if(inBetrieb == 1) {alles machen}
Neu:
Schlange: Die snakeSegments vom panel nehmen, löschen (List leeren)
(so wie bei den Fruitpoints beim Fressen:
C#:
this.panel1.Controls.Remove(fp);
this.fruitPoints.Remove(fp);
fp.Dispose();
Sowas in der Art für alle Schlangenteile, dann InitSnake ausführen,
das erstellt die Grundschlange wieder.
Neu: Futter: Auch entsprechend alle vorhandenen Futterteile weg.
Highscore: In einer Variable mitzählen, wie oft etwas gefressen wurde.
Beim Menüpunkt eine Messagebox mit der Zahl ausgeben.
(Aufpassen, dass die Events der Menüpunkte nicht durcheinanderkommen ;-])
3)
Mit Listing wird er den Code meinen.
Delegate...später
Muss leider auch noch was tun heut.