Дедукция
В начале каждой попытки функция 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(); } } }