Skip to content

Latest commit

 

History

History
283 lines (224 loc) · 24.5 KB

README.md

File metadata and controls

283 lines (224 loc) · 24.5 KB

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.