Урок №14. Создаем игру «Змейка» в Qt5/C++

  Дмитрий Бушуев  | 

  Обновл. 31 Янв 2020  | 

 1849

 ǀ   2 

В этой части руководства по Qt5/C++ мы создадим аналог популярной игры «Змейка».

Игра «Змейка»

«Змейка» — это старая классическая видеоигра. Впервые она была создана в конце 70-х годов для использования на игровых автоматах, а затем, в 1979 году, её перенесли и на ПК. В этой игре игрок управляет тонким существом, похожим на змею, которое перемещается по игровому полю без остановки. Цель состоит в том, чтобы съесть как можно больше яблок, появляющихся в процессе игры. Каждый раз, когда змея съедает яблоко, она становится длиннее, что усложняет дальнейший процесс игры. Змея при этом должна избегать столкновений со стенами и собственным телом.

Разработка игры «Змейка»


Размер каждой отдельной «части» тела змеи составляет 10 пикселей. Управляется она с клавиатуры при помощи стрелочек: , , , . Изначально тело змеи состоит из трёх «частей». Если игра завершилась, то в центре игрового поля отображается сообщение "Game Over".

Заголовочный файл — Snake.h:

Константы B_WIDTH и B_HEIGHT определяют размеры (ширину и высоту) игрового поля. DOT_SIZE — это размеры яблока и «частей» тела змеи. Константа ALL_DOTS определяет максимальное количество возможных точек на доске (900 = (300*300)/(10*10)). Константа RAND_POS используется для вычисления случайной позиции яблока, а константа DELAY определяет скорость игры:

Данные два массива содержат координаты (x;y) всех «частей» тела змеи:

В файле snake.cpp содержится логика нашей игры.

Файл реализации — snake.cpp:

При помощи метода loadImages() мы загружаем изображения, которые будут использоваться в игре. Класс QImage используется для хранения данных PNG-изображений:

В методе initGame() мы создаём змею, случайным образом определяем позицию на игровом поле, где будет располагаться яблоко, и запускаем таймер:

Если голова сталкивается с яблоком, то мы увеличиваем количество «частей» тела змеи. Затем вызываем метод locateApple(), который случайным образом позиционирует новое яблоко:

В методе move() у нас находится ключевой алгоритм игры. Чтобы понять его, посмотрите, как движется змея. Мы контролируем только голову змеи. При этом можем изменить её направление движения с помощью кнопок клавиатуры. Остальные «части» тела змеи по цепочке перемещаются друг за другом. Вторая «часть» движется туда, где была первая, третья — туда, где была вторая и т.д.:

Перемещаем «части» тела змеи друг за другом:

Данный код перемещает голову змеи влево:

В методе checkCollision() мы определяем, столкнулась ли змея со стеной или со своим телом. Если змея ударится головой о какую-нибудь «часть» своего тела, то игра окончена:

Игра заканчивается, если змея сталкивается с нижней частью доски:

Метод timerEvent() формирует игровой цикл. При условии, что игра ещё не закончена, мы выполняем обнаружение столкновений змеи с препятствиями и выполняем её дальнейшее перемещение. Функция repaint() вызывает перерисовку окна:

Если пользователь нажимает стрелочку , то мы устанавливаем значение true для переменной leftDirection. Эта переменная используется в функции move() для изменения координат змеи. Заметьте также, что когда змея направляется вправо, мы не можем сразу же повернуть налево:

Главный файл программы — main.cpp:

Результат:


Заключение

Вот такой вот несложный, но интересный урок. В следующий раз мы разберём создание ещё одной популярной игры «Арканоид».

Исходный код игры «Змейка» в Qt5/C++.


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (11 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 2

  1. Аватар KaligayevX3:

    Извините, пишу второй раз, потому что отчаялся, уже 5 часов пытаюсь сделать так, чтобы картинка прогрузилась, ничего не помогает.

    Насколько я понял, это часть кода, из-за которой моя змейка невидимая

    1. Дмитрий Бушуев Дмитрий Бушуев:

      Да, проблема в том, что у Qt не получается подгрузить данные файлы. Решить её можно несколькими способами:

      Способ 1:
      Пропишите полные пути к файлам-картинкам, Например:

      Не забудьте при этом проверить, чтобы у вас была создана папка C:\Snake и в ней лежали эти 3 файла.

      Способ 2:
      Закройте Qt Creator. Найдите у себя в скачанных исходниках файл My_QtApplication.pro.user. Удалите данный файл. После этого снова откройте проект в Qt Creator и запустите его.

      Способ 3: Перекачайте исходники с сайта. Там эта ошибка уже исправлена.

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *