Skip to content

paulxcalder/maze_game

Repository files navigation

MAZE GENERATOR


1. Об игре

MAZE_GENERATOR — игра про генерацию и прохождение лабиринтов. Проект сочетает процедурную генерацию, поиск решения и графический интерфейс на raylib. Игрок задаёт размеры лабиринта, получает случайно созданную карту и проходит её от точки старта до выхода.

Главная идея проекта — показать, как можно построить случайный, но при этом решаемый лабиринт, а затем визуально представить его в удобном интерфейсе. В текстовой части лабиринт генерируется в виде двумерного массива символов и проверяется наличие пути от старта к выходу. В графической части пользователь взаимодействует с меню, задаёт параметры поля и знакомится с основными режимами игры.

Особенности

Функция Статус
Случайная генерация лабиринта ✅ Готово
Вход и выход на карте ✅ Готово
Поиск единственного корректного пути ✅ Готово
Авторизация игрока (логин) ✅ Готово
Графическое меню с несколькими экранами ✅ Готово
Настройка размеров лабиринта вручную ✅ Готово
Анимированный прогресс-бар генерации ✅ Готово
Логирование сессии в файл ✅ Готово
Режим «Бот против Бота» 🔧 В разработке
Ввод ключа / seed ✅ Готово

2. Техническая сводка

Название:     MAZE_GENERATOR
Авторы:       paulxcalder & DaniiarAbd
Язык:         C (стандарт C11)
Графика:      raylib
Версия ТЗ:    2.0

Структура файлов

MAZE_GENERATOR/
├── main.c           — точка входа, инициализация RNG
├── labyrinth.c      — генерация лабиринта, поиск пути, вывод в консоль
├── labyrinth.h      — заголовок модуля лабиринта
├── graphic.c        — графический интерфейс, меню, экраны
├── graphic.h        — заголовок графического модуля
├── error.c          — логирование INFO / ERROR в файл
├── error.h          — заголовок модуля логирования
├── build.bat        — сборка под Windows
├── DejaVuSansBold.ttf  — шрифт (должен лежать рядом с .exe)
└── maze.log         — лог сессий (создаётся автоматически)

3. Функциональные возможности

3.1 Главное меню

Главное меню выполнено в тёмной стилистике с цветными акцентами и содержит основные разделы:

  • Играть — переход к экрану авторизации (логин)
  • Помощь — правила игры и описание управления
  • Справка — информация об авторах и учебных данных проекта
  • Выход — завершение работы приложения с записью в лог

Интерфейс построен на прямоугольных кнопках с подсветкой при наведении курсора.

3.2 Авторизация

Перед игрой пользователь вводит уникальный логин (до 32 символов, ASCII 33–126). Логин отображается в интерфейсе на протяжении всей сессии и записывается в лог-файл. Реализованы мигающий курсор, live-превью введённого имени и валидация пустого ввода.

3.3 Генерация лабиринта

Лабиринт создаётся автоматически на основе заданных пользователем ширины и высоты. Карта хранится в виде двумерного массива символов:

Символ Значение
@ Стена
Проход
# Клетка правильного пути
! Конечная клетка, в которую надо прийти
v Посещённая клетка при поиске

Размеры ограничены значениями от 3 до 100 по каждой оси. После генерации создаётся выход на нижней границе карты и запускается проверка пути от старта. При неудаче — до 200 повторных попыток.

3.4 Игровой процесс

  1. Игрок вводит логин и выбирает режим игры
  2. Задаёт ширину и высоту лабиринта
  3. Нажимает «Сгенерировать» — запускается анимированный прогресс-бар
  4. После генерации открывается игровой экран
  5. Игрок ведёт персонажа от стартовой точки (1,1) до выхода В
  6. При достижении выхода — экран победы с возможностью сгенерировать новый лабиринт

4. Алгоритмы

Генерация лабиринта

Лабиринт строится по сетке с чередованием стен и проходов. Алгоритм работает в три этапа:

  1. Рамка — периметр заполняется стенами
  2. Сетка ячеек — внутри формируется структура из узловых точек
  3. Пробивка проходов — между ячейками случайным образом создаются коридоры вправо или вверх

Такой подход гарантирует случайную конфигурацию при сохранении общей связности карты.

Поиск пути

Для поиска выхода используется рекурсивный обход в глубину (DFS). Функция проверяет соседние клетки в четырёх направлениях: вправо → вниз → влево → вверх.

Старт (1,1) ──► DFS ──► Выход (x_end, y_end)
                │
          map[y][x] == wall?  ──► return 0
          map[y][x] == visited? ──► return 0
          map[y][x] == right_way? ──► return 1
                │
          Отметить как visited
          Рекурсия по 4 направлениям
                │
          Путь найден ──► map[y][x] = '#' (если аргумент 'show' передан как ненулевое число, предпочтительно единица)

