C # создание простой игры змеи

12

Я думал о создании игры со змеями на C #, поэтому у меня возникли идеи, и возникли некоторые проблемы.

Как я могу отслеживать и выводить в правильном месте блоки, которые бегут за головой змеи?

Если змея построена из пяти блоков, и пользователь начинает двигаться по кругу, как я могу напечатать тело змеи в нужном месте?

Кроме того, как я могу создать действие, которое будет выполняться в фоновом режиме, которое будет перемещать змею вперед, независимо от того, что делает пользователь?

Какую структуру должен иметь мой код? (структура дизайна кода)

Это должно быть консольное приложение, так как это единственная среда, с которой я знаком.

Я не ищу готовый код, так как хочу по-настоящему понять, как он должен работать.

Новак
источник

Ответы:

23

Представляя Змею

Создать игру 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);
Дэвид Гувея
источник
5
Хороший призыв к перемещению последнего блока вперед для движения!
SpartanDonut
Отличный ответ. Мне нравится, как ты двигаешь змею - это довольно элегантно.
Cypher
-3
  1. Каждый раз, когда тикает таймер, вы обновляете местоположение змеи и рисуете фигуры на новых местах.

  2. Используйте System.Windows.Forms.Timer для фонового действия, чтобы вызвать игру, чтобы переместить змею вокруг.

  3. Используйте классы и наследование для структуры

Адам Брусс
источник
Это очень расплывчатый ответ. Шаг номер три особенно.
MichaelHouse