Implementation - GUI step

This commit is contained in:
2026-05-15 01:30:25 +03:00
parent f8fc7f64cc
commit 7611276190

157
README.md Normal file
View File

@@ -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