Как сделать змейку на c

Обновлено: 04.07.2024

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

У большинства WPF контролов есть события для получения входных сигналов от мыши и клавиатуры. Таким образом, в зависимости от того, где вы хотите проверить входной сигнал, вы можете подписаться на события одного или нескольких контролов и затем осуществить там магию. Однако, поскольку это игра, мы хотим отлавливать нажатия клавиатуры вне зависимости от того где будет фокус, поэтому мы просто подпишемся на событие непосредственно в окне.

Событие KeyUp - отличный выбор для того, что мы хотим выполнить. Потому найдите ваш XAML - файл окна и измените его атрибуты так, чтобы они включали событие KeyUp, следующим образом:

В коде добавьте обработчик события Window_KeyUp, вот так:

Первое, что мы делаем - сохраняем ссылку, хранящую направление, в котором движется змейка - чтобы убедится, что игрок не попытается сделать что-то непозволительное, например, задний ход(разворот) поверх змейки, то есть справа налево. Иначе говоря, если змейка движется вертикально и игрок хочет изменить направление, ей сначала нужно повернуть по горизонтали.Вы не можете двигаться прямо сверху вниз или слева направо.

Следующий шаг -оператор switch, где мы узнаём, какая клавиша была нажата. В нём проверяем, была ли нажата одна из клавиш направления(Вверх,Вниз,Влево,Вправо)и позволяем змейке изменить направление движения, пока это физически возможно, согласно написанному выше. Также заметьте, что я добавил проверку для клавиши Пробел: нажатие на эту клавишу вызовет метод StartNewGame(), чтобы позволить игроку выбирать, когда начать играть, вместо автоматического старта. Также игрок сможет начать новую игру, когда предыдущая закончится.

В конце метода, мы проверяем: изменилось ли направление, и, если это так, вызываем метод MoveSnake(). Так что изменения происходят немедленно.

Раннее мы добавили вызов метода StartNewGame() в событии Window_ContentRendered. Сейчас вы можете удалить его, и вместо этого начать игру нажатием клавиши Пробел. И теперь змейка под контролем, а мы близки к созданию настоящей игры и не просто движущейся змейки.

Заключение

В этой статье мы добавили довольно важный аспект в нашей реализации змейки: контроль над змейкой. Однако, если вы попытаетесь сыграть в неё, вы заметите, что нам по-прежнему необходимо кое-что важное. Змейка выходит и исчезает за пределами окна и не ест еду, даже если сталкивается с ней. Другими словами, нам нужно добавить обнаружение столкновений. Об этом в следующей статье.

Is your preferred language not on the list? Click here to help us translate this article into your language!

В предыдущей статье мы писали сапёра за 15 минут, теперь займёмся классической змейкой.

В этот раз нам снова понадобятся:

  • 15 минут свободного времени;
  • Настроенная рабочая среда, т.е. JDK и IDE (например Eclipse);
  • Библиотека LWJGL (версии 2.x.x) для работы с Open GL. Обратите внимание, что для LWJGL версий выше 3 потребуется написать код, отличающийся от того, что приведён в статье;
  • Спрайты, т.е. картинки самой змеи и фрукта, который она будет есть. Можно чисто символически нарисовать самому, или скачать использовавшиеся при написании статьи.

Подключение библиотек

В прошлый раз у многих возникли с этим вопросом проблемы, поэтому мне показалось уместным посвятить этому немного времени. Во-первых, выше я дал ссылку на скачивание архива с библиотеками, которые использую я, чтобы не было путаницы с версиями и вопросов, где найти что-то. Папку из архива требуется поместить в папку проекта и подключить через вашу IDE.

Во-вторых, у многих пользователей InteliJ IDEA возникли проблемы как раз с их подключением. Я нашёл в сети следующий видеогайд:

После того, как я сделал всё в точности по нему, у меня библиотеки подключились корректно и всё заработало.

Работа с графикой

