Update from 14

This commit is contained in:
Administrator 2024-08-14 14:53:39 +00:00
parent 0eb7f0b1c0
commit fcd73c9b90
8 changed files with 39 additions and 52 deletions

View file

View file

@ -23,13 +23,13 @@
## Введение
Для реализации игры «Тетрис» проект должен состоять из двух частей: библиотеки, реализующей логику работы игры, которую можно подключать к различным GUI в будущем, и терминального интерфейса. Логика работы библиотеки должна быть реализована с использованием конечных автоматов, одно из возможных описаний которого будет дано ниже.
Для реализации игры «Тетрис» проект должен состоять из двух частей: библиотеки, реализующей логику работы игры, которую можно в будущем подключать к различным GUI, и терминального интерфейса. Логика работы библиотеки должна быть реализована с использованием конечных автоматов, одно из возможных описаний которого будет дано ниже.
## Chapter I <div id="chapter-i"></div>
## Общая информация
### BrickGame
BrickGame — популярная портативная консоль 90-ых годов с несколькими ~~тысячами~~ встроенными играми, разработанная в Китае. Изначально была копией разработанной в СССР и выпущенной Nintendo в рамках платформы GameBoy игры «Тетрис», но включала в себя также и множество других игр, которые добавлялись с течением времени. Консоль имела небольшой экранчик с игровым полем размера 10х20, представляющим из себя матрицу «пикселей». Справа от поля находилось табло с цифровой индикацией состояния текущей игры, рекордами и прочей дополнительной информацией. Самыми распространенными играми на BrickGame были: тетрис, танки, гонки, фроггер и змейка.
BrickGame — популярная портативная консоль 90-ых годов с несколькими ~~тысячами~~ встроенными играми, разработана она была в Китае. Изначально эта игра была копией, разработанной в СССР и выпущенной Nintendo в рамках платформы GameBoy игры «Тетрис», но включала в себя также и множество других игр, которые добавлялись с течением времени. Консоль имела небольшой экранчик с игровым полем размера 10 х 20, представляющим из себя матрицу «пикселей». Справа от поля находилось табло с цифровой индикацией состояния текущей игры, рекордами и прочей дополнительной информацией. Самыми распространенными играми на BrickGame были: тетрис, танки, гонки, фроггер и змейка.
![BrickGameConsole](misc/images/brickgame-console.jpg)
@ -50,7 +50,7 @@ BrickGame — популярная портативная консоль 90-ых
- Логика искусственного интеллекта для игр;
- Синтаксический и лексический анализ;
- Сложные прикладные сетевые протоколы;
- Потоковая обработка данных.
- Потоковая обработка данных.
Ниже представлены примеры использования КА для формализации игровой логики нескольких игр из BrickGame.
@ -68,9 +68,9 @@ BrickGame — популярная портативная консоль 90-ых
- Старт — состояние, в котором игра ждет, пока игрок нажмет кнопку готовности к игре.
- Спавн — состояние, в котором создается очередная лягушка.
- Перемещение — основное игровое состояние с обработкой ввода от пользователя движение лягушки по полосе влево/право или прыжки вперед/назад.
- Сдвиг — состояние, которое наступает после истечения таймера, при котором сдвигаются все объекты на полосах вправо, вместе с лягушкой.
- Столкновение — состояние, которое наступает, если после прыжка лягушка попадает в воду или после смещения бревен лягушка оказывается за пределами игрового поля.
- Перемещение — основное игровое состояние с обработкой ввода от пользователя: движение лягушки по полосе влево/право или прыжки вперед/назад.
- Сдвиг — состояние, которое наступает после истечения таймера, при котором все объекты на полосах сдвигаются вправо вместе с лягушкой.
- Столкновение — состояние, которое наступает, если после прыжка лягушка попадает в воду, или если после смещения бревен лягушка оказывается за пределами игрового поля.
- Достигнут другой берег — состояние, которое наступает при достижении лягушкой верхней другого берега.
- Игра окончена — состояние, которое наступает после достижения другого берега или смерти последней лягушки.
@ -90,9 +90,9 @@ BrickGame — популярная портативная консоль 90-ых
- Старт — состояние, в котором игра ждет, пока игрок нажмет кнопку готовности к игре.
- Спавн — состояние, в которое переходит игра при создании очередного блока и выбора следующего блока для спавна.
- Перемещение — основное игровое состояние с обработкой ввода от пользователя поворот блоков/перемещение блоков по горизонтали.
- Перемещение — основное игровое состояние с обработкой ввода от пользователя: поворот блоков/перемещение блоков по горизонтали.
- Сдвиг — состояние, в которое переходит игра после истечения таймера. В нем текущий блок перемещается вниз на один уровень.
- Соединение — состояние, в которое преходит игра после «соприкосновения» текущего блока с уже упавшими или с землей. Если образуются заполненные линии, то она уничтожается, и остальные блоки смещаются вниз. Если блок остановился в самом верхнем ряду, то игра переходит в состояние «игра окончена».
- Соединение — состояние, в которое переходит игра после «соприкосновения» текущего блока с уже упавшими или с землей. Если образуются заполненные линии, то она уничтожается, и остальные блоки смещаются вниз. Если блок останавливается в самом верхнем ряду, то игра переходит в состояние «игра окончена».
- Игра окончена — игра окончена.
## Chapter II <div id="chapter-ii"></div>
@ -102,7 +102,7 @@ BrickGame — популярная портативная консоль 90-ых
Тебе необходимо реализовать программу BrickGame v1.0 aka Tetris:
- Программа должна быть разработана на языке Си стандарта C11 с использованием компилятора gcc.
- Программа должна быть разработана на языке С стандарта C11 с использованием компилятора gcc.
- Программа должна состоять из двух частей: библиотеки, реализующей логику игры тетрис, и терминального интерфейса с использованием библиотеки `ncurses`.
- Для формализации логики игры должен быть использован конечный автомат.
- Библиотека должна иметь функцию, принимающую на вход ввод пользователя, и функцию, выдающую матрицу, которая описывает текущее состояние игрового поля при каждом ее изменении.
@ -119,7 +119,7 @@ BrickGame — популярная портативная консоль 90-ых
- Показ следующей фигуры;
- Уничтожение заполненных линий;
- Завершение игры при достижении верхней границы игрового поля;
- В игре должны присутствовать все виды фигур, показанных на картинке ниже.
- В игре должны присутствовать все виды фигур, показанные на картинке ниже.
- Для управления добавь поддержку всех кнопок, предусмотренных на физической консоли:
- Начало игры,
- Пауза,
@ -129,8 +129,8 @@ BrickGame — популярная портативная консоль 90-ых
- Стрелка вниз — падение фигуры,
- Стрелка вверх — не используется в данной игре,
- Действие (вращение фигуры).
- Игровое поле должно соответствовать размерам игрового поля консоли десять «пикселей» в ширину и двадцать «пикселей» в высоту.
- Фигура, после достижения нижней границы поля или соприкосновения с другой фигурой, должна остановиться. После этого происходит генерация следующей фигуры, показанной на превью.
- Игровое поле должно соответствовать размерам игрового поля консоли: десять «пикселей» в ширину и двадцать «пикселей» в высоту.
- Фигура после достижения нижней границы поля или соприкосновения с другой фигурой должна остановиться. Вслед за этим происходит генерация следующей фигуры, показанной на превью.
- Интерфейс библиотеки должен соответствовать описанию, которое находится в materials/library-specification_RUS.md.
- Пользовательский интерфейс должен поддерживать отрисовку игрового поля и дополнительной информации.
- Подготовь в любом формате диаграмму, описывающую используемый КА (его состояния и все возможные переходы).

