MAZE_GENERATOR — игра про генерацию и прохождение лабиринтов. Проект сочетает процедурную генерацию, поиск решения и графический интерфейс на raylib. Игрок задаёт размеры лабиринта, получает случайно созданную карту и проходит её от точки старта до выхода.
Главная идея проекта — показать, как можно построить случайный, но при этом решаемый лабиринт, а затем визуально представить его в удобном интерфейсе. В текстовой части лабиринт генерируется в виде двумерного массива символов и проверяется наличие пути от старта к выходу. В графической части пользователь взаимодействует с меню, задаёт параметры поля и знакомится с основными режимами игры.
| Функция | Статус |
|---|---|
| Случайная генерация лабиринта | ✅ Готово |
| Вход и выход на карте | ✅ Готово |
| Поиск единственного корректного пути | ✅ Готово |
| Авторизация игрока (логин) | ✅ Готово |
| Графическое меню с несколькими экранами | ✅ Готово |
| Настройка размеров лабиринта вручную | ✅ Готово |
| Анимированный прогресс-бар генерации | ✅ Готово |
| Логирование сессии в файл | ✅ Готово |
| Режим «Бот против Бота» | 🔧 В разработке |
| Ввод ключа / seed | ✅ Готово |
Название: 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 — лог сессий (создаётся автоматически)
Главное меню выполнено в тёмной стилистике с цветными акцентами и содержит основные разделы:
- Играть — переход к экрану авторизации (логин)
- Помощь — правила игры и описание управления
- Справка — информация об авторах и учебных данных проекта
- Выход — завершение работы приложения с записью в лог
Интерфейс построен на прямоугольных кнопках с подсветкой при наведении курсора.
Перед игрой пользователь вводит уникальный логин (до 32 символов, ASCII 33–126). Логин отображается в интерфейсе на протяжении всей сессии и записывается в лог-файл. Реализованы мигающий курсор, live-превью введённого имени и валидация пустого ввода.
Лабиринт создаётся автоматически на основе заданных пользователем ширины и высоты. Карта хранится в виде двумерного массива символов:
| Символ | Значение |
|---|---|
@ |
Стена |
|
Проход |
# |
Клетка правильного пути |
! |
Конечная клетка, в которую надо прийти |
v |
Посещённая клетка при поиске |
Размеры ограничены значениями от 3 до 100 по каждой оси. После генерации создаётся выход на нижней границе карты и запускается проверка пути от старта. При неудаче — до 200 повторных попыток.
- Игрок вводит логин и выбирает режим игры
- Задаёт ширину и высоту лабиринта
- Нажимает «Сгенерировать» — запускается анимированный прогресс-бар
- После генерации открывается игровой экран
- Игрок ведёт персонажа от стартовой точки
(1,1)до выходаВ - При достижении выхода — экран победы с возможностью сгенерировать новый лабиринт
Лабиринт строится по сетке с чередованием стен и проходов. Алгоритм работает в три этапа:
- Рамка — периметр заполняется стенами
- Сетка ячеек — внутри формируется структура из узловых точек
- Пробивка проходов — между ячейками случайным образом создаются коридоры вправо или вверх
Такой подход гарантирует случайную конфигурацию при сохранении общей связности карты.
Для поиска выхода используется рекурсивный обход в глубину (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 попыток).
- динамическое выделение памяти под карту (
char **map) - заполнение массива стенами и проходами
- случайная генерация структуры лабиринта
- поиск пути от старта к выходу (DFS)
- сброс маркеров пути (аргумент
showв функцииfind_wayравен 0) - освобождение памяти после работы (
free_lab)
- запуск окна raylib (1920×1080, 144 FPS)
- отрисовка всех экранов интерфейса
- обработка ввода: мышь + клавиатура
- переключение между экранами через enum
Screen - анимированный прогресс-бар (
GENERATING) - отображение игрока, старта и выхода на сетке
- автоматическое создание / дополнение файла
maze.log - формат записи:
[YYYY-MM-DD HH:MM:SS] [LEVEL] message - уровни:
INFOиERROR
Интерфейс выполнен в тёмной стилистике с подсветкой кнопок при наведении курсора.
| Экран | Описание |
|---|---|
MENU |
Стартовое меню |
LOGIN |
Ввод имени игрока |
MODE_SELECT |
Выбор режима игры |
GAME |
Настройка размеров лабиринта |
GENERATING |
Анимированный прогресс-бар генерации |
PLAYING |
Игровой процесс |
ABOUT |
Сведения об авторах и проекте |
HELP |
Правила и управление |
BOT_VS_BOT |
🔧 В разработке |
KEY_INPUT |
🔧 В разработке |
| Клавиша | Действие |
|---|---|
W / ↑ |
Движение вверх |
S / ↓ |
Движение вниз |
A / ← |
Движение влево |
D / → |
Движение вправо |
R |
Рестарт (вернуться на старт) |
ESC |
Пауза / вернуться к настройкам |
| Клавиша | Действие |
|---|---|
R |
Сгенерировать новый лабиринт |
ESC |
К настройкам |
| Ввод | Действие |
|---|---|
| ЛКМ | Выбор кнопок и полей ввода |
| Цифры | Ввод ширины / высоты |
Backspace |
Удаление последнего символа |
Enter |
Подтверждение логина |
┌─────────────────────────────────────────────────┐
│ 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] |
Имя текущего игрока |
- Компилятор C с поддержкой стандарта C11 (GCC / MinGW)
- Библиотека raylib
- Шрифт
DejaVuSansBold.ttfрядом с исполняемым файлом
gcc main.c graphic.c labyrinth.c error.c -lraylib -lopengl32 -lgdi32 -lwinmm -o maze_generator.exeИли через готовый скрипт:
build.batgcc -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обязан находиться в той же директории, что и исполняемый файл.
Все события сессии записываются в файл 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