с того, что копирует массив
Следующая функция handvalue начинается с того, что копирует массив cards и помешает его в массив hand. Затем она сортирует полученный массив с использованием функции compareHands (1).
Например, если на руках у игрока имеются карты ["h4", "d5", "c2", "s3", "h6"], после сортировки массив будет выглядеть следующим образом: ["с2", "s3", "h4", "d5", "h6"]. Так гораздо проще узнать, находится ли на руках у игрока "стрит".
"Стрит" определяется путем просмотра каждой карты и выяснением, больше ли ранг этой карты на единицу ранга карты предыдущей (2). Если такое условие выполняется для всего массива, то тогда на руках у игрока "стрит".
Таким образом будет определен не только "стрит": когда "стрит" начинается с десятки и заканчивается тузом, то это "флэш стрит". Произошло ли так или нет, можно определить с помощью простого теста (3).
Затем вы проверяете, одной ли масти карты (4). Для этого все карты, кроме первой, сравниваются с первой. Если масть всех карт совпадает с мастью первой карты, значит, все карты одной масти.
На следующем шаге создается массив counts, в котором будет храниться число карт одинакового достоинства (5). В этом массиве находится 14 элементов, каждый из которых будет отвечать за число карт определенного ранга, имеющихся у ифока. Первый элемент массива не используется, так как нет карт с нулевым рангом.
Некоторые люди думают, что стритом можно считать и такой набор карт, в котором задействован туз. Например, дама, король, туз, двойка и тройка. Это не стрит, а всего лишь его дополнительная вариация, используемая в любительских играх в покер. Туз может быть использован и как первая карта стрита (туз, двойка, тройка, четверка, пятерка), и как последняя (десять, валет, дама, король, туз), но только не в середине.
Например, если на руках туз, две тройки, четверка и валет, массив будет выглялеть следующим образом: [0,1,0,2,1,0,0,0,0,0,0,1,0,0].
Теперь, наконец, программа может начать определение расклада на руках у игрока. Просматривается массив counts и отмечаются все значения пары, тройки или четверки (6). Если один раз встречаются две карты одного достоинства, то у игрока пара. Если один раз встречается три карты одного достоинства, то у игрока тройка; если один раз встречается четыре карты одного достоинства, то - каре. Также можно дважды обнаружить две карты одного достоинства или пару и тройку. В первом случае будет две пары, а втором - фул хаус.
Затем проверяется, есть ли на руках пары с валетом или картами высшего достоинства (7). Обычно видеопокер отмечает только такие пары.
Следующий тест проверяет, есть ли в раскладе туз (8). Это будет нужно для определения флэш стрита. Если у ифока флэш стрит, и одна из карт - туз, то у него самый высший тип флэш стрита - флэш роял.
Теперь у функции есть весь набор значений логических переменных: straight, flush, hasAce, fourOfAKind, threeOfAKind, twoPair, pair, fullHouse и jackOrHigher. С их помощью определяется действительная ценность расклада, и возвращается символьная строка (9).
// Раздающий берет еще одну карту до тех пор,
// пока сумма очков меньше 17.
function dealerMove() {
if (handValue(dealerHand) < 17) {
dealCard(dealerHand);
shoCards();
gotoAndPlay("Dealer");
// Раздающий закончил набирать карты.
} else {
decidewinner();
}}
Функция handValue используется во многих ранее рассмотренных функциях для того, чтобы определить сумму очков на руках. Ранг каждой карты добавляется к сумме очков, при этом туз равен одному очку. Если на руках находится туз и добавление 10 очков не приведет к перебору, тогда к обшей сумме прибавляется 10 очков.
// Подсчитываем очки,
function handValue(hand) {
total = 0;
асе = false;
for (i=0; i
// Добавляем ранг карты.
val = Number(hand[i].substr(1,2));
11 За валета, даму и короля начисляем 10 очков,
if (val > 10) val = 10;
total += val;
// Запоминаем, если был найден туз.
if (val == 1) асе = true;
}
// Туз может стоить 11 очков, если у игрока не будет перебора.
if ((асе) and (total
return(total);
}
С помощью набора правил, следующая функция определяет победителя. В случае выигрыша игрока не только корректируется сумма наличных, но и определяется значение переменной result, которая затем отображается на рабочем поле в кадре с меткой "Done".
// Определяем победителя или случай игры в ничью,
function decideWinner() {
showCash();
if (playerValue > 21) {
result = "You Busted!";
} else if (dealerValue > 21) {
cash += bet*2;
result = "Dealer Busts. You Win!";
} else if (dealerValue > playerValue) {
result = "You Lose!";
} else if (dealerValue == playerValue) {
cash += bet;
result = "Tie!";
} else if (dealerValue < playerValue) {
cash += bet*2;
result = "You Win!";
}
showCash(); gotoAndPlay("Done");
}
В кадре Done находится кнопка Next Hand (Сыграть еще раз), которая вызывает следующую функцию, проверяющую, осталось ли в колоде 26 карт. Если в колоде карт меньше, заново создается перетасованная колода. Если осталось достаточное количество карт, вызывается функция initHand, и игра возвращается к кадру "Bet". В любом случае вызывается функция resetCards, которая устанавливает все находящиеся на рабочем поле клипы "deck" в первый кадр, благодаря чему карты не остаются на экране.
// Начинаем следующую раздачи карт.
function newDeaK) { resetCards();
// Если в колоде менее 26 карт,
// Создаем новую перетасованную колоду,
if (deck.length < 26) {
gotoAndPlay("shuffle");
} else {
initHand();
gotoAndPlay("Bet");
}}
// Удаляем карты со стола.
function resetCards() {
for (i=0; i
_root["dealer"+i.gotoAndStop(1);
} for (i=0; i
_root t"player"+i].gotoAndStop(1);
}}
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();
}
Содержание раздела