C# DeltaEngine Snake

Guten Morgen,

ich arbeite derzeit fleißig daran, mich mit der Spieleprogrammierung auseinanderzusetzen und sitze derzeit vor einem Snake Klon. Derzeit lässt sich die Schlange steuern…und das wars im Moment auch schon.

Das Problem besteht darin, dass ich beim Bewegen der Schlange ja nichtnur einen ‚neuen‘ Kopf bauen, sondern auch das letzte Stück der Schlange entfernen muss. Und letzteres bereitet mir Schwierigkeiten.

Das gesamte Spielfeld wird in einem 2D-Array gespeichert. Den Array habe ich gewählt, da ich plane, später eine Art „Levelbuilder“ zu schreiben, der eine Textdatei ausliest und bestimmte Zeichen in Spielelemente umwandelt (Items, Wände etc). Zum Beispiel:

##########
#000100###
#00020000#
##000000##
##00000###
#0000000##
##00##000#
#000##0#0#
#00000003#
##########

- Wand, 0 - leer, 1 - Körper, 2 - Kopf, 3 - Item

Die eigentliche Frage: Wie finde ich das Schwanzteil? Gibt es einen einfacheren Weg, um das Spielfeld zu zeichnen?

Die Board.cs:

class Board
{
#region Variablen
Rectangle drawArea = ScreenSpace.DrawArea;

Material2D mBackground = new Material2D(„SpaceBackground“);
Material2D mHead = Material2D.Default;

int iHeadPositionX = 0;
int iHeadPositionY = 49;

float fSpeed = 0.25f;
float fTime = 0.0f;

public static int[,] boardArray = new int[100, 100];

string sDirection = „r“;
#endregion

#region Constructor
public Board()
{
//Spielbrett mit 0’en füllen
fillBoard();
}
#endregion

#region Run
public void Run()
{
#region Input
//Auf Tastatureingaben reagieren
if (Input.Keyboard.CursorUpIsPressed && sDirection != „d“)
sDirection = „u“;
if (Input.Keyboard.CursorDownIsPressed && sDirection != „u“)
sDirection = „d“;
if (Input.Keyboard.CursorLeftIsPressed && sDirection != „r“)
sDirection = „l“;
if (Input.Keyboard.CursorRightIsPressed && sDirection != „l“)
sDirection = „r“;
#endregion

#region UpdateSnake
//Snake bewegen
move(sDirection);
#endregion

#region Draw
mBackground.Draw(Rectangle.One);
Font.Default.DrawTopLeft("FPS: " + Time.Fps);

//Das Spielbrett zeichnen
//0 - leer; 1 - Körper; 2 - Kopf;
for (int i = 0; i = fSpeed)
{
if (Direction == „u“)
{
//Kopf im boardArray verschieben
boardArray[iHeadPositionX, iHeadPositionY - 1] = 2;
//‚alten Kopf‘ zum Körper machen
boardArray[iHeadPositionX, iHeadPositionY] = 1;
//Variable mit der Kopfposition updaten
iHeadPositionY–;
//TODO: Letztes Stück der Schlange entfernen
}
else if (Direction == „d“)
{
boardArray[iHeadPositionX, iHeadPositionY + 1] = 2;
boardArray[iHeadPositionX, iHeadPositionY] = 1;
iHeadPositionY++;
}
else if (Direction == „r“)
{
boardArray[iHeadPositionX + 1, iHeadPositionY] = 2;
boardArray[iHeadPositionX, iHeadPositionY] = 1;
iHeadPositionX++;
}
else if (Direction == „l“)
{
boardArray[iHeadPositionX - 1, iHeadPositionY] = 2;
boardArray[iHeadPositionX, iHeadPositionY] = 1;
iHeadPositionX–;
}

//reseten des Timers
fTime = 0.0f;
}
}
}

Moin. Tut mir leid. So tief habe ich da leider nicht drin gesteckt. Ist inzwischen auch schon ne Weile her. Trotzdem viel Erfolg.
L.G.

Ich würde die Position(en) der Schlage in einer Liste speichern, z.B.
List snake = new List; oder in einer Queue. Point beinhaltet die Zellenposition (x,y).
Wenn sich die Schlange bewegt, wird vorne ein neues Element hinzugefügt und hinten eins wegenommen. Dieses kann dann Anhand der Spielfelddefinition neu gezeichnet werden. Anschliessend kann die Schlange gezeichnet werden.