From 7611276190a1e32b5de435c873ccec643b12eb12 Mon Sep 17 00:00:00 2001 From: SlavaVlad Date: Fri, 15 May 2026 01:30:25 +0300 Subject: [PATCH] Implementation - GUI step --- README.md | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..5998e75 --- /dev/null +++ b/README.md @@ -0,0 +1,157 @@ +# Лабораторная работа: Клеточные автоматы + +## Цель работы + +Изучение принципов функционирования и приобретение навыков программной реализации клеточных автоматов как дискретных вычислительных моделей. + +## Правила игры "Жизнь" (Game of Life) + +Классические правила Конвея: +1. В пустой (мёртвой) клетке, с которой соседствуют три живые клетки, зарождается жизнь; +2. Если у живой клетки есть две или три живые соседки, клетка продолжает жить; +3. В противном случае (если живых соседей меньше двух или больше трёх) клетка умирает ("от одиночества" или "от перенаселённости"). + +## Структура проекта + +``` +lab2/ +├── src/main/kotlin/ +│ ├── Main.kt # Точка входа в приложение +│ ├── model/ +│ │ ├── Config.kt # Модель конфигурации (сериализуемая) +│ │ ├── GameOfLife.kt # Реализация Game of Life +│ │ ├── OneDimensionalCA.kt # Реализация 1D клеточного автомата +│ │ └── OneDimensionalRule.kt # Правила для 1D автомата +│ ├── ui/ +│ │ ├── MainScreen.kt # Главный экран +│ │ ├── Sidebar.kt # Панель управления (слева) +│ │ └── gameoflife/ +│ │ ├── GameOfLifeView.kt # Визуализация Game of Life +│ │ └── PatternClassifier.kt # Классификация паттернов +│ ├── data/ +│ │ └── ConfigRepository.kt # Сохранение/загрузка JSON +│ └── util/ +│ └── ExperimentRunner.kt # Запуск экспериментов +├── build.gradle.kts # Конфигурация сборки +└── config.json # Файл конфигурации (создаётся при запуске) +``` + +## Реализованные задачи + +### Задание 1: Одномерный клеточный автомат + +Реализован элементарный одномерный клеточный автомат с поддержкой правил: +- **Правило 30** - хаотичный паттерн +- **Правило 90** - фрактальный паттерн (треугольник Серпинского) +- **Правило 110** - универсальный клеточный автомат (эквивалент машине Тьюринга) +- **Правило 184** - модель дорожного движения + +Функциональность: +- Визуализация нескольких итераций эволюции автомата +- Режимы отображения: "Трейс" (история поколений) и "Текущее" (только последнее поколение) +- Настраиваемая ширина поля (10-200 ячеек) +- Начальные условия: центр или случайное заполнение + +### Задание 2: Двумерный клеточный автомат "Жизнь" + +Реализована полная модель Game of Life с: +- Классическими правилами Конвея +- Интерактивным полем (клик для изменения состояния клетки) +- Отображением номера поколения и количества живых клеток + +#### Задание 2.1: Серия экспериментов + +Проводятся эксперименты со случайным начальным заполнением: +- Плотности: 0.1, 0.2, 0.3, 0.4, 0.5 +- 10 запусков для каждой плотности +- Фиксация времени стабилизации (N=10 поколений без изменения population) +- Результаты сохраняются в `stabilization_graph.png` + +Стабильной фазой считается момент, когда в течение 10 поколений общее количество живых клеток не меняется или меняется циклически между двумя значениями. + +#### Задание 2.2: График зависимости + +По результатам экспериментов строится график зависимости среднего времени стабилизации от начальной плотности заполнения (используется библиотека XChart). + +#### Задание 2.3: Классификация паттернов + +Автоматическая классификация обнаруженных фигур: +- **Устойчивые (Still Life)**: блок, улей, лодка, труба +- **Периодические (Oscillators)**: бликер, пульсар +- **Движущиеся (Spaceships)**: глайдер (glider) +- **Малые фигуры**: одиночная клетка, пара, триада + +Подсчитывается количество изолированных комбинаций клеток (объектов) и отображается в интерфейсе. + +## Интерфейс приложения + +### Сайдбар (слева) +- Выбор режима автомата (1D / Game of Life) +- Выбор правила для 1D автомата +- Настройка размера поля (10-500 для 2D, 10-200 для 1D) +- Настройка скорости симуляции (1-60 FPS) +- Настройка вероятности заполнения (для случайного запуска) +- Кнопки: Старт/Стоп, Сброс, Случайное заполнение +- Запуск экспериментов (только для Game of Life) +- Загрузка/сохранение паттернов из файла + +### Поле (справа) +- Интерактивная сетка клеток +- Для Game of Life: клик для изменения состояния клетки +- Отображение текущего состояния в реальном времени + +## Сохранение конфигурации + +Конфигурация автоматически сохраняется в файл `config.json` при каждом изменении настроек. Включает: +- Текущий режим автомата +- Размер поля +- Скорость симуляции +- Вероятность заполнения +- Выбранное правило для 1D +- Текущее состояние поля + +## Сборка и запуск + +### Требования +- JDK 21 +- Gradle (включён в проект) + +### Команды сборки + +```bash +# Сборка проекта +./gradlew build + +# Запуск приложения +./gradlew run + +# Создание дистрибутива (запускаемый бинарник) +./gradlew installDist + +# Создание ZIP-дистрибутива +./gradlew distZip +``` + +### Запуск скомпилированного приложения + +После сборки запустите: +```bash +cd build/install/lab2 +./bin/lab2 +``` + +Или распакуйте дистрибутив: +```bash +unzip build/distributions/lab2-1.0.zip +./lab2-1.0/bin/lab2 +``` + +Примечание: Для запуска требуется графическое окружение (X11/Wayland). + +## Технологии + +- **Язык**: Kotlin 2.3.0 +- **UI Framework**: Jetpack Compose for Desktop +- **Графики**: XChart 3.8.8 +- **Сериализация**: Kotlinx Serialization 1.7.3 +- **Сборка**: Gradle с Compose Plugin \ No newline at end of file