https://github.com/skytecat/tetris
Implementation of the Tetris game using finite-state machines in C
https://github.com/skytecat/tetris
c ncurses-library
Last synced: 3 days ago
JSON representation
Implementation of the Tetris game using finite-state machines in C
- Host: GitHub
- URL: https://github.com/skytecat/tetris
- Owner: skytecat
- Created: 2024-09-01T07:11:54.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-09-15T08:03:27.000Z (over 1 year ago)
- Last Synced: 2025-03-03T15:47:02.622Z (over 1 year ago)
- Topics: c, ncurses-library
- Language: C
- Homepage:
- Size: 1.94 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Тетрис

## Резюме
В данном проекте реализована игра «Тетрис» на языке программирования С с использованием структурного подхода.
## Содержание
- [Введение](#введение)
- [Информация о проекте](#информация-о-проекте)
- [Общая информация](#общая-информация)
- [Конечные автоматы](#конечные-автоматы)
- [Фигуры](#фигуры)
- [Подсчет очков и рекорд в игре](#подсчет-очков-и-рекорд-в-игре)
- [Механика уровней](#механика-уровней)
- [Управление](#управление)
- [Сборка и тестирование](#сборка-и-тестирование)
## Введение
Проект состоит из двух частей: библиотеки, реализующей логику работы игры и терминального интерфейса с использованием библиотеки `ncurses`. Логика работы библиотеки реализована с использованием конечных автоматов.
## Информация о проекте
### Общая информация
- Программа разработана на языке Си стандарта C11 с использованием компилятора gcc.
- Код программы придерживается Google Style.
- Обеспечено покрытие библиотеки unit-тестами, с помощью библиотеки `check`.
- При заполнении линии, она уничтожается и происходит начисление очков;
- При достижении верхней границы игрового поля игра завершается;
- Игровое поле соответствует размерам игрового поля консоли — десять «пикселей» в ширину и двадцать «пикселей» в высоту.
- Фигура, после достижения нижней границы поля или соприкосновения с другой фигурой, остановливается. После этого происходит генерация случайной следующей фигуры.
### Конечные автоматы
Конечный автомат (КА) в теории алгоритмов — математическая абстракция, модель дискретного устройства, имеющего один вход, один выход и в каждый момент времени находящегося в одном состоянии из множества возможных.
При работе на вход КА последовательно поступают входные воздействия, а на выходе КА формирует выходные сигналы. Переход из одного внутреннего состояния КА в другое может происходить не только от внешнего воздействия, но и самопроизвольно.
КА можно использовать для описания алгоритмов, позволяющих решать те или иные задачи, а также для моделирования практически любого процесса.
**_Конечный автомат для данной игры:_**

**_Данный КА состоит из следующих состояний:_**
- **Start** — состояние, в котором игра ждет, пока игрок нажмет кнопку готовности к игре.
- **Spawn** — состояние, в которое переходит игра при создании очередного блока и выбора следующего блока для спавна.
- **Moving** — основное игровое состояние с обработкой ввода от пользователя — поворот блоков/перемещение блоков по горизонтали.
- **Shifting** — состояние, в которое переходит игра после истечения таймера. В нем текущий блок перемещается вниз на один уровень.
- **Attaching** — состояние, в которое преходит игра после «соприкосновения» текущего блока с уже упавшими или с землей. Если образуются заполненные линии, то она уничтожается и остальные блоки смещаются вниз. Если блок остановился в самом верхнем ряду, то игра переходит в состояние «игра окончена».
- **Game over** — игра окончена.
- **Pause** - состояние паузы, из которого в любой момент можно продолжить игру с сохраненным состоянием
### Фигуры
#### _Используемые фигуры:_

### Подсчет очков и рекорд в игре
**В игре есть следующие механики:**
- подсчет очков;
- хранение максимального количества очков.
Данная информация передаётся и выводится пользовательским интерфейсом в боковой панели. Максимальное количество очков хранится в файле и сохраняется между запусками программы.
Максимальное количество очков меняется во время игры, если пользователь во время игры превышает текущий показатель максимального количества набранных очков.
**Начисление очков будет происходить следующим образом:**
- 1 линия — 100 очков;
- 2 линии — 300 очков;
- 3 линии — 700 очков;
- 4 линии — 1500 очков.
### Механика уровней
В игру добавлена механика уровней. Каждый раз, когда игрок набирает 600 очков, уровень увеличивается на 1. Повышение уровня увеличивает скорость движения фигур. Максимальное количество уровней — 10.
### Управление
- **Стрелка вниз**, **Стрелка вверх** **+** **Enter** — управление в меню
- **'p'** — переход в окно паузы,
- **'q'** — переход в окно завершения игры,
- **Стрелка влево** — движение фигуры влево,
- **Стрелка вправо** — движение фигуры вправо,
- **Стрелка вниз** — ускорение падения фигуры,
- **Пробел** — вращение фигуры.
## Сборка и тестирование
Сборка осуществляется с помощью Makefile,который находится в директории `src`. Функции для вычислений покрыты unit-тестами.
**Цели в Makefile:**
`install` - установить и запустить приложение
`uninstall` - удалить приложение
`clean` - очистить каталог от всех файлов, полученных в результате компиляции
`brew` - установить Homebrew
`lcov` - установить lcov
`test` - запустить тесты функций
`gcov_report` - посмотреть покрытие тестами кода