С этой стороны наша задача мало отличается от той, что мы выполняли при написании Сапёра. Снова создаём класс GUI, который будет хранить и обновлять состояние всех графических элементов. Если точнее:

  • Должен хранить текущие состояния ячеек:
  • Должен отрисовывать эти самые ячейки:
  • И обновляться, когда этого запросит главный цикл:

Как вы можете видеть, здесь я уже использовал несколько констант. Для них был создан отдельный класс Constants с public static полями. Вот он целиком:

Enum Sprite , который отвечает за подгрузку текстур, полностью идентичен тому, что мы писали для Сапёра, за исключением того, что нам нужно только две текстуры — для змеи и для ягод. Вот код:

Механика игры

Самое время поговорить о том, как наша змея будет, собственно, перемещаться. Вам наверняка доводилось видеть вывески, вокруг которых по кругу бегают огоньки? Разумеется, сами лампочки в них не перемещаются, просто каждый тик последняя гаснет, а первая зажигается. Таким же образом будет перемещаться и наша змея.

Пишем класс клетки

Добавляем геттер и сеттер для состояния клетки поля в GUI

Добавляем метод, создающий начальное поле в GUI

Просто инициализируем OpenGL, затем массив Cell[][] cells и заполняем последний клетками со случайным полем state .

Я не делал никаких программирования в некоторое время, и я возвращаюсь в него. Я сделал эту змею клон, чтобы обновить меня немного, и я хотел бы получить некоторую обратную связь в разделе "Элеганс" и "хорошо сделано"-Несс кодекса.

main.cpp

Игры.ч

Game.cpp

Базовая структура

Со всеми своими членами static ваш Game класс выглядит очень похоже на пространство имен. Я бы либо сделать это пространство имен, или же сделать все, что зависит от конкретной игры (например, текущий счет) не статический, так что каждый объект игра действительно представляет собой реальную игру. Последнее , наверное, предпочтительнее, но в любом Это улучшения текущей ситуации.

Хуже, Game класс очень похож на то, что часто называют "Богом-класс". Единственный класс, который пытается быть всем, знать все, и делать все. Сваливая все вместе в один класс, вы потеряли большую часть выгоды от использования классов, в первую очередь, и просто написано базовый блок-структурированный код, как вы бы в что-то вроде C, но с Game:: прикрепил к истокам многие (большинство?) из имен.

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

Генерация случайных чисел

Я не вижу смысла в отдельной генераторы случайных чисел для X и y координат. Даже наоборот, вы почти наверняка лучше использовать один генератор на обе. Аналогично, нет смысла в создании отдельных экземпляров random_device для инициализации каждого.

Накрутка числа

Изрядное количество логики в код игры посвящена довольно простая работа того, что количество всегда остается в пределах определенного диапазона (а если вы попытаетесь уменьшить ниже начала или прибавка конец, обернув вокруг к другому концу).

По крайней мере, на мой взгляд, это звучит много, как спецификация малого класса:

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

Используя этот код основного цикла игры значительно упрощается:

Координаты

А не использовать std::pair в качестве координат (и все другие код знают о его внутренности) я бы определить Coordinate класс, который умеет делать то, что вам нужно сделать с координатами (например, сравнить их):

Использование стандартных алгоритмов

Как только вы определили Coordinate ваш Game::collides будет что-то вроде:

Это, в свою очередь, может быть написано что-то вроде:

Конечно, если брать предыдущие советы, внешний интерфейс для этого будет упрощена немного дальше, потому что это будет член Snake класс:

как сделать змейку на javascript

В этой статье вы прочитаете как сделать змейку на JavaScript, максимально просто и понятно, с использование canvas, но если вы не умеете работать с ним, то прочитайте две статьи.

Также в конце статье вы сможете скачать файлы, этой игры, и по экспериментировать, что то добавить или убрать.

Сначала нужно сделать HTML документ, в котором будет содержатся элемент canvas, котоый нужен нам для отображения игры.

Читайте также: