[Java] MVC-модель, клеточный автомат «Жизнь»
MVC-модель
MVC (Model, View, Controller) - одна из идей разбиения проекта на логические части:
- View - классы ответственны за визуализацию (View переводится как вид/представление). Например ваша панель с отрисовкой геометрии или картинок, кнопки добавленные на
JFrame
. Или например HTML-страницы любого сайта. - Controller - классы реагирующие на действия пользователя. Например реализация
ActionListener
которая соответствующе реагирует на нажатия на какой-то кнопки или клавиши. - Model - если коротко, то все остальное. Если длинно - то основная логическая часть вашего приложения. Все сущности (например классы соответствующие игровым объектам), все их взаимодействия (например рассчет физики столкновений или обновление состояний клеток в клеточном автомате) и т.п..
Для чего это нужно:
- Чем лучше ваш проект разбит на логические части, тем менее тесно каждый кусочек кода связан с другими частями кода, и тем чище, проще и понятнее ваш код. А значит - меньше багов и быстрее разработка.
- Чтобы портировать проект с Java Swing (т.е. с окошек для компьютера) например на Android в случае хорошего разбиения на MVC достаточно изменить лишь части View и Controller.
Клеточные автоматы на примеры игры «Жизнь»
Про клеточные автоматы можно почитать подробнее на wikipedia, и там же можно прочитать про игру «Жизнь» Джона Конвея.
Основные идеи:
- Весь мир представлен клетчатой решеткой
- Каждая клетка либо занята (т.е. живая), либо свободна (т.е. мертвая)
- Каждый следующий момент времени состояние клетки перерассчитывается с учетом того какие состояния у соседних клеток были в предыдущий момент времени
Выглядеть это может например так:
Правила перерассчета состояния клетки:
- Соседями считаются соседние по стороне и диагонали клетки (итого восемь клеток):
- В бывшей мертвой (пустой) клетке зарождается жизнь (она становится заполненной) если среди ее соседей было ровно 3 живых соседа
- Если у бывшей живой клетки есть два или три живых соседа, то она продолжает жить
- Если у бывшей живой клетки меньше двух соседей, то она умирает от одиночества
- Если у бывшей живой клетки больше трех соседей, то она умирает от перенаселенности (от голода)
Задание
1.1) Скачайте zip-архив (альтернативно можете писать с чистого листа или отталкиваясь от кода в старом задании про шарик и кнопки).
1.2) Чтобы создать проект по этими исходникам создайте пустую папку “GameLife” и скопируйте в нее папку “src” из архива. Затем в IDEA нажмите File -> New -> Project from Existing Sources… и откройте папку “GameLife”, затем идите по Next
1.3) Проверьте что готовый код у вас запускается и появляется окошко с двумя кнопками.
2) Начните с класса LifeWorld из пакета model, он должен описывать клетчатый мир клеток:
- В конструкторе создавать двумерный массив клеток с изначально мертвым состоянием
- Должен быть метод
randomize()
который оживит или убьет каждую клетку с некоторой вероятностью - Должен быть метод
isAlive(int x, int y)
который возвращаетtrue
если клетка жива, иначе -false
- Должен быть метод
updateWorld()
который обновит состояния клеток по правилам игры «Жизнь» (т.е. сделает один шажок времени и перерассчитает состояния с учетом того сколько соседей были живы)
3) Реализуйте отрисовку клеточек мира в классе LifePanel из пакета view:
- Вам нужно живые клеточки отрисовать одним цветом, а мертвые - другим
4) Собираем все вместе:
- В
Main.main
убедитесь что после создания все клетки мира были переведены в случайное состояние - Убедитесь что метод обновления состояния клеток регулярно вызвается
- Добавьте возможность перезапустить игру по нажатию на вторую кнопку (переведя при нажатии все клетки в случайное состояние)
5) Улучшения:
- Сделайте так чтобы при нажатии на кнопку паузы обновление мира ставилось на паузу. Например вам может помочь вспомнить как это делалось в старом задании про шарик и кнопки.
- Переведите моделируемый клеточный автомат с игры «Жизнь» на многоцветный циклический клеточный автомат:
Альтернативная версия - Жизнь частиц
Если вы не ищете легких путей, не считаете что мы живем на клеточной решетке и вообще за непрерывное и свободное движение в пространстве, то можете реализовать жизнь частиц как рассказано в этом видеоролике и показано на этом или этом сайте: