Иллюстрированный самоучитель по созданию Flash-игр

Игра "Жизнь"

Подготовка ролика

В дополнение к четырем кнопкам (рис 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);
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.