View file

@ -11,10 +11,10 @@
Следствия и дополнения вышеизложенных принципов:
1. Запрет на использование глобальных переменных
1. Запрет на использование глобальных переменных.
2. Не более одного выхода из функции. Исключение составляет предварительная проверка аргументов функции.
3. Не более одного выхода из цикла - это может быть как условие, так и ключевое слово break
4. Вложенность любых блоков не должна превышать 4
5. Размер функций ограничен по строкам и составляет 40-50 строк
3. Не более одного выхода из цикла это может быть как условие, так и ключевое слово break.
4. Вложенность любых блоков не должна превышать 4.
5. Размер функций ограничен по строкам и составляет 40-50 строк.
![goto](../misc/eng/images/GOTO.png)

View file

@ -1,5 +1,5 @@
Message from developers:
Hello, dear friend!
Message from the developers:
Hello dear friend!
Let's play a game.
Something like the good old text-based adventures with puzzle elements.
Each task is a challenge, usually some kind of hurdle you have to overcome.
@ -14,9 +14,9 @@ Here are some tips to help you find your way:
6. Be careful with sources of information. Check. Think. Analyze. Compare. Do not trust.
7. Pay attention to the text of the problem. Think. Check.
8. If the task seems unclear or impossible — it only seems that way. Take your time, sit in silence or with your favorite music. In 10-15 minutes, return to the assignment and read the entire text again.
9. If tip #8 didn't help — find a guide. You are surrounded by many wanderers just like you and they will be happy to help you find your way out.
9. If tip #8 didn't help — find a guide. You are surrounded by many walkers just like you and they will be happy to help you find your way out.
10. Watch the time! It's deceptive. You must complete at least one challenge per day!
11. Pay attention and do not miss important things. Check the repository carefully!
11. Be careful not to miss anything important. Check the repository carefully!
12. Always push to the develop branch only! The master branch will be ignored. Work in the src directory.
13. Remember that each task goes through a series of checks: code style check, static analyzer check, check for correct work with memory, check with a set of autotests, check with a checklist. Be careful.
14. You will encounter various tasks along the way. The tasks marked with an asterisk (*) are for the most foolhardy. They are more difficult and not mandatory. However, completing them will give you extra experience and knowledge.
@ -27,6 +27,6 @@ Here are some tips to help you find your way:
19. Divide and conquer. Decompose.
20. Think about the big picture (good code, obviously). Move from the general to the specific.
21. Do not cheat, do not try to deceive the system and others. You will fool yourself first.
22. Do not write off, but if you use help — always find it out to the end. Otherwise your journey will be meaningless.
23. Check the "materials" folder often. There can be a lot of useful stuff in there!
22. Do not copy the work of others, but if you use help — always understand it to the end. Otherwise your journey will be meaningless.
23. Check the "materials" folder often. There can be a lot of useful stuff there!
24. Reread these tips several times.

