Видеопокер
Следующая функция 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"
);
}
}