Representando a cobra
Criar um jogo de cobra é bem simples. A primeira coisa que você precisa é uma maneira de representar o corpo da sua cobra. Se você considera sua cobra composta de blocos ou ladrilhos, seu corpo pode ser simplesmente uma lista dessas coordenadas de blocos.
No seu caso, se você pretende fazer um aplicativo de console, cada um deles será um caractere no console e a posição corresponderá a uma linha ou linha da saída do console. Então você começa com isso:
// List of 2D coordinates that make up the body of the snake
List<Point>() body = new List<Point>();
Neste ponto, sua lista está vazia, então sua cobra não tem corpo. Digamos que você queira uma cobra de comprimento 5 e a cabeça comece na posição (5,2) e cresça em direção ao fundo. Basta adicionar essas posições à lista quando o jogo começar, por exemplo:
// 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 a cobra
Para renderizar, basta desenhar um caractere em cada posição na lista de corpos. O exemplo acima, por exemplo, pode ser desenhado como:
...................
...................
.....O............. -- y = 2
.....#.............
.....#.............
.....#.............
.....V.............
...................
|
x = 5
Você pode ficar mais complicado escolhendo caracteres diferentes para a cabeça do personagem (primeiro elemento da lista) e cauda (último elemento da lista) e até orientá-los, dependendo das posições dos blocos adjacentes. Mas, para começar, basta renderizar tudo como #
algo ou algo.
Você poderia, por exemplo, começar com uma matriz de caracteres 2D contendo o plano de fundo da seguinte maneira:
// 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] = '.';
E então itere sobre o corpo da cobra, desenhando-o na matriz:
// Render snake
foreach(Point point in body)
render[point.X, point.Y] = '#';
E, finalmente, repita a matriz novamente e escreva cada caractere no console, com uma quebra de linha no final de cada linha.
// Render to console
for(y=0; y<height; ++y)
{
for(x=0; x<width; ++x)
{
Console.Write(render[x,y]);
}
Console.WriteLine();
}
Movendo a cobra
Finalmente, movimento. A primeira coisa que você precisa é acompanhar Direction
a cobra que está se movendo. Pode ser uma enumeração simples:
// Enum to store the direction the snake is moving
enum Direction { Left, Right, Up, Down }
E o ato de mover a cobra pode ser feito apenas removendo o último bloco da lista e adicionando-o à frente, na direção correta . Em outras palavras, 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);