Головоломки Flash

Создание кода



Создание кода

Практически весь код находится в главной временной шкале. Он начинается с функции "startGame". После того как создана новая, перетасованная, колода, создается семь рядов карт (10). Первый ряд содержит» одну карту, второй - две и т.д.
Каждая карта помешается на свое место в соответствии с рядом и местом в ряду (11). К тому же масштаб каждой карты уменьшен на 50%, поскольку колода, использованная в игре "Двадцать одно", в два раза больше по размеру той, что необходима для этой игры (12).
Значение карты берется из массива deck (13). Оно соответствует метке кадра внутри клипа "deck". Это значение сохраняется в свойстве value клипа, после чего клип отправляется в соответствующий кадр. В свойствах клипа row и col хранится позиция клипа в пирамиде (14).
Затем вы создаете клипы для стопок карт мастью вниз и мастью вверх (15). Клип для карт мастью вниз отправляется в кадр "back", показывающий изображение рубашки карты. Другая стопка остается в первом кадре, который пуст.
Переменная firstcard установлена как undefined (16). Эта переменная содержит значение первой карты в паре, выбираемой самим игроком. Массив stack используется для слежения за судьбой карт из стопки мастью вверх. В случае, когда карта из этой стопки используется, должно быть отыскано значение предыдущей выбранной карты.
В заключение должен быть создан экземпляр клипа рамки (17). В начальный момент он помешается за пределами видимости.

startGame();

stop();

function startGame() {

// Тасуем колоду.

createDeck();

(10)// Выстраиваем карты в пирамиду,

level = 0;

for(row=0;row

for(i=0;i

// Создаем новый клип.

mc = _root.attachMovie("Deck","card"+level,level);



(11)// Задаем его расположение.

mc._x = i*60-row*30 + 275;

mc. _у = row*30 + 50;

(12)// Задаем масштаб.

mc._xscale = 50;

mc.__yscale = 50;

(13)// Устанавливаем знчение карты,

mc. value = deck.pop();

mc.gotoAndStop(mc.value);

(14)// Запоминаем позицию карты,

mc.row = row;




mc.col = i;

level++;
}}

(15)// Размещаем клипы открытой и закрытой колод,

for(i = 0 ; i

me = _root.attachMovie("Deck","stack"+i,level)

mc._x = i*60+100;

mc._y = 340;

mc._xscale =50;

mc._yscale = 50;

level++;}

// Показываем "рубашку" для закрытой колоды.

_root["stackO"].gotoAndStop("back");

(16) // Задаем значение первой выбранной карты и массив для

// открытой колоды.

firstCard = undefined;

stack = new Array();

(17) // Создаем и размещаем рамку.

outline = _root.attachMovie("outline","outline",1000);

outline._xscale = 50;

outline._yscale = 50;

outline._x = -1000;

}

Функция createDeck такая же, как в игре "Двадцать одно". Однако теперь вы сортируете только одну колоду. Результат представляется в виде глобальной переменной deck.

// Создаем перетасованную колоду.

function createDeck() {

// Создаем упорядоченную колоду.
suits = ["с","d","s","h"];

temp = new Array();

for(suit=0;suit

for(num=l;num

temp.pushfsuits[suit]+num);

}}

// Выбираем случайные карты, пока не создадим перетасованную

// колоду.

deck = new Array();

while (temp.length > 0) {

r = int(Math.random()*temp.length);

deck.push(tempt[r]);

temp.splice(r, 1) ;
}}

Вместо того, чтобы использовать сценарий клипа или кнопку для обнаружения щелчков мыши, я определю функцию для обработки события onMouseDown.
Сначала она совершает цикл по всем картам в пирамиде и определяет, не совершен ли щелчок по одной из них. (18). Цикл начинается с 28 и совершает обратный отсчет. Таким образом, карты наверху рассматриваются сначала, а карты внизу - потом.
Далее мы проверяем, если по карте был совершен щелчок, то программа определяет, закрывают ли данную карту другие карты пирамиды (19). Для этого вызывается функция cardPresent вместе со значениями ряда и колонки двух карт, которые могли бы закрывать карту, по которой был совершен щелчок.
Если локальная переменная card все еще не определена, значит, ни одна карта не была выбрана. Нужно еще проверить, не выбрал ли игрок карту из стопки карт с открытой мастью. Эту колоду представляет клип "stack1" (20).
Если карта была выбрана, а глобальная переменная firstcard все еще не определена, значит, не выбрана никакая другая карта. Ссылка на выбранную карту помещается в firstcard (21).
Если другая карта уже выбрана, значения старой и новой карт складываются. Функция cardValue используется для хранения численных значений карт (22). Если сумма равна 13, обе карты удаляются при помощи функции removeCard.
Если, с другой стороны, значение firstcard равно 13, значит, это король, и он может быть удален сам по себе (23).
Если по клипу "stack0" был совершен щелчок, это значит, что игрок решил перенести карту из закрытой колоды в открытую. В этом случае берется последнее значение в массиве deck и используется для изменения кадра клипа "stack1" (24). Массив stack используется для отслеживания карт, которые перемешаются между стопками. Чтобы выделить выбранную карту, клип "outline" перемешается в то же положение, что и выбранная карта (25).
И наконец, проверяется первая карта пирамиды (26). Если она отсутствует, значит, игрок ее удалил и выиграл игру.