View file

@ -3,31 +3,30 @@
Мы предлагаем тебе сыграть в игру.
Игру в духе старых добрых текстовых квестовых игр-бродилок с элементами головоломки.
Каждый Task — это очередное испытание, обычно некоторое препятствие, которое необходимо преодолеть.
Лишь тот, кто пройдет все, сможет двинуться дальше.
Лишь тот, кто пройдет все сможет двинуться дальше.
Ниже приведено несколько напутствий, они помогут тебе найти свой путь:
1. Всю дорогу тебя будет сопровождать чувство неопределенности и острого дефицита информации: ЭТО НОРМАЛЬНО. Это часть игры. Не забывай, что информация в репозитории и Google — всегда с тобой. Как и другие игроки. Общайся. Ищи. Собирай. Не бойся ошибиться.
2. В игре может быть другая игра, в которой будет еще одна. Это нормально. Все как в жизни. Рекурсия — это красиво.
3. Уровни могут сильно отличаться друг от друга. Это нормально. Это часть игры. Нельзя выучить один рецепт и его везде применять. Лишь непрерывно обучаясь и адаптируясь ты сможешь достигнуть цели.
3. Уровни могут сильно отличаться друг от друга. Это нормально. Это часть игры. Нельзя выучить один рецепт и его везде применять. Лишь непрерывно обучаясь и адаптируясь, ты сможешь достигнуть цели.
4. Наша игра — многопользовательская, даже если сначала тебе покажется иначе.
5. Хотя, большую часть пути ты сможешь преодолеть и один.
5. Хотя большую часть пути ты сможешь преодолеть и один.
6. Будь внимателен к источникам информации. Проверяй. Думай. Анализируй. Сравнивай. Не доверяй.
7. Будь внимателен к тексту задания. Думай. Проверяй.
8. Если задание кажется непонятным или невыполнимым — это только так кажется. Просто посиди спокойно, в тишине, или включи любимую музыку. Вернись к заданию через 10-15 минут и перечитай его полностью.
9. Если п.8 не помог — поищи проводника. Вокруг тебя много таких же путников, как ты, они с радостью помогут найти тебе выход.
8. Если задание кажется непонятным или невыполнимым — это только так кажется. Просто посиди спокойно в тишине или включи любимую музыку. Вернись к заданию через 10-15 минут и перечитай его полностью.
9. Если п. 8 не помог — поищи проводника. Вокруг тебя много таких же путников, как ты, они с радостью помогут найти тебе выход.
10. Следи за временем! Оно коварно. В день ты должен преодолевать минимум одно испытание!
11. Будь внимателен — и не упусти важное. Внимательно изучай репозиторий!
12. Всегда делай push только в ветку develop! Ветка master будет проигнорирована. Работай в директории src.
13. Помни, что каждое задание проходит ряд проверок: проверка на стиль кода, проверка статическим анализатором, проверка на корректную работу с памятью, проверка набором автотестов, проверка с помощью чеклиста. Будь внимателен.
14. На твоем пути тебе встретятся разные задания. Те, что помечены звездочкой (*), подходят только для самых отчаянных. Они с повышенной сложностью и в целом не являются обязательными к выполнению. Но если ты их сделаешь, то получишь дополнительный опыт и знания.
15. Иногда то, что кажется важным — не есть важное.
16. Помни, в конечном счете, факт преодоления препятствия не так важен, как то, КАК ты его преодолел.
16. Помни: в конечном счете факт преодоления препятствия не так важен, как то, КАК ты его преодолел.
17. Главная цель нашего путешествия — осознать, что такое «КАК».
18. Отделяй зерна от плевел.
19. Разделяй и властвуй. Декомпозируй.
20. Думай о главном (о хорошем коде, разумеется). Следуй от общего к частному.
21. Не жульничай, не пытайся обмануть систему и окружающих. В первую очередь ты обманешь себя.
22. Не списывай, а если пользуешься помощью — всегда разбирайся до конца, почему, как и зачем. Иначе твое путешествие не будет иметь никакого смысла.
22. Не списывай, а если пользуешься помощью — всегда разбирайся до конца, почему, как и зачем. Иначе твое путешествие не будет иметь никакого смысла.
23. Почаще заглядывай в папку materials. Там может быть много полезного!
24. Перечитай напутствия несколько раз.

