Игра "Жизнь"
Подготовка ролика
В дополнение к четырем кнопкам (рис 6.15) необходимо создать клип-ячейку. Назовем этот клип "gridbox". Он не должен изначально находиться на рабочем поле, но ему надо присвоить имя в панели Linkage Properties, чтобы можно было создавать его копии с помощью ActionScript.
Клип "gridbox" должен содержать два кадра – один с точкой, а второй – в виде пустой ячейки. Первому кадру назначьте сценарий с командой stop (). В отдельный слой клипа поместите кнопку, чтобы пользователь мог кликать по ячейке.
Наконец, создайте клип "actions", который будет содержать обращение к основной функции нашего кода.
Создание кода
Первая функция создает сетку из 25x15 ячеек и двумерный массив, Каждая строка массива представляет собой столбец (одномерный массив) булевых переменных. Таким образом, для доступа к верхнему левому элементу сетки надо написать grid[0][0], а для доступа к пятому элементу и седьмому сверху – grid[4] [6] (то есть центр координат находится в верхнем левом углу).
function createGridO { // Создаем клипы и заполняем массив, grid = new Array(); for (y = 0; y < 15; y++) { var temp = new ArrayO; for (x = 0; x < 25; x++) { me = attachMovie("gridbox", "gridbox " + x + " " + y, y * 25 + x); mc._x = x * 20 + 30; mc._y = y * 20 + 30; mc.x = x; mc.y = y; temp.push(false); } grid.push(temp); } }Функция cycle является центральным моментом нашей программы. Она используется для вычисления правил применительно к каждой ячеке. Обратите внимание, что мы дублируем массив grid. Это делается для того, чтобы при изменении значения какого-нибудь элемента массива grid это не повлияло на дальнейшие вычисления на данном шаге программы. Все вычисления происходят опираясь на значения элементов массива baseGrid.
function cycle() { // Дублируем массив grid. var baseGrid = duplicateGrid(); // Делаем проход по всем ячейкам, for (y = 0; y < 15; y++) { for (x = 0; x < 25; 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 < 15; y++) { var temp = new Array(); for (x = 0; x < 25; x++) { temp.push(grid[y][x]); } newGrid.push(temp); } return(newGrid); }