Функция cycle является центральным моментом нашей программы. Она используется для вычисления правил применительно к каждой ячеке. Обратите внимание, что мы дублируем массив grid. Это делается для того, чтобы при изменении значения какого-нибудь элемента массива grid это не повлияло на дальнейшие вычисления на данном шаге программы. Все вычисления происходят опираясь на значения элементов массива baseGrid.
function cycle() {
// Дублируем массив grid. var baseGrid = duplicateGrid();
// Делаем проход по всем ячейкам,
for(y=0;y
for(x=0;x
thisBox = baseGrid[y][x];
mc = this["gridbox "+x+" "+y];
// Вычисляем количество "заселенных" ячеек вокруг
// данной.
n = 0;
n += baseGrid[y-1][x-1];
n += baseGrid[y-1][x];
n += baseGrid[y-1][x+1];
n += baseGrid[y][x-1];
n += baseGrid[y][x+1];
n += baseGrid[y+1][x-1];
n += baseGrid[y+1][x];
n += baseGrid[y+1][x+1];
// Если в этой ячейке уже была точка и если количество
// "жильцов" вокруг равно 2 или 3, то точка остается, .
if (thisBox) {
if ((n == 2) or (n == 3)) {
newValue = true;
} else {
newValue = false;
}
// Новая точка "рождается", если ячейка была пуста
//и если в смежных ячейках находится ровно 3 точки.
} else {
if (n == 3) {
newValue = true;
} else {
newValue = false;
}
}
// Меняем текущий кадр клипа mc.
grid[y][x] = newValue;
if (newValue) {
mc.gotoAndStop(2);
} else {
mc.gotoAndStop(1);
}
}
}
}
Функция duplicateGrid() создает копию массива grid и возвращает ее в качестве своего значения.
function duplicateGrid() {
var newGrid = new Array();
for(y=0;y
var temp = new Array();
for(x=0;x
temp.push(grid[y][x]);
}
newGrid.push(temp);
}
return(newGrid);
}
Да, но почему мы должны пользоваться функцией duplicateGrid(), вместо того чтобы просто приравнять массив baseGrid массиву grid? Потому что иначе у нас не было бы реальной копии массива. Вместо этого и grid и baseGrid ссылались бы на один и тоже массив и изменения в массиве grid появлялись бы и в массиве baseGrid.
Клип "actions" содержит обработчик onClipEvent (enterFrame), который вызывает функцию runCicle при каждом обращении к кадру. Эта функция проверяет глобальную переменную running и запускает сусle, если ее значение истинно (true).