View file

@ -1,4 +1,4 @@
# Instructions for running tests.
# Instructions for running tests
In addition to testing for correct output data, the autotest system will check your program and its source code for the
following points:

View file

@ -1,13 +1,9 @@
# Инструкция по запуску тестов.
# Инструкция по запуску тестов
Помимо тестов на корректные выходные данные система автотестирования будет проверять твою программу и ее исходный код по
следующим пунктам:
Помимо тестов на корректные выходные данные система автотестирования будет проверять твою программу и ее исходный код по следующим пунктам:
* **Стилевые тесты.** Чтобы проверить, насколько красота твоего кода соответствует стандартам, ты можешь протестировать
свой код с помощью утилиты _clang-format_. В папке ```materials/linters``` лежит файл ```.clang-format```, который
содержит необходимые настройки для стилевого теста. Данный конфигурационный файл распространяет свое действие на все
файлы, которые лежат с ним в директории или в директориях ниже. Поэтому, чтобы данные настройки применились к твоим
файлам с исходным кодом, скопируй ```.clang-format``` в папку ```src```. \
* **Стилевые тесты.** Чтобы проверить, насколько красота твоего кода соответствует стандартам, ты можешь протестировать свой код с помощью утилиты _clang-format_. В папке ```materials/``` лежит файл ```.clang-format```, который содержит необходимые настройки для стилевого теста. Данный конфигурационный файл распространяет свое действие на все файлы, которые лежат с ним в директории или в директориях ниже. Поэтому, чтобы данные настройки применились к твоим файлам с
исходным кодом, скопируй ```.clang-format``` в папку ```src```. \
\
Чтобы запустить проверку на стиль, выполни следующую команду: \
```clang-format -n src/sourcefile_name.c``` \
@ -24,18 +20,13 @@
Google Style: https://google.github.io/styleguide/cppguide.html
* **Тест на корректную работу с памятью.** При написании C-программ очень важно следить за утечками памяти. Для этого в
Unix-подобных операционных системах довольно часто используют утилиту _valgrind_. Однако, на OS X имеются проблемы с
поддержкой _valgrind_, поэтому вместо нее можно использовать утилиту _leaks_. Вдаваться в механизм работы этих утилит
* **Тест на корректную работу с памятью.** При написании C-программ очень важно следить за утечками памяти. Для этого в Unix-подобных операционных системах довольно часто используют утилиту _valgrind_. Однако на OS X имеются проблемы с поддержкой _valgrind_, поэтому вместо нее можно использовать утилиту _leaks_. Вдаваться в механизм работы этих утилит
мы сейчас не будем — если интересно, можешь почитать в гугле.
**_LEAKS_**
Чтобы запустить свой исполняемый файл с помощью этой утилиты, набери в терминале: \
```leaks -atExit -- ./main.out | grep LEAK:```
Обрати внимание на команду ```| grep LEAK:```. Мы используем ее для короткого вывода, чтобы видеть только линии с
утечками, если они есть. Если ты хочешь увидеть весь вывод, просто удали эту команду.
Обрати внимание на команду ```| grep LEAK:```. Мы используем ее для короткого вывода, чтобы видеть только линии с утечками, если они есть. Если ты хочешь увидеть весь вывод, просто удали эту команду.
При запуске исполняемого файла с помощью _leaks_ может появиться сообщение об ошибке:
> dyld: could not load inserted library /usr/local/lib/libLeaksAtExit.dylib because image not found
@ -48,8 +39,7 @@
```
ополнительно:_ \
Используй флаг ```-exclude``` утилиты _leaks_ для того, чтобы отфильтровать утечки в функциях, где известно об
утечках памяти. Этот флаг позволяет уменьшить количество посторонней информации, сообщаемой _leaks_.
Используй флаг ```-exclude``` утилиты _leaks_ для того, чтобы отфильтровать утечки в функциях, где известно об утечках памяти. Этот флаг позволяет уменьшить количество посторонней информации, сообщаемой _leaks_.
**_VALGRIND_**
@ -62,6 +52,4 @@
Не рекомендуется использовать _valgrind_ на OS X, вместо нее лучше использовать _leaks_.
* **Тест сборки.** Программу можно проверить на корректность сборки на тестовой системе. Для этого потребуется
установленный _Docker_. Если на системе есть докер, то можно зайти в директорию `materials/build` и запустить оттуда
скрипт run.sh. Скрипт обернет твое решение в докер и запустит его вместе с типовым сценарием сборки.
* **Тест сборки.** Программу можно проверить на корректность сборки на тестовой системе. Для этого потребуется установленный _Docker_. Если на системе есть докер, то можно зайти в директорию `materials/build` и запустить оттуда скрипт run.sh. Скрипт обернет твое решение в докер и запустит его вместе с типовым сценарием сборки.

View file

@ -2,7 +2,7 @@
Это задание является первым из серии BrickGame. Всего будет четыре проекта, в каждом — своя игра и свои технологии. Но помимо разработки новых проектов, необходимо будет поддерживать и старые игры, и добавлять поддержку новых игр в старые проекты. В этот раз интерфейс будет консольным, в следующем — десктопный, и так далее. Для того чтобы поддерживать старые и новые игры, необходимо заранее определиться, как будет устроено АПИ интерфейсов и библиотек, чтобы в дальнейшем не приходилось переписывать уже сданные проекты.
Игровое поле представляется, как матрица размерностью десять на двадцать. Каждый элемент матрицы соответствует «пикселю» игрового поля и может находится в одном из двух состояний: пустой и заполненный. Кроме игрового поля, у каждой игры есть дополнительная информация, которая выводится в боковой панели справа от игрового поля. Для дополнительной информации, не используемой во время игры, предусмотреть заглушки.
Игровое поле представляется, как матрица размерностью десять на двадцать. Каждый элемент матрицы соответствует «пикселю» игрового поля и может находиться в одном из двух состояний: пустой и заполненный. Кроме игрового поля, у каждой игры есть дополнительная информация, которая выводится в боковой панели справа от игрового поля. Для дополнительной информации, не используемой во время игры, следует предусмотреть заглушки.
Каждая библиотека с игрой должна иметь функцию, принимающую на вход пользовательский ввод. У консоли имеется восемь физических кнопок: начало игры, пауза, завершение игры, действие и четыре стрелочки.