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

Видеопокер

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

function handValue() {
    // Копируем и сортируем карты игрока.
    hand = cards.slice();
    //(1)  hand.sort(compareHands); 
    // Создаем массив мастей и ранг с ов для более легкого доступа к ним  
    suits = new Array();
    nums = new Array();
    for (i = 0; i < 5; i++) {
        suits.push(hand[i].substr(0, 1));
        nums.push(Number(hand[i].substr(1, 2)));
    }
    //(2)  Проверяем, расположены ли он р и по возрастанию  
    straight = true;
    for (i = 0; i < 4; i++) {
        if (nums[i] + 1 != num[i + 1])
            straight = false;
    }
    //(3)  Ищем десятку, валета, даму, короля и туза  
    if ((nums[0] == 1) and (nums[1] == 10) and (nums[2]) == 11) and (nums[3] == 12) and (nums[4] == 13)) 
        straight = true;
    //(4) Выясняем, одной ли масти карты. 
    flush = true;
    for (i = 1; i < 5; i++) {
        if (suits[i] != suits[0])
            flush = false;
    }
    //(5) Создаем массив для подсчета, сколько карт одного 
    // достоинства находится в раскладе.
    counts = new Array();
    for (i = 0; i < 14; i++) {
        counts.push(0);
    }
    for (i = 0; i < 5; i++) {
        counts[nums[i]]++;
    }
    //(6)  Используя массив counts, ищем совпадения  
    pair = false;
    twoPair = false;
    threeOfAKind = false;
    fourOfAKind = false;
    for (i = 1; i < 14; i++) {
        // Найдена пара  
        if (counts[i] == 2) {
            // Найдена вторая пара.
            if (pair) {
                twoPair = true;
                // Найдена только одна пара.
            }
            else {
                pair = true;
            }
            // Три карты одного достоинства  
        }
        else if (counts[i] == 3) {
            threeOfAKind = true;
            // Четыре карты одн х ого достоинства. 
        }
        else if (counts[i] == 4) {
            fourOfAKind = true;
        }
    }
    //(7)  Проверяем, есть л ц и среди совпадающих карт валеты или 
    // карты более высоко щ го ранга  
    jackOrHigher = false;
    for (i = 1; i < 14; i++) {
        if ((i == 1) or (i > 10) and (counts[i] >= 2)) {
            jackOtHigher = true;
        }
    }
    //(8)  Выясняем, является ли карта более высо к кого ранга тузом  
    hasAce = false;
    if (counts[1] > 0)
        hasAce = true;
    //(9)  Делаем вывод, какой расклад на руках у игрока. 
    if (straight and flush and hasAce) {
        return("Royal Flush");
    }
    else if (straight and flush) {
        return("Straight Flush");
    }
    else if (fourOfAKind) {
        return("Four-Of-A-Kind");
    }
    else if (pair and threeOfAKind) {
        return("Full House");
    }
    else if (flush) {
        return("Flush");
    }
    else if (straight) {
        return("Straight");
    }
    else if (threeOfAKind) {
        return("Three-Of-A-Kind");
    }
    else if (twoPair) {
        return("Two Pair");
    }
    else if (pair and jaskOrHigher) {
        return("High Pair");
    }
    else if (pair) {
        return("Low Pair");
    }
    else {
        return("Nothing");
    }
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.