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) Улучшения:

  • Сделайте так чтобы при нажатии на кнопку паузы обновление мира ставилось на паузу. Например вам может помочь вспомнить как это делалось в старом задании про шарик и кнопки.
  • Переведите моделируемый клеточный автомат с игры «Жизнь» на многоцветный циклический клеточный автомат:

Пример двумерного циклического клеточного автомата

Альтернативная версия - Жизнь частиц

Если вы не ищете легких путей, не считаете что мы живем на клеточной решетке и вообще за непрерывное и свободное движение в пространстве, то можете реализовать жизнь частиц как рассказано в этом видеоролике и показано на этом или этом сайте:

Жизнь частиц