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

134 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# BrickGame Тетрис
Резюме: в данном проекте тебе предстоит реализовать игру «Тетрис» на языке программирования С с использованием структурного подхода.
### Тетрис
![Тетрис](misc/images/tetris-game.png)
«Тетрис», наверное, одна из самых популярных игр для консоли Brickgame. Нередко и саму консоль называют тетрисом. Цель игры — в наборе очков за построение линий из генерируемых игрой блоков. Очередной блок, сгенерированный игрой, начинает опускаться вниз по игровому полю, пока не достигнет нижней границы или не столкнется с другим блоком. Пользователь может поворачивать фигуры и перемещать их по горизонтали, стараясь составлять ряды. После заполнения ряд уничтожается, игрок получает очки, а блоки, находящиеся выше заполненного ряда, опускаются вниз. Игра заканчивается, когда очередная фигура останавливается в самом верхнем ряду.
Для формализации логики данной игры можно представить следующий вариант конечного автомата:
![Конечный автомат тетриса](misc/images/tetris.png)
Данный КА состоит из следующих состояний:
- Старт — состояние, в котором игра ждет, пока игрок нажмет кнопку готовности к игре.
- Спавн — состояние, в которое переходит игра при создании очередного блока и выбора следующего блока для спавна.
- Перемещение — основное игровое состояние с обработкой ввода от пользователя: поворот блоков/перемещение блоков по горизонтали.
- Сдвиг — состояние, в которое переходит игра после истечения таймера. В нем текущий блок перемещается вниз на один уровень.
- Соединение — состояние, в которое переходит игра после «соприкосновения» текущего блока с уже упавшими или с землей. Если образуются заполненные линии, то они уничтожаются, и остальные блоки смещаются вниз. Если блок останавливается в самом верхнем ряду, то игра переходит в состояние «игра окончена».
- Игра окончена — игра окончена.
## 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).
- Пользовательский интерфейс должен поддерживать отрисовку игрового поля и дополнительной информации.
- Подготовь в любом формате диаграмму, описывающую используемый КА (его состояния и все возможные переходы).
Используемые фигуры:
![Фигуры](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