91824841

с того, что копирует массив


Следующая функция 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();

}


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