Im делает простой покерный скрипт в PHP и до того момента, когда я анализирую руку игроков из 5 карт.
У меня есть рука, хранящаяся в массиве ($ hand), например:
Array ( [0] => Array ( [face] => k [suit] => d ) [1] => Array ( [face] => 6 [suit] => s ) [2] => Array ( [face] => 6 [suit] => h ) [3] => Array ( [face] => 4 [suit] => d ) [4] => Array ( [face] => 7 [suit] => h ) )
Я не уверен, как начать с поиска результатов. Например, как бы я узнал, имеет ли игрок ЧЕТВЕРТЫЙ ВИД, или 4 карты с одним и тем же лицом?
Или если игрок получает RUN последовательных лиц (3,4,5,6,7)?
(Я не очень хорошо разбираюсь в массивах)
Четыре в своем роде достаточно просты. Вы зацикливаете свой массив карточек и добавляете, сколько у вас каждого лица:
$have = array(); foreach($hand as $card) { $have[$card['face']]++; }
Это даст вам
$have = array( 'k' => 1, '6' => 2, '4' => 1, '7' => 1 );
Затем вы выполняете поиск в этом новом массиве, чтобы узнать, есть ли какое-либо из значений 4. Если у вас есть 4, у вас есть 4 в своем роде. В этом случае у вас есть одна единственная в своем роде и куча синглов.
Для последовательных прогонов вам нужно отсортировать исходный массив по костюму, затем по лицу, чтобы вы собрали все бриллианты вместе, все сердца вместе и т. Д. … и в каждом костюме невидимые карты находятся в порядке возрастания , Затем простую «машину состояний», чтобы проверить, есть ли у вас пробег 5. Предполагая, что ваш ручной массив уже отсортирован и что карты «лица» представлены численными значениями («j» -> 10, q '=> 11,' k '=> 12,' a '=> 13):
$last_suit = null; $last_face = null; $consecutive = 0; foreach($hand as $card) { if ($last_suit != $card['suit']) { // got a new suit, reset the counters $consecutive = 0; $last_face = $card['face']; // remember the current card $last_suit = $card['suit']; // remember the new suit continue; // move on to next card } if (($card['face'] - $last_face) == 1)) { // the new card is 1 higher than the previous face, so it's consecutive $consecutive++; $last_face = $card['face']; // remember the new card continue; // move on to next card } if ($consecutive == 5) { break; // got a 5 card flush } }