91824841

Если мелодий больше нет, игрок


function clickBird(note) {

// Воспроизводим анимацию птицы.

_root["bird"+note].gotoAndPlay(2);

// Воспроизводим анимацию сообщения.
_root["note"+note].gotoAndPlay(2);

// Проверяем, правильно ли был выбран элемент,

if (note == notes[repeatNum]) {

// Ожидаем воспроизведения следующей мелодии.

repeatNum++;

// Если мелодий больше нет, игрок правильно угадал

// последовательность.

if (repeatNum > notes.length-1) {

scoreDisplay = "Score: " + notes.length;

gotoAndPlay("correct ");

}

} else {

// Игрок ошибся. gotoAndPlay("wrong");

}}

Кадр "play" проигрывает каждую мелодию из последовательности в соответствии со сценарием, прикрепленным к клипу "playback actions". Сценарий начинается с того, что устанавливает две переменные. Переменная noteNum следит за тем, какое сообщение должно быть проиграно следующим, а переменная nextTime - когда оно должно быть проиграно.



onClipEvent(load) {

// Начинаем с мелодии, под номером 0.

noteNum = 0;

nextTime = 0 ;

}

На каждом шаге ролика в кадре "play" текущее время сравнивается со значением переменной nextTime. Если текущее время превышает это значение, проигрывается следующая мелодия. Анимация пения и птицы инициализируются точно так же, как если бы они вызывались при щелчке мышью. Затем изменяются значения переменных noteNum и nextTime, чтобы подготовиться к воспроизведению следующей мелодии. Переменная nextTime увеличивается на 1000, то есть следующая мелодия будет проиграна через одну секунду. Когда будут проиграны все сообщения, ролик вызовет функцию startRepeat, которая была рассмотрена ранее. То есть игра перейдет к кадру "repeat" и будет ждать, когда пользователь попытается восстановить последовательность.

onClipEvent(enterFrame) {

// Выясняем, пришло ли время проиграть следующую мелодию,

if (getTimerO > nextTime) {

// Получение сообщения,

note = _root.notes[noteNum];

// Проигрывается анимация пения

//и соответствующий звуковой файл.

_root["bird"+note].gotoAndPlay(2);

_root[Mnote"+note].gotoAndPlay(2);

// Ждем одну секунду, прежде чем проиграть следующую

// мелодию.

nextTime = getTimer() + 1000;

noteNUm++;

// Если больше сообщений нет, продолжаем со следующего

// шага.

if (noteNum > _root.notes.length) {

_root.startRepeat();}

}}

Каждая кнопка, расположенная на рабочем поле в кадре "repeat", при щелчке по ней должна вызывать функцию clickBird. Каждый из четырех сценариев немного отличается от остальных, так как они должны передать функции различные числа. Вот сценарий для одной из кнопок:

on (press) {
clickBird (1);
}



function doneGuess() {

numRightSpot = 0;

numRightColor = 0;

(1) // Пять кнопок становятся неактивными,

for (i=0;i

_root ["rock"+row+"-"+i] .active = false;

}

(2) // Определяем, сколько имеется кнопок одного цвета,

temp = [0,0,0,0,0] ;

for (i=0;i

temp[solution[i] ]++;}

(3)// Выясняем, сколько цветов правильно угадано,

for (i=0;i

color = _root["rock"+row+"-"+i]._currentFrame - 2;

if (color == solution[i]) {

numRightSpot++;

temp[color]--;

}}

(4)// Проверяем, сколько цветов угадано,

// но находится не на своих местах.

for (i=0;i

color = _root["rock"+row+"- currentFrame - 2;

if (color != solution[i]) {

if (temp[color] > 0) {

numRightColor++;

temp[color]--;

}
}}

(5)// Создаем белые камешки.

level = row*10+5;

х = rightColLoc;

for(i=0;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

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();

}}}

Когда игрок проигрывает, функция showSolution создает пять новых экземпляров клипа и с их помощью отображает правильный вариант. В ролике, это решение располагается в нижней части игрового поля.

function showSolution() {

// Размещаем правильный вариант внизу экрана.

for(i=0;i

attachMovie("rock","solution"+i,1001 + i) ;

clip = _root["solution"+i];



Функция dropDrag вызывается тогда, когда игрок отпускает кнопку мыши при перетаскивании. Сначала клип прекращает перемещение (8). Затем с помощью функции dropDrag выясняется, находится ли какое-нибудь отверстие под курсором (9).
Если курсор мыши расположен над дыркой, следующий шаг - определить, пустое ли отверстие или нет (10). Затем код проверяет отверстия во всех четырех направлениях, чтобы выяснить, из какой дырки мог быть перемешен колышек. Для определения относительного положения отверстия используются переменные dx и dy (11). Например, если игрок перемещает колышек вправо, dx присваивается 1, a dy - 0. Если вверх, то dy будет равняться -1, a dx - 0. Если отверстие, куда игрок перемещает колышек, не расположено через одну дырку вправо, влево, вверх или вниз, значения dx и dy становятся равными 0 (12).
Даже если игрок перемешает колышек через одно отверстие, помещает его в пустое место, ход засчитывается только в том случае, если он "перепрыгивает" через другой колышек. Следующий фрагмент кода проверяет, есть ли такой "серединный" колышек (13). Если да, код его удаляет и указывает, что перемещаемый колышек теперь находится в новом месте. Если одно из этих условий не выполняется, значит, ход неверен. Значение переменной placed остается равным false, оно проверяется в конце функции (14). И колышек возвращается на свое исходное место.

function dropDrag(peg) {

(8) // Клип с колышком больше не перемещается.

stopDrag();
//По умолчанию ход неверен,
placed = false;
overole = false;

(9)// Определяем местоположение отверстия, над которым
// находится курсор,

for(i=0;i hole = _root["hole"+i];
if (hole.hitTest(_xmouse, _ymouse)) {
overeHole = true;
break;
}}

(10)// Выясняем, свободно ли отверстие,

if (IpegThere(hole._x, hole._y)) {

(11)// Определяем различие между исходным и конечным
// положениями,

dx = 0;
dy = 0;
if ((pegx == hole._x) and (pegy-holeSpace*2 == hole._y ) {
// сверху
dy = -1; } else if (pegx==hole._x) and
(pegy+holeSpace*2==hole._y)) {
// внизу
dy = 1;
} else if (pegy==hole._y) and (pegx-holeSpace*2==hole._x)) {
// слева
dx = -1;
} else if (pegy==hole.__y) and (pegx+holeSpace*2==hole._x)) {
// справа
dx = 1;
}

(12)// Значения dx и dy будут равны 0, если целевое отверстие
//не находится на необходимом расстоянии,

if ((dx != 0) or (dy != 0)) {

(13)// Выясняем, есть ли колышек посередине.

midThere = false; for(i=0;i mid = _root["peg"+i];
if ((mid._x == pegx + dx*holeSpace) and y == pegy + dy*holeSpace)) {
// Раз колышек здесь находится,
// значит, ход верный.
// Указываем новое положение колышка.
peg._x = hole._x;
peg._у = hole._y;
// Удаляем колышек посередине.
mid.removeMovieClip();
// Запоминаем, что ход верен.
placed = true;
break;
}}
}}

(14)// Проверяем, верный ли ход был сделан, и если нет,
// восстанавливаем исходное положение колышка,

if (placed) {
peg._x = pegx;
peg._y = pegy;
}}



