Представляя Змею
Создать игру Snake довольно просто. Первое, что вам нужно, это способ изобразить тело вашей змеи. Если вы считаете, что ваша змея состоит из блоков или плиток, ваше тело может быть просто списком координат этих блоков.
В вашем случае, если вы намереваетесь создать консольное приложение, каждый из них будет символом на консоли, а позиция будет соответствовать одной строке или строке вывода консоли. Итак, вы начинаете с этого:
// List of 2D coordinates that make up the body of the snake
List<Point>() body = new List<Point>();
На данный момент ваш список пуст, поэтому у вашей змеи нет тела. Допустим, вам нужна змея длиной 5, и голова должна начинаться в положении (5,2) и расти вниз. Просто добавьте эти позиции в список при запуске игры, например:
// 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));
}
Рендеринг Змеи
Для рендеринга просто нарисуйте символ в каждой позиции в списке тела. Например, приведенный выше пример можно нарисовать так:
...................
...................
.....O............. -- y = 2
.....#.............
.....#.............
.....#.............
.....V.............
...................
|
x = 5
Вы можете усложнить задачу, выбрав разные символы для головы персонажа (первый элемент в списке) и хвоста (последний элемент в списке) и даже ориентировать их в зависимости от положения соседних блоков. Но для начала, просто визуализируйте все как #
или что-то.
Например, вы можете начать с двухмерного массива char, содержащего фон:
// 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] = '.';
И затем перебираем тело змеи, вытягивая его в массив:
// Render snake
foreach(Point point in body)
render[point.X, point.Y] = '#';
И, наконец, перебираем массив снова и записываем каждый символ в консоль с переносом строки в конце каждой строки.
// Render to console
for(y=0; y<height; ++y)
{
for(x=0; x<width; ++x)
{
Console.Write(render[x,y]);
}
Console.WriteLine();
}
Перемещение Змеи
Наконец, движение. Первое, что вам нужно, это следить за Direction
движением змеи. Это может быть простое перечисление:
// Enum to store the direction the snake is moving
enum Direction { Left, Right, Up, Down }
И действие перемещения змеи может быть сделано, просто удаляя последний блок из списка и добавляя его вперед, в правильном направлении . Другими словами что-то вроде:
// 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);
Каждый раз, когда тикает таймер, вы обновляете местоположение змеи и рисуете фигуры на новых местах.
Используйте System.Windows.Forms.Timer для фонового действия, чтобы вызвать игру, чтобы переместить змею вокруг.
Используйте классы и наследование для структуры
источник