# BrickGame Тетрис Резюме: в данном проекте тебе предстоит реализовать игру «Тетрис» на языке программирования С с использованием структурного подхода. ### Тетрис ![Тетрис](misc/images/tetris-game.png) «Тетрис», наверное, одна из самых популярных игр для консоли Brickgame. Нередко и саму консоль называют тетрисом. Цель игры — в наборе очков за построение линий из генерируемых игрой блоков. Очередной блок, сгенерированный игрой, начинает опускаться вниз по игровому полю, пока не достигнет нижней границы или не столкнется с другим блоком. Пользователь может поворачивать фигуры и перемещать их по горизонтали, стараясь составлять ряды. После заполнения ряд уничтожается, игрок получает очки, а блоки, находящиеся выше заполненного ряда, опускаются вниз. Игра заканчивается, когда очередная фигура останавливается в самом верхнем ряду. Для формализации логики данной игры можно представить следующий вариант конечного автомата: ![Конечный автомат тетриса](misc/images/tetris.png) Данный КА состоит из следующих состояний: - Старт — состояние, в котором игра ждет, пока игрок нажмет кнопку готовности к игре. - Спавн — состояние, в которое переходит игра при создании очередного блока и выбора следующего блока для спавна. - Перемещение — основное игровое состояние с обработкой ввода от пользователя: поворот блоков/перемещение блоков по горизонтали. - Сдвиг — состояние, в которое переходит игра после истечения таймера. В нем текущий блок перемещается вниз на один уровень. - Соединение — состояние, в которое переходит игра после «соприкосновения» текущего блока с уже упавшими или с землей. Если образуются заполненные линии, то они уничтожаются, и остальные блоки смещаются вниз. Если блок останавливается в самом верхнем ряду, то игра переходит в состояние «игра окончена». - Игра окончена — игра окончена. ## 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++ ([ссылка](https://google.github.io/styleguide/cppguide.html)). - Должно быть обеспечено покрытие библиотеки unit-тестами с помощью библиотеки `check` (тесты должны проходить на ОС Darwin/Ubuntu). Покрытие библиотеки с логикой игры тестами должно составлять не меньше 80 процентов. - В игре должны присутствовать следующие механики: - Вращение фигур; - Перемещение фигуры по горизонтали; - Ускорение падения фигуры (при нажатии кнопки фигура перемещается до конца вниз); - Показ следующей фигуры; - Уничтожение заполненных линий; - Завершение игры при достижении верхней границы игрового поля; - В игре должны присутствовать все виды фигур, показанные на картинке ниже. - Для управления добавь поддержку всех кнопок, предусмотренных на физической консоли: - Начало игры, - Пауза, - Завершение игры, - Стрелка влево — движение фигуры влево, - Стрелка вправо — движение фигуры вправо, - Стрелка вниз — падение фигуры, - Стрелка вверх — не используется в данной игре, - Действие (вращение фигуры). - Игровое поле должно соответствовать размерам игрового поля консоли: десять «пикселей» в ширину и двадцать «пикселей» в высоту. - Фигура после достижения нижней границы поля или соприкосновения с другой фигурой должна остановиться. Вслед за этим происходит генерация следующей фигуры, показанной на превью. - Интерфейс библиотеки должен соответствовать описанию, которое находится в [тут](./materials/library-specification_RUS.md). - Пользовательский интерфейс должен поддерживать отрисовку игрового поля и дополнительной информации. - Подготовь в любом формате диаграмму, описывающую используемый КА (его состояния и все возможные переходы). Используемые фигуры: ![Фигуры](misc/images/tetris-pieces.png) ### Часть 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