Skip to content

Это реализация игры "Жизнь" Джона Хортона Конвея в трёхмерном пространстве, с использованием OpenGL для визуализации.

License

Notifications You must be signed in to change notification settings

AsuRaHan/GameOfLife3D

Repository files navigation

Game of Life

Статус сборки

Build status Build status

Скриншоты

Пример пользовательского интерфейса.

Game of Life 3D

Пример скрытого пользовательского интерфейса.

Game of Life 3D

Обзор

Game of Life - это визуализация классической игры "Жизнь" Конвея с использованием OpenGL. Проект позволяет пользователям исследовать динамику клеточных автоматов в интерактивной среде, где вы можете вращать, перемещать камеру и взаимодействовать с клетками.

Данный проект расширяет классический клеточный автомат "Жизнь". Клетки существуют на сетке, где их жизнь или смерть в каждом поколении зависит от количества соседних клеток.

Скачать

Чтобы скачать последнюю версию программы, нажмите на следующую ссылку:

Скачать последний релиз

Проект включает в себя:

  • Визуализация: Отображение сетки и клеток в трёхмерном пространстве.
  • Взаимодействие с пользователем: Управление симуляцией, движение камеры и изменение состояния клеток.
  • Рендеринг OpenGL: Использование современных методов OpenGL для достижения высокой производительности.
  • Интерфейс пользователя ImGui: Библиотека позволяет легко настраивать и изменять интерфейсы.
  • Управление Паттернами: Добавлена возможность загрузки и размещения паттернов из файлов .cells через класс PatternManager, что упрощает добавление новых фигур в игру.
  • Многотипные клетки:
    • Игроки могут вручную размещать три основных типа клеток: зелёный (1), красный (2) и синий (3).
    • При рождении новых клеток могут появляться дополнительные типы, зависящие от преобладания соседей:
    • Жёлтый (4) — равенство зелёных и красных соседей.
    • Оранжевый (5) — равенство зелёных и синих соседей.
    • Фиолетовый (6) — равенство красных и синих соседей.
    • Белый (7) — редкий тип, когда все три основных типа соседей равны (зелёный = красный = синий).
  • Случайная генерация: Начальная расстановка клеток включает все 7 типов с равной вероятностью, что делает каждую игру уникальной.

Правила игры следующие:

  • Начальное состояние: Игра начинается с начальной конфигурации клеток, где некоторые клетки живы, а другие мертвы.
  • Соседство: Каждая клетка имеет восемь соседей (клетки, которые находятся непосредственно рядом, включая диагональные).
  • Правила обновления: На каждом шаге (или поколении) состояние каждой клетки обновляется в соответствии с следующими правилами:
  • Смерть от одиночества: Живая клетка умирает, если у нее меньше двух живых соседей.
  • Смерть от перенаселенности: Живая клетка умирает, если у нее больше трех живых соседей.
  • Выживание: Живая клетка остается живой, если у нее два или три живых соседа.
  • Рождение: Мертвая клетка становится живой, если у нее ровно три живых соседа.
  • Поколения: После применения правил ко всем клеткам, создается новое поколение, и процесс повторяется.

Основные функции

  • 3D визуализация: Игра отображается в трехмерном пространстве, где клетки представлены на плоскости.
  • Реализация на GPU: Для ускорения симуляции используется GPU через OpenGL Compute Shaders.
    • Интерактивное управление:
    • Навигация камеры: Используйте клавиши WSADQE для перемещения камеры.
    • Изменение состояния клеток: Левая кнопка мыши позволяет переключать состояние клеток (живые/мертвые).
  • Цветная клеточная сетка: Клетки могут иметь разные цвета в зависимости от их состояния и типа.
  • Управление симуляцией:
    • Запуск/остановка: Пробел для управления симуляцией.
    • Пошаговое выполнение: Стрелки вправо для перехода к следующему поколению.
  • Рандомизация сетки: Клавиша 'R' для случайного заполнения поля.
  • Управление правилами: Реализована возможность динамически менять правила игры:
    • Рождение: Количество живых соседей, необходимое для рождения новой клетки.
    • Выживание: Минимальное и максимальное количество живых соседей, при котором клетка выживает.
    • Перенаселение: Количество живых соседей, при котором клетка умирает от перенаселения.
  • Интерфейс пользователя: Используется ImGui для создания пользовательского интерфейса:
    • Управление симуляцией (старт, стоп, следующий шаг).
    • Выбор и размещение паттернов (Glider, Blinker и т.д.).
    • Настройка правил игры через комбобоксы.
  • Сетка и визуализация:
    • Возможность переключаться между отображением и скрытием сетки.
    • Поддержка тороидального мира или ограниченного поля.
  • Сохранение и загрузка: Механизмы для сохранения и загрузки состояния игры.
  • Камера: Реализована навигация по 3D пространству с возможностью перемещения камеры.

