Rappresentare il serpente
La creazione di un gioco Snake è piuttosto semplice. La prima cosa di cui hai bisogno è un modo per rappresentare il corpo del tuo serpente. Se consideri il tuo serpente costituito da blocchi o tessere, il tuo corpo può semplicemente essere un elenco di queste coordinate di blocchi.
Nel tuo caso, se intendi fare un'applicazione console, ognuna di queste sarà un carattere sulla console e la posizione corrisponderebbe a una riga o riga dell'output della console. Quindi inizi con questo:
// List of 2D coordinates that make up the body of the snake
List<Point>() body = new List<Point>();
A questo punto, la tua lista è vuota, quindi il tuo serpente non ha un corpo. Diciamo che vuoi un serpente di lunghezza 5 e la testa dovrebbe iniziare in posizione (5,2) e crescere verso il fondo. Basta aggiungere quelle posizioni all'elenco all'avvio del gioco, ad esempio:
// 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));
}
Rendering del serpente
Per il rendering basta disegnare un personaggio in ogni posizione nell'elenco del corpo. L'esempio sopra per esempio potrebbe essere disegnato come:
...................
...................
.....O............. -- y = 2
.....#.............
.....#.............
.....#.............
.....V.............
...................
|
x = 5
Puoi diventare più complicato scegliendo personaggi diversi per la testa del personaggio (primo elemento nella lista) e la coda (ultimo elemento nella lista) e persino orientarli a seconda della posizione dei blocchi adiacenti. Ma per cominciare, rendi tutto come #o qualcosa del genere.
Ad esempio, potresti iniziare con un array di caratteri 2D contenente lo sfondo in questo modo:
// 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 quindi scorrere il corpo del serpente attirandolo sull'array:
// Render snake
foreach(Point point in body)
render[point.X, point.Y] = '#';
E infine scorrere nuovamente l'array e scrivere ogni personaggio sulla console, con una interruzione di riga alla fine di ogni riga.
// Render to console
for(y=0; y<height; ++y)
{
for(x=0; x<width; ++x)
{
Console.Write(render[x,y]);
}
Console.WriteLine();
}
Spostare il serpente
Finalmente movimento. La prima cosa di cui hai bisogno è tenere traccia del movimento Directiondel serpente. Questo può essere un semplice enum:
// Enum to store the direction the snake is moving
enum Direction { Left, Right, Up, Down }
E l'atto di muovere il serpente può essere fatto semplicemente rimuovendo l'ultimo blocco dalla lista e aggiungendolo in avanti, nella direzione corretta . In altre parole qualcosa del tipo:
// 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);