// какие карты идут первыми.
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);
}
Следующая функция handValueначинается с того, что копирует массив cardsи помещает его в массив hand.Затем она сортирует полученный массив с использованием функции compareHands (1).
Например, если на руках у игрока имеются карты ["h4", "d5", "c2", "s3", "h6"], после сортировки массив будет выглядеть следующим образом: ["c2", "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;l 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;
Читать дальше
Конец ознакомительного отрывка
Купить книгу