Управление

  • Пробел: Запуск/остановка симуляции.
  • ENTER: Шаг вперёд.
  • WSADQE: Перемещение камеры вперед, назад, влево, вправо, вверх, вниз.
  • END: Повернуть паттерн в режиме вставки паттернов на 90градусов, клавишами со трелками отризить вертикально или горизонтально (FLIP).
  • R: Случайное заполнение поля.
  • T: Сброс камеры, чтобы весь игровой мир был виден.
  • Y: Сменить тип мира (сетка с ограниченными краями или с тороидальными краями).
  • I: Скопировать выделенную область как паттерн для вставки.
  • P: Активировать режим вставки паттерна на игровое поле, ESCAPE деактивировать режим вставки паттернов.
  • C: Очистка поля, убить все клетки.
  • G: Спрятать или показать сетку.
  • Колесико мыши: Масштабирование (зум). Чтобы увеличить скорость масштабирования, удерживайте левый Control (Ctrl).
  • Правый клик и перетаскивание: Перемещение камеры.
  • ЛКМ: Изменение состояния клетки под курсором.
  • ЛКМ + SHIFT и перетаскивание: Выделить поле, после чего клавишами INSERT вставить в выделеное место живые клетки, на DELETE удалить живые клетки, ESCAPE снять выделение.
  • СКМ (клик колесиком мыши): Добавить фигуру из предустановленных петтернов(шаблонов) или из выбранных файлов.
  • Клавиши от 1 до 6 + CTRL: Выбор различных предустановленных паттернов для размещения на поле:
    • 1: Глайдер
    • 2: Мигалка (Blinker)
    • 3: Живок (Toad)
    • 4: Баржа (Beacon)
    • 5: Маятник (Pentadecathlon)
    • 6: Ружьё Госпера (Gosper Glider Gun)
  • Клавиши от 1 до 7: Выбор Цвета и типа клетки:
    • 1: синий (type = 1)
    • 2: зелёный (type = 2)
    • 3: голубой (type = 3)
    • 4: красный (type = 4)
    • 5: фиолетовый (type = 5)
    • 6: жёлтый(type = 6)
    • 7: белый(type = 7)

Turbo Mode (Experimental Feature)

