Reprezentujący węża
Tworzenie gry Snake jest dość proste. Pierwszą rzeczą, której potrzebujesz, jest sposób na przedstawienie ciała twojego węża. Jeśli uważasz, że twój wąż składa się z bloków lub płytek, twoje ciało może być po prostu listą współrzędnych tych bloków.
W twoim przypadku, jeśli zamierzasz wykonać aplikację konsolową, każda z nich będzie znakiem na konsoli, a pozycja odpowiadałaby jednej linii lub wierszowi wyniku konsoli. Więc zacznij od tego:
// List of 2D coordinates that make up the body of the snake
List<Point>() body = new List<Point>();
W tym momencie twoja lista jest pusta, więc twój wąż nie ma ciała. Powiedzmy, że chcesz węża o długości 5, a głowa powinna zacząć w pozycji (5,2) i rosnąć w dół. Po prostu dodaj te pozycje do listy na początku gry, na przykład:
// 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));
}
Renderowanie węża
Do renderowania wystarczy narysować znak w każdej pozycji na liście treści. Powyższy przykład można na przykład narysować jako:
...................
...................
.....O............. -- y = 2
.....#.............
.....#.............
.....#.............
.....V.............
...................
|
x = 5
Możesz się bardziej skomplikować, wybierając różne znaki dla głowy postaci (pierwszy element na liście) i ogona (ostatni element na liście), a nawet zorientuj je w zależności od położenia sąsiednich bloków. Ale na początek renderuj wszystko jako #
coś lub coś.
Możesz na przykład zacząć od tablicy znaków 2D zawierającej tło w następujący sposób:
// 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] = '.';
A następnie iteruj po ciele węża, przyciągając go do tablicy:
// Render snake
foreach(Point point in body)
render[point.X, point.Y] = '#';
I w końcu powtórz iterację po tablicy i zapisz każdy znak w konsoli, z podziałem wiersza na końcu każdego wiersza.
// Render to console
for(y=0; y<height; ++y)
{
for(x=0; x<width; ++x)
{
Console.Write(render[x,y]);
}
Console.WriteLine();
}
Moving the Snake
Wreszcie ruch. Pierwszą rzeczą, której potrzebujesz, jest śledzenie Direction
poruszającego się węża. Może to być proste wyliczenie:
// Enum to store the direction the snake is moving
enum Direction { Left, Right, Up, Down }
Przesunięcie węża można wykonać po prostu usuwając ostatni blok z listy i dodając go z przodu we właściwym kierunku . Innymi słowy, coś takiego:
// 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);