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