Game of Life 3D

  • Turbo Mode — это экспериментальный режим симуляции, который превращает вашу "Игру Жизни" в настоящий ускоритель частиц! В этом режиме мы выжимаем максимум из GPU, позволяя выполнять несколько шагов симуляции за один кадр рендеринга. Результат? Скорость симуляции взлетает до небес, но стабильность остаётся под вопросом.
  • Как это работает?
    • Включите Turbo Mode через кнопку в окне "Управление симуляцией" (ищите красную кнопку — её сложно пропустить!).
    • Количество шагов симуляции за кадр (Simulation Steps) автоматически подстраивается в зависимости от текущего FPS, пытаясь удерживать рендеринг на частоте вашего монитора (по умолчанию 75 Гц).
    • Чем больше шагов, тем быстрее эволюционирует ваша сетка — но и тем выше нагрузка на систему.
  • Предупреждение: Экспериментальная зона!
    • Стабильность: Этот режим нестабилен и зависит от размера сетки, мощности вашего GPU и настроек параметров. На больших сетках (например, 10000×10000) возможны просадки FPS, зависания или странные глюки — от "волн" в скорости симуляции до внезапных "турбо-скачков".
    • По умолчанию: Режим выключен, и игра работает в стандартном стабильном режиме с одной симуляцией на кадр. Включайте Turbo Mode только если готовы к приключениям!
  • Почему это круто?
    • На маленьких сетках вы получите молниеносную симуляцию без потери FPS.
    • На больших сетках это как тест на выносливость для вашего GPU — сможете ли вы укротить хаос?
  • Как использовать?
    • Откройте окно "Управление симуляцией".
    • Найдите кнопку "Turbo Mode" (красная, как сигнал опасности).
    • Нажмите её, чтобы включить/выключить режим.
    • Наблюдайте, как ваша симуляция либо взлетает, либо эпично падает — зависит от удачи и настроек!
  • Примечание: Мы не гарантируем, что ваша видеокарта не начнёт молить о пощаде, а игра — вести себя как космический корабль на автопилоте с пьяным штурманом. Это эксперимент, так что играйте с ним на свой риск и получайте удовольствие от хаоса!

Автопилот в режиме Turbo Mode

Game of Life 3D

Если скорость симуляции то возрастаяет то падает, и идут просадки ФПС, то необходимо увеличить задержку симуляции приблизительно на то число которое указано ниже слайдера так же можно поставить галочку в чекбокс автопилота который будет автоматически подстраивать задержку для выравнивания ФПС

Для разработчиков

Установка

Для настройки и запуска проекта:

  1. Необходимые условия:

    • Операционная система Windows
    • Visual Studio версии не ниже 2022 с инструментами для разработки на C++
    • Библиотеки и заголовочные файлы OpenGL. GL.h glu.h opengl32.lib
  2. Установка:

git clone --recursive https://github.com/AsuRaHan/GameOfLife3D.git
cd GameOfLife3D
git submodule update --init --recursive
  1. Обновление репозитория и подмодулей:
    • Перейдите в вашу директорию проекта
git pull origin main
git submodule update --recursive --remote
  1. Сборка:

    • Откройте проект в Visual Studio 2022 или выше.
    • Настройте для разработки на Windows с поддержкой OpenGL.
    • Соберите решение.
  2. Сборка через гитхаб

    • Внесите изменение в проект, подготовте релиз.
    • Сделайте git tag.
git tag -a v1.0.0 -m "Версия 1.0.0"
git push origin v1.0.0
  1. Запуск:
    • Запустите собранное приложение.
    • Так же можно передать параметры в комендной строке что бы указать размер игрового поля -gridWidth 200 -gridHeight 150 по умолчанию 300x400. так же можно запустить в полноэкранном режиме передав параметр -fullscreen установить разрешение полноэкранного режима -screenResolution 800x600 life.exe -gridWidth 200 -gridHeight 150 -screenResolution 800x600 -fullscreen смотрите пример в run_life.bat

Возможности

  • Управление симуляцией:

    • Запуск/Остановка симуляции
    • Пошаговое продвижение по поколениям
  • Управление камерой в 3D:

    • Панорамирование, масштабирование
  • Управление сеткой:

    • Инициализация сетки случайными клетками
    • Изменение состояния отдельных клеток мышкой

Используемые технологии

  • C++ для основной логики и механики игры
  • OpenGL для визуализации
  • Windows API для управления окнами и обработки событий
  • ImGuiI для пользовательского интерфейса

