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

Дедукция

В начале каждой попытки функция createRow создает пять пустых мест и определяет их положение. Вдобавок устанавливается новый клип done, который располагается справа (рис. 14.4).

function createRow() {
    // Создается новый ряд из пяти пустых мест.
    attachMovie("rock", "rock" + row + "-" + i, row * 10 + i);
    clip = _root["rock" + row + "-" + i];
    clip._x = leftColLoc + i * horizSpace;
    clip._y = topRowLoc + row * vertSpace;
    clip.active = true;
    // Создается кнопка Done.
    attachMovie("done", "done", 1000);
    _root.done._x = rightColLoc + 20;
    _root.done._y = topRowLoc + row * vertSpace;
}

Когда игрок щелкает по кнопке Done, вызывается функция doneGuess. Сначала пять кнопок в текущем ряду становятся неактивными. В функции createRow свойству active каждого клипа было присвоено значение true. Теперь же этому свойству присваивается значение false (1). Код, прикрепленный к каждой кнопке, с помощью этого свойства определяет, можно ли щелкнуть по кнопке или нет.

В массиве temp содержатся номера каждого цвета последовательности (2). Например, если даны два первых цвета, один четвертый и два пятых, массив будет выглядеть следующим образом: [2.0.0.1.2].

Следующий цикл проверяет, сколько цветов точно совпадают с предопределенным расположением (3). Если были найдены совпадения, числа в массиве temp уменьшаются. То есть теперь в этом массиве отображаются те цвета, совпадения с которыми еще надо найти.

Следующий цикл проверяет несовпавшие цвета в последовательности игрока и определяет, какие из этих цветов находятся в массиве temp (4). Подсчитав, можно выяснить, сколько цветов правильно угаданы, но помешены не на свое место.

Следующие два цикла создают белые и черные камешки, которые будут соответствовать числу правильно угаданных цветов и числу угаданных цветов, расположенных не на своем месте (5).

Кнопка Done удаляется, так что теперь она не будет появляться в каждой строке (6). Когда пользователю дается следующая попытка, создается новая кнопка Done.

В конце функции проверяется, совпадают ли все пять цветов или нет (7). Если да, то ролик переходит к кадру "win". В противном случае код проверяет, была ли эта попытка десятой (последней), и если так, ролик перейдет к кадру "lose", иначе для следующей попытки вызывается функция createRow.

function doneGuess() {
    numRightSpot = 0;
    numRightColor = 0;
    //(1)  Пять кнопок становятся неактивными,
    for (i = 0; i < 5; i++) {
        _root["rock" + row + "-" + i].active = false;
    }
    //(2)  Определяем, сколько имеется кнопок одного цвета,
    temp = [0, 0, 0, 0, 0];
    for (i = 0; i < 5; i++) {
        temp[solution[i]]++;
    }
    //(3) Выясняем, сколько цветов правильно угадано,
    for (i = 0; i < 5; i++) {
        color = _root["rock" + row + "-" + i]._currentFrame - 2;
        if (color == solution[i]) {
            numRightSpot++;
            temp[color]--;
        }
    }
    //(4) Проверяем, сколько цветов угадано,
    //но находится не на своих местах.
    for (i = 0; i < 5; i++) {
        color = _root["rock" + row + "-" + i]._currentFrame– 2;
        if (color != solution[i]) {
            if (temp[color] > 0) {
                numRightColor++;
                temp[color]--;
            }
        }
    }
    //(5) Создаем белые камешки.
    level = row * 10 + 5;
    x = rightColLoc;
    for (i = 0; i < numRightSpot; i++) {
        attachMovie("rock", "white rock" + level, level);
        clip = _root["white rock" + level];
        clip.gotoAndStop("white");
        clip._x = x;
        clip._y = topRowLoc + row * vertSpace;
        level++;
        x += horizSpace;
    }
    // Создаем черные камешки.
    for (i = 0; i < numRightSpot; i++) {
        attachMovie("rock", "black rock" + level, level);
        clip = _root["black rock" + level];
        clip.gotoAndStop("black");
        clip._x = x;
        clip._y = topRowLoc + row * vertSpace;
        level++;
        x += horizSpace;
    }
    //(6) Удаляем кнопку Done.
    done.removeMovieClip()
    //(7) Выясняем, выиграл ли игрок,
    if (numRightSpot == 5) {
        gotoAndPlay("win");
    }
    else {
        row++;
        // Проверяем, проиграл ли игрок,
        if (row >= 10) {
            showSolution();
            gotoAndPlay("lose");
        }
        else {
            createRow();
        }
    }
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.