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

Видеопокер

Для того чтобы преобразовать содержимое массива cards в то, что игрок видит на экране, функция showCards на рабочем поле устанавливает кадры для каждого из пяти экземпляров клипа. Кадры должны соответствовать символьной строке, расположенной в массиве hand.

// Определяем вид клипов карт, сданных игроку.
function showCards() {
    for (i = 0; i < 5; i++) {
        _root["card" + i].gotoAndStop(cards[i]);
    }
}

После того как все карты будут показаны игроку, он должен решить, что делать дальше. Кнопка "Hold/Draw" под каждой картой вызывает функцию holdDraw и передает ей число от 0 до 4.

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

В массиве hold будет находиться значение true, если игрок хочет оставить соответствующую карту, и false, если хочет ее заменить.

// Переворачиваем карту, предназначенную для замены,
function holdDraw(cardNum) {
    // Переворачиваем карту, которая находится среди тех,
    // которые игрок хочет оставить,
    if (hold[cardNum]) {
        _root["card" + cardNum].gotoAndStop("back");
        hold[cardNum] = false;
        // Если карта перевернута еще раз, оставляем ее.
    }
    else {
        _root["card" + cardNum].gotoAndStop(cards[cardNum]);
        hold[cardNum] = true;
    }
}

Когда игрок щелкает по кнопке "Draw", функция secondDraw заменяет те карты, для которых в массиве hold значения были равны false. Затем вызывается функция showCards, чтобы изменения были отражены на экране.

Затем программа с помощью функции handvalue определяет, какой расклад имеется у игрока. Ценность расклада передается функции winning, которая рассчитывает, какую сумму следует добавить к величине cash (сумме наличных). Переменная resultsDisplay используется для отображения этих значений на экране.

// Заменяем карты и определяем выигрыш,
function secondDraw() {
    // Заменяем карты, 
    for (i = 0; i < 5; i++) {
        if (!hold[i] > {
            cards[i] = deck.pop();
            showCards();
            // Определяем, что на руках у игрока.
            handVal = handValue(cards);
            // Расчитываем сумму выигрыша.
            winAmt = winning(handVal);
            resultsDisplay = handVal + ": " + winAmt;
            // Добавляем сумму выигрыша к имеющейся сумме наличных,
            cash += winAmt;
            showCash();
            gotoAndPlay("done");
        }
    }
}

Прежде чем перейти к рассмотрению функции handvalue, необходимо создать функцию compareHands. Функция handvalue сортирует карты на руках у игрока по возрастанию. Программа Flash ничего не знает о колоде игральных карт, так что вам придется "научить" ее распознавать сочетания покера.

Функция compareHands берет две карты и сравнивает их. Для каждой карты из символьной строки она выбирает первый и второй символы, то есть игнорирует нулевой символ. Таким образом, карта "с7" становится "7", а "с13" – "13".

Затем функция возвращает один из трех вариантов ответов: – 1 – первая карта меньше по достоинству второй карты, 0 – карты одинакового достоинства, и 1 – ранг первой карты на единицу больше ранга второй.

Эта функция необходима для команды sort, использующейся в функции handvalue. Если для сортировки не будет специальной функции, программа попытается отсортировать массив hand по алфавиту, то есть все трефы будут расположены перед бубнами, так как трефовая масть начинается с буквы "с", а бубновая – с "d". А вам нужно, чтобы карты были отсортированы в соответствии с их рангом.

// Эта функция используется командой сортировки для определения,
// какие карты идут первыми,
function compareHands(a, b) {
    // Получаем ранг карты.
    numa = Number(a.substr(1, 2));
    numb = Number(b.substr(1, 2));
    // Возвращаем - 1, 0 или 1 в зависимости
    //от результата сравнения,
    if (numa < numb)
        return(-1);
    if (numa == numb)
        return(0);
    if (numa > numb)
        return(1);
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.