_root.onMouseDown = function() {

var card = undefined;

(18) // Смотрим, был ли щелчок по одной из карт пирамиды.

for(var i=27;i>=0;i--) {

if (_root["card"+i].hitTest(_xmouse,_ymouse)) {

var card = _root["card"+i];

break;

}}

(19)// Если был, закрывают ли эту карту другие карты?

if (card != undefined) {

if (cardPresent(card.row+l,card.col) or cardPresent(card.row+1,card.col+l)) {

card = undefined;

}}

(20)// Был ли щелчок по стопке карт, лежащих мастью вверх?

if (card == undefined) {

if (stackl.hitTest(_xmouse,_ymouse)) {

card = stack1;

}}

// Проверяем, выбрана ли еще одна карта,

if (card != undefined) {

(21)// Первая выбранная карта,

if (firstCard == undefined) {

firstCard = card;

// Игнорируем второй щелчок по той же карте.

} else if (firstCard == card) {

(22)// Если выбраны две карты и их сумма равна 13.

} else if (cardValueffirstCard) + cardValue(card) == 13) {

// Удаляем обе карты.

removeCard(card);

removeCard(firstCard);

firstCard = undefined;

// В противном случае считаем, что это первая выбранная

// карта.

} else {

firstCard = card;

}}

(23)// Если выбрана одна карта, и это "король"

if (cardValueffirstCard) ==13) {

removeCardffirstcard);

firstCard = undefined;

}}

(24)// Если щелкнули по колоде закрытых карт, переворачиваем

// очередную карту.

if (stackO.hitTest(_xmouse,_ymouse)) {

stackl.value = deck.pop();

stackl.gotoAndStop(stackl.value);

stack.push(stackl.value);

// Когда закрытая колода кончается, удаляем ее.

if (deck.length == 0) {

stackO.removeMovieClip();

}}

(25)// Помещаем рамку около выделенной карты,

if (firstCard != undefined) {

outline._x = firstCard._x;

outline._y = firstCard._y;

} else {

outline._x = -1000;}

(26)// Если удалена первая карта в пирамиде, значит игрок

// выиграл.

if (_root["card0"] == undefined) {

gotoAndStop("game over");

}}

Осталось рассмотреть несколько полезных функций. Первая, removeCard, удаляет карту из колоды открытых карт или из пирамиды. Чтобы удалить карту из открытой колоды , она должна просто отправить клип "stack1" к кадру, который представляет предыдущую карту. Именно в этом месте оказывается полезным массив stack. Каждая карта, положенная мастью вверх, добавляется к stack. Чтобы достать карту опять, вам нужно удалить последнюю карту из массива stack и затем обратиться к последнему члену этого массива. Если карта оказалась из пирамиды, то клип просто удаляется.



function rernoveCard(thisCard) {

if (thisCard == stackl) {

// Удаляем карту из открытой колоды,

stack1.gotoAndStop(1);

stack.pop();

stackl.value = stack[stack.length-l];

stack1.gotoAndStop(stackl.value);

} else {

// Удаляем карту из пирамиды.

thisCard.removeMovieClip();
}}

Следующая функция, cardPresent, проверяет в цикле все карты, чтобы определить, существует ли карта в позиции, определенной аргументам вызова данной функции.

function cardPresent(row, col) {

// Проверяем, существует ли в пирамиде данная карта.

for(var i=0;i

thisCard = _root["card"+i] ;

if ((thisCard.row == row) and(thisCard.col == col)) {

return (true);

}}

return(false);

}

Функция cardvalue берет свойство value клипа карты, отбрасывает первый символ и возвращает численное значение. Например, если значение value карты равно с9, возвращается число 9.

function cardValue(card) {

// Удаляем первый символ из значения value.

n = card.value;

n = parselnt(n.substr(1,2));

return(n);
}

Последняя функция проходит в цикле по всем картам пирамиды и удаляет все оставшиеся карты. Также она удаляет "stack0" и "stackl". Это очищает рабочее поле для подготовки к следующему раунду.

function clearGame() {

// Удаляем карты из пирамиды.

for(var i=0;i

_root["card"+i].removeMovieClip();

}

// Удаляем обе колоды
stack0.removeMovieClip();

stack1.removeMovieClip();

}


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