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# с нуля: первый проект через dotnet new
- List, Dictionary и LINQ в C#
- Классы и свойства в C#: первый пример
- Рубрика C#
Что почитать дальше по C#
Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:
- C# для начинающих: что учить первым и как сделать первый результат
- C# обучение: план на первые недели без хаоса
- C# с нуля: первый проект через dotnet new
- Игры на C#: с чего начать новичку