Если путь не найден, поиск повторяется на новой сгенерированной карте (до 200 попыток).


5. Логика игры

Консольная часть (labyrinth.c)

  • динамическое выделение памяти под карту (char **map)
  • заполнение массива стенами и проходами
  • случайная генерация структуры лабиринта
  • поиск пути от старта к выходу (DFS)
  • сброс маркеров пути (аргумент show в функции find_way равен 0)
  • освобождение памяти после работы (free_lab)

Графическая часть (graphic.c)

  • запуск окна raylib (1920×1080, 144 FPS)
  • отрисовка всех экранов интерфейса
  • обработка ввода: мышь + клавиатура
  • переключение между экранами через enum Screen
  • анимированный прогресс-бар (GENERATING)
  • отображение игрока, старта и выхода на сетке

Модуль логирования (error.c)

  • автоматическое создание / дополнение файла maze.log
  • формат записи: [YYYY-MM-DD HH:MM:SS] [LEVEL] message
  • уровни: INFO и ERROR

6. Интерфейс

Интерфейс выполнен в тёмной стилистике с подсветкой кнопок при наведении курсора.

Экраны

Экран Описание
MENU Стартовое меню
LOGIN Ввод имени игрока
MODE_SELECT Выбор режима игры
GAME Настройка размеров лабиринта
GENERATING Анимированный прогресс-бар генерации
PLAYING Игровой процесс
ABOUT Сведения об авторах и проекте
HELP Правила и управление
BOT_VS_BOT 🔧 В разработке
KEY_INPUT 🔧 В разработке

7. Управление

Игровой экран

Клавиша Действие
W / Движение вверх
S / Движение вниз
A / Движение влево
D / Движение вправо
R Рестарт (вернуться на старт)
ESC Пауза / вернуться к настройкам

Экран победы

Клавиша Действие
R Сгенерировать новый лабиринт
ESC К настройкам

Меню и ввод

Ввод Действие
ЛКМ Выбор кнопок и полей ввода
Цифры Ввод ширины / высоты
Backspace Удаление последнего символа
Enter Подтверждение логина

8. Архитектура проекта

┌─────────────────────────────────────────────────┐
│                    main.c                        │
│         srand()  →  RunMazeGenerator()           │
└────────────────────┬────────────────────────────┘
                     │
         ┌───────────┴───────────┐
         │                       │
   graphic.c                labyrinth.c
   ─────────                ───────────
   InitWindow()             generate_lab()
   Screen enum              find_way()
   DrawMenu()               reset_path_marks()
   DrawLogin()              print_lab()
   DrawModeSelect()         free_lab()
   DrawGame()
   DrawGenerating()              error.c
   DrawPlaying()                 ───────
   DrawAbout()              log_info()
   DrawHelp()               log_error()
   DrawBotVsBot()           log_close()
   DrawKeyInput()

Ключевые сущности

Переменная Тип Описание
map char ** Двумерная карта лабиринта
width, height size_l Размеры поля
x_end, y_end size_l Координаты выхода
wall char Символ стены — @
way char Символ прохода —
right_way char Символ правильного пути — #
visited char Символ посещённой клетки — v
Screen enum Текущий экран интерфейса
login_name char[33] Имя текущего игрока

9. Сборка

Требования

  • Компилятор C с поддержкой стандарта C11 (GCC / MinGW)
  • Библиотека raylib
  • Шрифт DejaVuSansBold.ttf рядом с исполняемым файлом

Windows

gcc main.c graphic.c labyrinth.c error.c -lraylib -lopengl32 -lgdi32 -lwinmm -o maze_generator.exe

Или через готовый скрипт:

build.bat

Linux

gcc -std=c11 main.c graphic.c labyrinth.c error.c \
    -lraylib -lm -lpthread -ldl -lrt -lX11 \
    -o maze_generator

Если raylib установлена в нестандартном месте, пути и флаги линковки могут отличаться.

Запуск

# Windows
maze_generator.exe

# Linux
./maze_generator

⚠️ Файл DejaVuSansBold.ttf обязан находиться в той же директории, что и исполняемый файл.


10. Логирование

Все события сессии записываются в файл maze.log в формате:

[YYYY-MM-DD HH:MM:SS] [LEVEL] сообщение

Пример лога реальной сессии:

[2026-04-14 14:43:14] [INFO]  Application started
[2026-04-14 14:43:41] [INFO]  User logged in: test1
[2026-04-14 14:43:53] [INFO]  generate_lab: labyrinth generated successfully
[2026-04-14 14:43:53] [INFO]  Labyrinth 15x30 generated, user=test1
[2026-04-14 14:43:55] [INFO]  Entering PLAYING screen
[2026-04-14 14:44:10] [INFO]  User test1 reached the exit!
[2026-04-14 14:44:12] [INFO]  Application shutdown

IN GOD WE TRUSTED

About

курсовая по СД 2026

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors