Как уже говорилось, использование программного кода совместно в базовыми средствами визуальной разработки моделей в AnyLogic существенно расширяет возможности разработчика. В данной главе подробно описаны две модели, в которых включение фрагментов программного кода позволяет эффективно реализовать сложные структуры данных и алгоритмы поведения объектов, которые невозможно описать с помощью одних только визуальных средств.
8.1. Игра " Жизнь " (Life)
В этом разделе мы последовательно, шаг за шагом построим модель широко известной игры Life. Модель включает логику, которая должна выражаться программным кодом.
Постановка задачи
Игра "Жизнь" — это не игра в обычном смысле слова. В ней нет игроков, нет выигравших или проигравших. Игра состоит в том, что на двумерной решетке, разделенной на ячейки, каждая ячейка может быть в двух состояниях, живая либо мертвая. Состояния всех ячеек решетки меняются синхронно, по шагам. На каждом следующем шаге состояние ячейки зависит от ее состояния на предыдущем шаге и состояний восьми соседей в ее окружении также на предыдущем шаге. В зависимости от количества живых соседей, на очередном шаге ячейка становится живой или мертвой в соответствии со следующими правилами:
□мертвая ячейка, имеющая ровно три живых соседа, становится живой (рождение);
□ живая ячейка, имеющая два или три живых соседа, остается живой (выживает);
□ во всех остальных случаях ячейка умирает (умирает от перенаселения либо от одиночества) или остается мертвой.
Двумерная решетка из ячеек может быть бесконечной либо представлять собой тор.
Построение модели
Наиболее просто построить визуализацию модели как состоящую из NxN квадратных ячеек, цвет каждой из которых определяется элементом двумерного булева массива той же размерности nxn. Шаги выполнения модели удобно задавать с помощью циклического таймера, каждое срабатывание которого вызовет функцию, которая подсчитает живых соседей всех ячеек и при необходимости изменит их состояния. Именно эта функция, которая реализует логику поведения модели, должна быть определена как дополнительный код на алгоритмическом языке вместе с необходимыми структурами данных.
В AnyLogic определите новый проект LifeGame. Введите в него новую анимацию, в которой установите следующие параметры штриховой рамки, oг-раничивающей поле изображения в работающей модели: X = —420, Y = —50 Ширина = 890, Высота = 570.
Анимация: прямоугольный массив ячеек
В какое-либо место поля анимации введите прямоугольник с именем cell шириной и высотой по 10 (пикселов), которая будет представлять ячейеку игры "Жизнь". В поле Количество этих прямоугольников установите n*N» (статическое) значение цвета прямоугольника может быть произвольным. Определенный так набор реплицированных (размноженных) объектов (прямоугольников) составляет одномерный вектор из n*n фигур с номерами объектов от о до n*n-i. Определим в корневом активном объекте main целый параметр N со значением 45. Этот параметр устанавливает размер решетки.
Изменение состояний ячейки в игре "Жизнь" происходит в зависимости от количества окружающих ее живых ячеек, если они расположены в двумерной решетке. Однако определенный нами набор прямоугольников является одномерным — именно так представляется реплицированный объект в AnyLogic Для связи элементов одномерного вектора прямоугольников с двумерной решеткой в анимации будем считать, что в решетке первый индекс (будем его для определенности всегда обозначать i) пробегает значения от 0 до n-1 по оси Y вниз в координатах поля анимации, а второй индекс (будем его для определенности обозначать j) пробегает значения от о до n-1 по оси X вправо в координатах поля анимации (рис. 8.1).
Если номер прямоугольника в перечислении этих прямоугольников как од-номерного массива графических объектов есть index, то пара координат (i, j) этого прямоугольника в двумерной решетке может быть подсчитана так:
i=index/N |j=index%N
По умолчанию index — имя переменной в AnyLogic, пробегающей все значения номеров реплицированного объекта в окне его свойств. Поскольку мы определили размеры прямоугольника 10x10, то координаты прямоугольни-ков поле анимации легко определить так: X=10*(index%N) Y=10*(index/N)
Именно эти значения следует установить в поле динамических значений координат Х и У прямоугольников с именем cell в анимации. Все n*n пря-моугольников расположатся в плоскости поля анимации вплотную друг к другу в двумерной структуре. По оси X расположатся N первых прямоугольников, ниже расположатся n вторых и т. п.
Откомпилируйте модель. Сравните ее с моделью LifeGame1 папки Model Examples\Part II.