C# Змейка в консоли / .NET Console Snake Game
Создание классической змейки в консольном приложении на C#
Обзор раздела: В этом разделе мы создадим консольное приложение для классической игры "Змейка" на языке программирования C#. Мы будем использовать структуры данных и на практике реализовывать различные аспекты игры.
Настройка окна приложения
- Установим глобальные переменные для ширины и высоты карты.
- Установим размер окна и буфера соответственно.
- Выключим курсор для вывода изображения.
Использование структуры пикселя
- Добавим новую структуру пикселя, которая будет содержать координаты x, y и цвет пикселя.
- Инициализируем свойства через конструктор.
- Добавляем метод отрисовки пикселя.
- Добавляем метод очистки экрана.
Отображение бортика в игре
- Создаем новый метод для отображения бортика в игре.
- Создаем объект пикселя и передаем координаты x, y и цвет бортика.
- Добавляем цикл для отрисовки вертикальных полос слева и справа.
Использование структуры змейки
- Змейка состоит из головы и тела. Голова - это просто пиксель, а тело представляет собой очередь из пикселей.
Реализация движения змейки
- Для реализации движения змейки используется очередь.
Создание класса змеи
Обзор раздела: В этом разделе мы создаем новый класс змеи и добавляем excel головы и очередь для тела. Мы также создаем конструктор, который принимает параметры начального положения головы x и y, цвета для головы и тела, а также начальный размер тела по умолчанию.
Создание нового класса змеи
- Добавляем новый класс змеи.
- Добавляем excel головы.
- Добавляем очередь для тела.
Создание конструктора
- Создаем конструктор.
- Задаем параметры начального положения головы x и y, цвета для головы и тела, а также начальный размер тела по умолчанию.
Инициализация в конструкторе
- Инициализируем нашу голову в конструкторе.
- Создаем цикл для тела, в котором мы будем добавлять пиксели начиная с хвоста проходим от длины тела до нуля при этом декомментируем наш код и вызываем метод and heel для добавления элементов в очередь.
- Добавляем метод отображения и очистки змеи с экрана.
Отрисовка прямо в конструкторе
- Вызываем метод отрисовки прямо в конструкторе.
- Создаем новый экземпляр змеи в нашей программе.
- Добавляем пару переменных для обозначения цветов для головы и тела.
Исправление метода движения
Обзор раздела: В этом разделе мы исправляем работу метода движения, который позволяет змее двигаться по направлению. Мы создаем новое перечисление in direction, которое содержит все возможные направления движения (вверх, вниз, влево и вправо).
Исправление работы метода движения
- Исправляем работу метода движения.
- Создаем новое перечисление in direction, которое содержит все возможные направления движения (вверх, вниз, влево и вправо).
- Используем направления как параметры для метода движения.
Добавление управления
Обзор раздела: В этом разделе мы добавляем управление змеей. Мы создаем новый метод для чтения управления, который принимает текущее направление и возвращает предыдущее направление, если ничего не нажато. Если что-то нажато, мы считываем эту кнопку.
Создание нового метода для чтения управления
- Создаем новый метод для чтения управления.
- Принимаем текущее направление и возвращаем предыдущее направление, если ничего не нажато.
- Считываем кнопки при нажатии на стрелочки.
Добавление глобальной переменной
Обзор раздела: В этом разделе мы добавляем глобальную переменную, которая означает перерыв между кадрами (200 миллисекунд), используя класс секундомера. Мы также проверяем прошло ли 200 миллисекунд в цикле и вызываем наш метод ритмов month.
Добавление глобальной переменной
- Добавляем глобальную переменную, которая означает перерыв между кадрами (200 миллисекунд).
- Используем класс секундомера для проверки прошедших 200 миллисекунд.
- Вызываем метод ритмов month.
Добавление условия для геймера
Описание раздела: В этом разделе мы добавляем условие для game over, которое произойдет, если змея упрется в борт или свое тело.
Добавление условия для game over
- Следующий шаг - это добавление условия для геймера.
- Game over произойдет есть змея упрется на головой в борт или же свое тело.
- При этом условии мы выйдем из цикла.
Перемещение основного цикла игры в отдельный метод start
Описание раздела: В этом разделе мы перемещаем основной цикл игры в отдельный метод start и не будем при запуске игру оси геймера с перерывом на одну секунду.
Перемещение основного цикла игры в отдельный метод start
- Переместим наш основной цикл играю в отдельный метод start и
- В мае не будем при запускать игру оси геймера с перерывом на одну секунду.
Генерация еды
Описание раздела: В этом разделе мы создаем метод генерации еды и используем цикл для случайной генерации еды.
Создание метода генерации еды
- У нас уже почти готовая змейка, но какая змейка без еды? Для генерации нам потребуется random.
- Создадим метод gen_food, который будет возвращать пиксель - то есть еду. В него мы будем передавать змею, чтобы еда случайно не генерировалась в самой змее.
- Используем цикл, чтобы в теле цикла случайно генерировать еду.
Вызов метода генерации еды и отрисовки
Описание раздела: В этом разделе мы вызываем метод генерации еды и отрисовки.
Вызов метода генерации еды и отрисовки
- Вызываем метод gen_food в основном теле игры.
- Вызываем метод отрисовки.
- Видим, что при перезапуске игры еда появляется в случайных местах.
Модификация движения змеи
Описание раздела: В этом разделе мы модифицируем движение для змей.
Добавление флага для движения змеи
- Добавим флаг, который будет отвечать за то, есть ли змея на движение или нет. Если есть, то мы просто не убираем pixels вас то при движении.
- В основном цикле игры проверяем попала ли наша голова на место еды.
- Если попало, то мы двигаемся с параметром "есть", если нет - просто двигаемся.
- Также, если мы попали на еду, мы генерируем новую еду.
Добавление переменной для очков
Описание раздела: В этом разделе мы добавляем переменную для очков и инкрементируем значение очков при кушании змейки.
Добавление переменной для очков
- Давайте для интереса добавим переменную для очков.
- Если змея кушает, то инкрементируем значение очков и отображаем количество при выборе.
Учет лага времени
Описание раздела: В этом разделе мы добавляем учет лага времени, чтобы скорость игры не зависела от процессора.
Добавление учета лага времени
- Добавим переменную "лак" на 100 миллисекунд каждую итерацию.
- Теперь нам нужно вычесть этот лак из времени ожидания считывания движения.
- Добавим искусственный лак в основном цикле игры.
Добавление звуков
Описание раздела: В этом разделе мы добавляем звуки в игру.
Добавление звуков
- Наша консоль может издавать бипы. Будем их вызывать в отдельном потоке, что не замораживает нашу игру на время биппо, используя класс task.
- Параметры передаются частотой и длительностью звучания.
- Но это все - наша змейка полностью готово.