Видеопокер
Для того чтобы преобразовать содержимое массива 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); }