C#

Как сделать змейку на C#: план мини-игры для новичка

Змейку на C# проще всего начать как консольную игру: поле из клеток, координаты головы, список координат тела, направление движения, еда и игровой цикл. Полную игру лучше собирать постепенно. Если сразу писать меню, очки, уровни и красивую графику, новичок быстро теряет главное: как меняется состояние игры

Из чего состоит змейка

Минимальная змейка состоит из пяти частей:

  • поле с шириной и высотой;
  • тело змейки как список координат;
  • направление движения;
  • еда на случайной клетке;
  • цикл, который читает клавиши, двигает змейку и перерисовывает поле.

Для координаты удобно использовать кортеж:

List<(int X, int Y)> snake = new()
{
    (10, 5),
    (9, 5),
    (8, 5)
};

Первый элемент списка — голова. Остальные элементы — тело

Направление движения

Направление можно хранить двумя числами: изменение по X и изменение по Y

int dx = 1;
int dy = 0;

Так змейка движется вправо. Влево будет dx = -1, вверх dy = -1, вниз dy = 1

Чтение клавиши:

if (Console.KeyAvailable)
{
    ConsoleKey key = Console.ReadKey(true).Key;

    if (key == ConsoleKey.UpArrow)
    {
        dx = 0;
        dy = -1;
    }
    else if (key == ConsoleKey.DownArrow)
    {
        dx = 0;
        dy = 1;
    }
    else if (key == ConsoleKey.LeftArrow)
    {
        dx = -1;
        dy = 0;
    }
    else if (key == ConsoleKey.RightArrow)
    {
        dx = 1;
        dy = 0;
    }
}

В реальной игре стоит запретить разворот на 180 градусов, чтобы змейка не проходила сразу в свое тело

Как двигать змейку

Движение работает так: считаем новую голову, добавляем ее в начало списка, а последний элемент удаляем. Если змейка съела еду, хвост не удаляем — так она растет

var head = snake[0];
var newHead = (X: head.X + dx, Y: head.Y + dy);

snake.Insert(0, newHead);
snake.RemoveAt(snake.Count - 1);

Это главный принцип змейки. Не нужно двигать каждую клетку отдельно вручную: список сам сохраняет след прошлого положения

Игровой цикл

Игровой цикл повторяет одни и те же шаги:

while (true)
{
    ReadInput();
    MoveSnake();
    Draw();
    Thread.Sleep(120);
}

Thread.Sleep(120) замедляет игру, чтобы змейка не летела слишком быстро. Позже скорость можно уменьшать по мере набора очков

Рисование в консоли

Для простого старта очищайте консоль и печатайте поле заново:

Console.Clear();

foreach (var part in snake)
{
    Console.SetCursorPosition(part.X, part.Y);
    Console.Write("O");
}

Console.SetCursorPosition(food.X, food.Y);
Console.Write("*");

Это не самый производительный способ, но для учебной игры подходит. Главное — понять логику

Столкновения

Игра заканчивается, если голова вышла за границы поля или попала в тело

bool hitWall = newHead.X < 0 || newHead.X >= width || newHead.Y < 0 || newHead.Y >= height;
bool hitBody = snake.Skip(1).Contains(newHead);

if (hitWall || hitBody)
{
    Console.WriteLine("Игра окончена");
    break;
}

Для Skip понадобится using System.Linq;, если проект не подключает его автоматически

Частые ошибки

Первая ошибка — пытаться сделать всю игру одним огромным методом. Разделите на ReadInput, MoveSnake, Draw, SpawnFood. Вторая — забыть, что координаты в консоли начинаются с нуля. Третья — удалять хвост даже когда еда съедена. Четвертая — не проверять столкновение с телом

Мини-задача: сделайте змейку, которая просто движется по полю и управляется стрелками. Потом добавьте еду. Только после этого добавляйте счет, ускорение и экран окончания игры

Что почитать дальше по C#

Что почитать дальше по C#

Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x