Структура проекта

  • ./game: Основная логика игры:

    • Grid.h, Grid.cpp - Управление сеткой
    • GameController.h, GameController.cpp - Управление состоянием игры
    • GPUAutomaton.h, GPUAutomaton.cpp - Клеточный автомат, использующий для расчёта GPU
    • GameStateManager.h, GameStateManager.cpp - Управление загрузкой и сохранением мира
    • PatternManager.h, PatternManager.cpp - Управление загрузкой готовых паттернов
  • ./rendering: Код, связанный с рендерингом:

    • Camera.h, Camera.cpp - Камера для 3D вида.
    • CameraController.h, CameraController.cpp - Управление камерой.
    • Renderer.h, Renderer.cpp - Логика рендеринга в OpenGL.
    • UIRenderer.h, UIRenderer.cpp - Отрисовка и работа с GUI окна и меню.
    • SelectionRenderer.h, SelectionRenderer.cpp - Отрисовка линий выделения поля мышкой.
    • GridRenderer.h, GridRenderer.cpp - Отрисовка навигационной координатной сетки.
    • TextureFieldRenderer.h, TextureFieldRenderer.cpp - Отрисовка игрового поля на дальних расстояниях от самого поля, улучшает производительность не влияя на визуальное отображение.
    • CellsViewportRenderer.h, CellsViewportRenderer.cpp - Отрисовка игрового поля на ближних расстояниях от игрового поля, улучшает визуальное отображение.
    • IRendererProvider.h - Проводник для Renderer обеспечивающий обмен данными между разными классами. Это простой интерфейс, паттерн провайдер.
  • ./mathematics: Математические утилиты:

    • Matrix4x4.h, Matrix4x4.cpp - Операции с матрицами (на данный момент не используется)
    • Vector3d.h, Vector3d.cpp - Операции с векторами
  • ./windowing: Управление окнами и вводом:

    • MainWindow.h, MainWindow.cpp - Создание окна и базовая обработка событий
    • WindowController.h, WindowController.cpp - Обработка событий клавиатуры и мыши
    • GridPicker.h, GridPicker.cpp - Обработка кликов по сетке (игровому полю)
  • ./system: Настройка системы, OpenGL и пользовательского ввода:

    • OpenGLInitializer.h, OpenGLInitializer.cpp - Инициализация контекста OpenGL
    • GLFunctions.h, GLFunctions.cpp - Загрузка функций OpenGL (урезанный GLAD)
    • ShaderManager.h, ShaderManager.cpp - Создание компиляция проверка шейдеров (GLSL) OpenGL
    • SettingsManager.h, SettingsManager.cpp - Сохранение и загрузка пользовательских настроек.
    • InputHandler.h, InputHandler.cpp - Обработчик пользовательского ввода (клавиатура мыш).
    • PerformanceStats.h, PerformanceStats.cpp - Собирает статистику. ФПС, колличество симуляций и т.д.
    • InputEvent.h - Сама структура пользовательского ввода.
  • main.cpp: Точка входа приложения

Известные проблемы

  • Производительность может ухудшаться на очень больших сетках из-за сложности 3D визуализации и вычисления живых и неживых клеток.
  • Если устанавливать очень большой мир то требуется довольно продолжительное время для перестроки сетки из за этого игра может зависнуть на некоторое время(зависит от размеров мира)
  • Слишком большие миры могут долга загружатся или сохранятся

Будущие улучшения

  • Внедрена поддержка различных наборов правил для игры "Жизнь".
  • Добавлена функциональность для динамического изменения размера мира.
  • Оптимизирован рендеринг для повышения производительности на больших мирах и сложных узорах.
  • Реализована загрузка предустановленных узоров из файлов формата .cells, расположенных в папке patterns.
  • Улучшено время загрузки и сохранения состояния мира.
  • Ускорена перестройка мира при изменении его размеров.
  • Оптимизация функций случайного заполнения и полной очистки мира.

От автора

Не стесняйтесь сообщать о любых проблемах или предлагать улучшения!

  • Если вы хотите внести свой вклад:
    • Создайте форк репозитория
    • Сделайте изменения в своей копии
    • Отправьте pull request с описанием изменений
  • Связаться со мной вы можете в телеграмм
  • Собираю донаты тут

Что читал, кем вдохновлялся и где черпал информацию

Это мой первый проект на WinAPI и OpenGL.

Лицензия

Этот проект находится под лицензией MIT.

About

Это реализация игры "Жизнь" Джона Хортона Конвея в трёхмерном пространстве, с использованием OpenGL для визуализации.

Resources

License

Stars

Watchers

Forks

Packages

No packages published