Создание игры «Тетрис» на C++ с использованием OpenGL.





Создание игры «Тетрис» на C++ с использованием OpenGL

Создание классической игры «Тетрис» — это отличный проект для изучения программирования графики, работы с окнами и ввода с клавиатуры. В нашей статье мы подробно рассмотрим, как реализовать «Тетрис» на языке C++ с применением библиотеки OpenGL для визуализации. OpenGL предоставляет мощный и гибкий инструмент для отрисовки двумерной и трёхмерной графики, что позволит нам создать плавную и привлекательную игру.

Мы рассмотрим основные этапы разработки: от создания окна приложения и отображения игровой сетки до обработки управления и логики падающих фигур. Благодаря подробному разбору кода и архитектуры вы сможете самостоятельно воспроизвести и модифицировать игру под свои нужды.

Подготовка окружения и выбор инструментов

Для начала разработки «Тетриса» на C++ с использованием OpenGL, необходимо подготовить рабочую среду и выбрать подходящие библиотеки. Ядро визуализации будет опираться на OpenGL, но стоит использовать дополнительную библиотеку для удобного создания окон и обработки событий — чаще всего это GLFW или SDL.

Мы рекомендуем использовать GLFW из-за простоты в настройке и широкого распространения в проектах OpenGL. Кроме того, потребуется библиотека GLAD или GLEW для загрузки функций OpenGL, а также базовые инструменты компиляции — GCC, Clang или MSVC в зависимости от платформы.

Основные библиотеки и инструменты

  • GLFW — создает окно, обрабатывает ввод и события.
  • GLAD/GLEW — загрузка расширений OpenGL.
  • OpenGL — собственно графический API для отрисовки фигур.
  • C++17 или новее — для современного синтаксиса и удобств языка.

Для работы установите пакеты GLFW и GLAD (с помощью менеджеров пакетов или вручную), настройте проект в вашей IDE или через CMake, подключите заголовочные файлы и библиотеки.

Структура и базовая архитектура игры

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

Основные классы:

  • Game — основной класс, отвечающий за цикл игры и связь между компонентами.
  • Board — игровое поле, представляющее собой сетку ячеек с проверкой заполнения.
  • Piece — фигура тетромино, со своими позициями и типами.
  • Renderer — класс, отвечающий за отрисовку сетки и фигур с использованием OpenGL.

Игровая сетка

Игровая сетка у «Тетриса» обычно имеет размеры 10 по ширине и 20 по высоте. Каждая ячейка сетки может быть пустой или заполненной цветной частью фигуры. Эта сетка хранится в виде двумерного массива целых чисел или перечисления, чтобы быстро проверять столкновения и удалять заполненные линии.

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

Реализация фигур Тетромино

В классической версии «Тетриса» используются 7 типов фигур, состоящих из 4 блоков: I, O, T, S, Z, J и L. Каждая фигура имеет фиксированную форму, которую можно поворачивать на 90 градусов по часовой или против часовой стрелки.

Для удобства реализации фигуры обычно задаются в виде двумерных матриц 4×4 или списков координат четырёх точек внутри их локальной системы координат. Повороты реализуются либо по формуле вращения координат, либо через заранее подготовленные массивы всех 4 ориентаций фигур.

Пример представления фигуры в коде

Тип фигуры Обозначение Описание формы
«I» Изогнутая линия из 4 блоков Вертикальная или горизонтальная линия из 4 ячеек
«O» Квадрат 2×2 Стабильная фигура без поворотов
«T» Т-образная фигура Три блока в ряд с центральным блоком под ними
«S» Зигзагообразная Две строки по две блоки, смещённые по горизонтали
«Z» Обратный S Аналогична S, зеркальная форма
«J» Г-образная Три блока в ряд с одним ниже слева
«L» Обратный J Три блока в ряд с одним нже справа

При реализации логики поворота важно исключать выход фигуры за пределы игрового поля и учесть коллизии с уже размещёнными блоками.

Отрисовка игры с помощью OpenGL

