s21_tetris/README_RUS.md
Rorikstr | Rust Dev 31562af99d defines
2025-10-19 00:55:14 +03:00

11 KiB
Raw Blame History

BrickGame Тетрис

Резюме: в данном проекте тебе предстоит реализовать игру «Тетрис» на языке программирования С с использованием структурного подхода.

Тетрис

Тетрис

«Тетрис», наверное, одна из самых популярных игр для консоли Brickgame. Нередко и саму консоль называют тетрисом. Цель игры — в наборе очков за построение линий из генерируемых игрой блоков. Очередной блок, сгенерированный игрой, начинает опускаться вниз по игровому полю, пока не достигнет нижней границы или не столкнется с другим блоком. Пользователь может поворачивать фигуры и перемещать их по горизонтали, стараясь составлять ряды. После заполнения ряд уничтожается, игрок получает очки, а блоки, находящиеся выше заполненного ряда, опускаются вниз. Игра заканчивается, когда очередная фигура останавливается в самом верхнем ряду.

Для формализации логики данной игры можно представить следующий вариант конечного автомата:

Конечный автомат тетриса

Данный КА состоит из следующих состояний:

  • Старт — состояние, в котором игра ждет, пока игрок нажмет кнопку готовности к игре.
  • Спавн — состояние, в которое переходит игра при создании очередного блока и выбора следующего блока для спавна.
  • Перемещение — основное игровое состояние с обработкой ввода от пользователя: поворот блоков/перемещение блоков по горизонтали.
  • Сдвиг — состояние, в которое переходит игра после истечения таймера. В нем текущий блок перемещается вниз на один уровень.
  • Соединение — состояние, в которое переходит игра после «соприкосновения» текущего блока с уже упавшими или с землей. Если образуются заполненные линии, то они уничтожаются, и остальные блоки смещаются вниз. Если блок останавливается в самом верхнем ряду, то игра переходит в состояние «игра окончена».
  • Игра окончена — игра окончена.

Chapter II

Требования к проекту

Часть 1. Основное задание

Тебе необходимо реализовать программу BrickGame v1.0 aka Tetris:

  • Программа должна быть разработана на языке С стандарта C11 с использованием компилятора gcc.
  • Программа должна состоять из двух частей: библиотеки, реализующей логику игры тетрис, и терминального интерфейса с использованием библиотеки ncurses.
  • Для формализации логики игры должен быть использован конечный автомат.
  • Библиотека должна иметь функцию, принимающую на вход ввод пользователя, и функцию, выдающую матрицу, которая описывает текущее состояние игрового поля при каждом ее изменении.
  • Код библиотеки программы должен находиться в папке src/brick_game/tetris.
  • Код с интерфейсом программы должен находиться в папке src/gui/cli.
  • Сборка программы должна быть настроена с помощью Makefile со стандартным набором целей для GNU-программ: all, install, uninstall, clean, dvi, dist, test, gcov_report. Установка должна вестись в любой другой произвольный каталог.
  • Программа должна быть разработана в соответствии с принципами структурного программирования.
  • При написании кода необходимо придерживаться Google Style, заимствованному из стандарта для языка C++ (ссылка).
  • Должно быть обеспечено покрытие библиотеки unit-тестами с помощью библиотеки check (тесты должны проходить на ОС Darwin/Ubuntu). Покрытие библиотеки с логикой игры тестами должно составлять не меньше 80 процентов.
  • В игре должны присутствовать следующие механики:
    • Вращение фигур;
    • Перемещение фигуры по горизонтали;
    • Ускорение падения фигуры (при нажатии кнопки фигура перемещается до конца вниз);
    • Показ следующей фигуры;
    • Уничтожение заполненных линий;
    • Завершение игры при достижении верхней границы игрового поля;
    • В игре должны присутствовать все виды фигур, показанные на картинке ниже.
  • Для управления добавь поддержку всех кнопок, предусмотренных на физической консоли:
    • Начало игры,
    • Пауза,
    • Завершение игры,
    • Стрелка влево — движение фигуры влево,
    • Стрелка вправо — движение фигуры вправо,
    • Стрелка вниз — падение фигуры,
    • Стрелка вверх — не используется в данной игре,
    • Действие (вращение фигуры).
  • Игровое поле должно соответствовать размерам игрового поля консоли: десять «пикселей» в ширину и двадцать «пикселей» в высоту.
  • Фигура после достижения нижней границы поля или соприкосновения с другой фигурой должна остановиться. Вслед за этим происходит генерация следующей фигуры, показанной на превью.
  • Интерфейс библиотеки должен соответствовать описанию, которое находится в тут.
  • Пользовательский интерфейс должен поддерживать отрисовку игрового поля и дополнительной информации.
  • Подготовь в любом формате диаграмму, описывающую используемый КА (его состояния и все возможные переходы).

Используемые фигуры:

Фигуры

Часть 2. Дополнительно. Подсчет очков и рекорд в игре

Добавь в игру следующие механики:

  • подсчет очков;
  • хранение максимального количества очков.

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

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

Начисление очков будет происходить следующим образом:

  • 1 линия — 100 очков;
  • 2 линии — 300 очков;
  • 3 линии — 700 очков;
  • 4 линии — 1500 очков.

Часть 3. Дополнительно. Механика уровней

Добавь в игру механику уровней. Каждый раз, когда игрок набирает 600 очков, уровень увеличивается на 1. Повышение уровня увеличивает скорость движения фигур. Максимальное количество уровней — 10.

Tetris Game

Classic Tetris implementation in C11 with ncurses interface.

Requirements

  • GCC or Clang
  • ncurses library
  • Check framework (for tests)

Building

make # Build the game make run # Build and run make test # Run unit tests make install # Install to ~/.local/bin

text

Controls

  • Arrow Keys: Move left/right, rotate (up)
  • Down Arrow: Instant drop
  • Space/R: Rotate figure
  • P: Pause
  • S: Restart game
  • Q: Quit

Features

  • 7 classic Tetris figures
  • Score tracking with persistent high score
  • 10 speed levels
  • Smooth time-based movement using POSIX clock_gettime()
  • Structured programming principles

Architecture

  • FSM-based game logic with states: Init, Spawn, Move, Moving, Attaching, GameOver
  • Separated frontend/backend: brick_game/ (logic) and gui/cli/ (display)
  • Time-based delays for precise falling speed

License

School 21 educational project