134 lines
11 KiB
Markdown
134 lines
11 KiB
Markdown
# BrickGame Тетрис
|
||
Резюме: в данном проекте тебе предстоит реализовать игру «Тетрис» на языке программирования С с использованием структурного подхода.
|
||
|
||
### Тетрис
|
||
|
||

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

|
||
|
||
Данный КА состоит из следующих состояний:
|
||
|
||
- Старт — состояние, в котором игра ждет, пока игрок нажмет кнопку готовности к игре.
|
||
- Спавн — состояние, в которое переходит игра при создании очередного блока и выбора следующего блока для спавна.
|
||
- Перемещение — основное игровое состояние с обработкой ввода от пользователя: поворот блоков/перемещение блоков по горизонтали.
|
||
- Сдвиг — состояние, в которое переходит игра после истечения таймера. В нем текущий блок перемещается вниз на один уровень.
|
||
- Соединение — состояние, в которое переходит игра после «соприкосновения» текущего блока с уже упавшими или с землей. Если образуются заполненные линии, то они уничтожаются, и остальные блоки смещаются вниз. Если блок останавливается в самом верхнем ряду, то игра переходит в состояние «игра окончена».
|
||
- Игра окончена — игра окончена.
|
||
|
||
## Chapter II <div id="chapter-ii"></div>
|
||
## Требования к проекту
|
||
|
||
### Часть 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).
|
||
- Пользовательский интерфейс должен поддерживать отрисовку игрового поля и дополнительной информации.
|
||
- Подготовь в любом формате диаграмму, описывающую используемый КА (его состояния и все возможные переходы).
|
||
|
||
Используемые фигуры:
|
||
|
||

|
||
|
||
### Часть 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
|
||
|