Основной задачей визуализации в «Тетрисе» является отображение игрового поля и падающих фигур. В OpenGL мы будем использовать двумерные квадраты (квадрис или прямоугольники), раскрашенные в разные цвета, чтобы реально представить каждую ячейку.

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

Пошаговая отрисовка

  1. Настроить камеру на ортографию и размер окна.
  2. Очистить экран перед кадром.
  3. Отрисовать игровое поле — сетку клеток (можно пунктиром).
  4. Пройтись по массиву игрового поля и отрисовать заполненные ячейки с нужным цветом.
  5. Отрисовать текущую падающую фигуру поверх сетки.
  6. Обновить экран (swap buffers).

Для заполнения цветом в OpenGL можно использовать простые шейдеры или даже фиксированную функцию для старых версий OpenGL, если задача стоит максимально просто. Главное — поддерживать постоянную частоту обновления и отзывчивость интерфейса.

Обработка ввода и управление игрой

Управление фигурой «Тетриса» происходит с клавиатуры: игрок может сдвигать фигуру влево и вправо, поворачивать её и ускорять падение. Для этого через GLFW (или другую библиотеку) обабатываются события клавиш.

Основные действия:

  • Левая и правая стрелки — сдвиг фигуры горизонтально.
  • Стрелка вверх — поворот фигуры.
  • Стрелка вниз — ускоренное падение.

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

Логика игры: столкновения, удаление линий, подсчёт очков

Ключевая часть «Тетриса» — проверка столкновений текущей фигуры с границами игрового поля и уже размещёнными блоками. Если столкновение происходит при попытке сдвинуть или повернуть фигуру, действие отменяется.

При «приземлении» фигуры (когда она больше не может опуститься вниз) её блоки записываются в игровое поле, затем проверяется заполненность линий. Полностью заполненные линии удаляются, а строки сверху сдвигаются вниз.

Подсчёт очков

Подсчёт очков в «Тетрисе» зависит от количества удалённых линий за ход:

Количество удалённых линий Очки
1 100
2 300
3 500
4 (Тетрис) 800

С увеличением уровня повышается скорость падения фигур, усложняя игру.

Пример кода ключевых компонентов

Ниже представлен упрощённый пример инициализации игрового поля и движения фигуры:

class Board {
public:
    static constexpr int width = 10;
    static constexpr int height = 20;
    int grid[height][width] = {{0}};

    bool isCellEmpty(int x, int y) const {
        if (x < 0 || x >= width || y < 0 || y >= height) return false;
        return grid[y][x] == 0;
    }
};

struct Point {
    int x, y;
};

class Piece {
public:
    std::vector<Point> blocks;
    Point position;

    void move(int dx, int dy) {
        position.x += dx;
        position.y += dy;
    }

    bool canMove(const Board& board, int dx, int dy) {
        for(auto& b : blocks) {
            int nx = position.x + b.x + dx;
            int ny = position.y + b.y + dy;
            if (!board.isCellEmpty(nx, ny)) return false;
        }
        return true;
    }
};

Далее можно расширять этот скелет вращением, отрисовкой и событиями управления.

Заключение

Создание игры «Тетрис» на C++ с использованием OpenGL — это увлекательный и познавательный проект, который позволяет закрепить знания в программировании, работе с системами ввода/вывода и визуальными библиотеками. Мы подробно рассмотрели ключевые этапы разработки: подготовку окружения, структуру игры, создание фигур и игровой логики, визуализацию и обработку управления.

Разумеется, реализованный код можно улучшать и расширять: добавить анимации, звуковые эффекты, меню, таблицы рекордов, адаптировать под разные платформы и даже развивать в более сложную игру. Главное — понять основную модель и взаимодействие компонентов, что позволит вам смело двигаться дальше в мире игрового программирования.


Создание игры Тетрис на C++ OpenGL для 2D игр Программирование Тетриса Тетрис на C++ и OpenGL Графика в играх на C++
Как сделать Тетрис с OpenGL Уроки OpenGL для начинающих Разработка 2D игр на C++ Тетрис алгоритмы и логика OpenGL примеры кода на C++