Representando a la serpiente
Crear un juego de Snake es bastante simple. Lo primero que necesita es una forma de representar el cuerpo de su serpiente. Si considera que su serpiente está compuesta de bloques o fichas, su cuerpo puede ser simplemente una lista de las coordenadas de estos bloques.
En su caso, si intenta hacer una aplicación de consola, cada uno de estos será un carácter en la consola y la posición correspondería a una línea o fila de la salida de la consola. Entonces comienzas con esto:
// List of 2D coordinates that make up the body of the snake
List<Point>() body = new List<Point>();
En este punto, su lista está vacía, por lo que su serpiente no tiene cuerpo. Digamos que quieres una serpiente de longitud 5 y la cabeza debe comenzar en posición (5,2) y crecer hacia la parte inferior. Simplemente agregue esas posiciones a la lista cuando comience el juego, por ejemplo:
// Initialize the snake with 5 blocks starting downwards from (5,2)
for(int i=0; i<5; ++i)
{
body.Add(new Point(5, 2 + i));
}
Renderizando la serpiente
Para renderizar solo dibuje un carácter en cada posición en la lista del cuerpo. El ejemplo anterior, por ejemplo, podría dibujarse como:
...................
...................
.....O............. -- y = 2
.....#.............
.....#.............
.....#.............
.....V.............
...................
|
x = 5
Puede ser más complicado eligiendo diferentes personajes para la cabeza del personaje (primer elemento de la lista) y la cola (último elemento de la lista) e incluso orientarlos según las posiciones de los bloques adyacentes. Pero para empezar, solo renderiza todo como #
ao algo.
Por ejemplo, podría comenzar con una matriz de caracteres 2D que contiene el fondo de esta manera:
// Array with map characters
char[,] render = new char[width, height];
// Fill with background
for(x=0; x<width; ++x)
for(y=0; y<height; ++y)
render[x,y] = '.';
Y luego iterar sobre el cuerpo de la serpiente dibujándolo a la matriz:
// Render snake
foreach(Point point in body)
render[point.X, point.Y] = '#';
Y finalmente repita la matriz nuevamente y escriba cada carácter en la consola, con un salto de línea al final de cada fila.
// Render to console
for(y=0; y<height; ++y)
{
for(x=0; x<width; ++x)
{
Console.Write(render[x,y]);
}
Console.WriteLine();
}
Moviendo la serpiente
Finalmente, movimiento. Lo primero que necesita es hacer un seguimiento de Direction
la serpiente en movimiento. Esto puede ser una enumeración simple:
// Enum to store the direction the snake is moving
enum Direction { Left, Right, Up, Down }
Y el acto de mover la serpiente se puede hacer simplemente eliminando el último bloque de la lista y agregándolo al frente, en la dirección correcta . En otras palabras, algo como:
// Remove tail from body
body.RemoveAt(body.Count - 1);
// Get head position
Point next = body[0];
// Calculate where the head should be next based on the snake's direction
if(direction == Direction.Left)
next = new Point(next.X-1, next.Y);
if(direction == Direction.Right)
next = new Point(next.X+1, next.Y);
if(direction == Direction.Up)
next = new Point(next.X, next.Y-1);
if(direction == Direction.Down)
next = new Point(next.X, next.Y+1);
// Insert new head into the snake's body
body.Insert(0, next);