Implementation - GUI step
This commit is contained in:
157
README.md
Normal file
157
README.md
Normal 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
|
||||
Reference in New Issue
Block a user