// Определяем цвет этого блока.

var с = _root["block "+x+" "+y]._currentframe;

_root["block "+x+" "+y].gotoAndStop(5);

II Проверяем его соседей по всем направлениям.

var n = 1;

n += testNeighbor(х-1,у,с);

n += testNeighbor(х+1,у,с);

n += testNeighbor(х,у-1,с);

n += testNeighbor(х,у+1,с);

// Если один их них того же цвета,

if (n > 1) {

// Уничтожаем группу блоков.

collapseDown();

collapseAcross();

// Начисляем очки,

score += n*n;

} else {

// Оставляем блок на месте.

_root["block "+x+" "+y].gotoAndStop(с);

}}

Функция testNeighbor проверяет цвет нового блока. Если цвет подходит, блок удаляется. Дальше функция вызывает сама себя и проверяет цвета четырех соседних блоков. Она следит за переменной n, которая определяет количество подходящих соседей.
Если текущий блок не подходит по цвету, вместо n возвращается 0, чтобы показать, что в этом направлении не было найдено ни одного подходящего блока.

function testNeighbor(x,у,с) {

if (_root["block "+x+" "+y]._current frame = = с) {

// Удаляем соседа.

_root [ "block "+x+""+y].gotoAndStop(5);

var n = 1;

// Проверяем всех его соседей,

n += testNeighbor(x-1,y,с);
n += testNeighbor(х+1,у,с);

n += testNeighbor(х,у-1,с);

n += testNeighbor(x,y+l,с);

// Возвращаем количество найденных соседей,

return(n);

} else {

// Не найдено никаких подходящих блоков.

return(0);

}}

После того как блок выбран и все соседи одного с ним цвета удалены, следующий шаг - это позволить всем оставшимся блокам упасть вниз на все свободные места. Это достигается прохождением по всем столбцам в цикле по переменной х. Затем, во вложенном цикле по у происходит проверка всех блоков в этом столбце снизу вверх. И если блок пустой, первый заполненный блок сверху смешается вниз.

function collapseDown() {

// Проходим по всем столбцам.

for(var x=0;x

// Проходим по всем блокам столбца снизу вверх.

for(var y=11;y>0;y--) {

// Смотрим, пустой ли блок.
thisColor = _root["block "+x+'"+y]._currentFrame;


Содержание раздела