11 KiB
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) andgui/cli/(display) - Time-based delays for precise falling speed
License
School 21 educational project


