連想配列の値を使用して、ユーザーがポーカー ハンドでストレートを持っているかどうかを計算しようとしています。
各プレイヤーの手札は同じ配列内にあり、その構造は次のようになります。
<?php
// Note: the first 5 values of each player's hand are identical because those are
// the dealer's cards (the cards on the "board" that everyone can see).
// The last two values represent the player's "hole cards" that only they can see.
// Also note: 11 = Jack, 12 = Queen, 13 = King, 14 = Ace.
$hands = array(
// Player 0
0 => array(
0 => array("value_num" => 6),
1 => array("value_num" => 7),
2 => array("value_num" => 8),
3 => array("value_num" => 9),
4 => array("value_num" => 14),
5 => array("value_num" => 10),
6 => array("value_num" => 8),
),
// Player 1
1 => array(
0 => array("value_num" => 6),
1 => array("value_num" => 7),
2 => array("value_num" => 8),
3 => array("value_num" => 9),
4 => array("value_num" => 14),
5 => array("value_num" => 10),
6 => array("value_num" => 13),
),
// Player 2
2 => array(
0 => array("value_num" => 6),
1 => array("value_num" => 7),
2 => array("value_num" => 8),
3 => array("value_num" => 9),
4 => array("value_num" => 14),
5 => array("value_num" => 5),
6 => array("value_num" => 12),
),
// Player 3
3 => array(
0 => array("value_num" => 6),
1 => array("value_num" => 7),
2 => array("value_num" => 8),
3 => array("value_num" => 9),
4 => array("value_num" => 14),
5 => array("value_num" => 5),
6 => array("value_num" => 13),
),
);
プレイヤーがストレートを持っているかどうかを判断するために私が書いた関数は、次のようになります。
<?php
/**
* @return
* The highest card value of the player's straight, if they have a straight.
* Otherwise, 0.
*/
function has_straight($cards, $player_id, $required_consecutive_cards = 5) {
// Extract the "value_num" values to calculate the straight.
for ($i = 0; $i < count($cards[$player_id]); $i++) {
$values[$player_id][$i] = $cards[$player_id][$i]['value_num'];
}
// Check to see if the player has an Ace within their hand.
$has_ace[$player_id] = array_search(14, $values[$player_id]);
// If the player has an Ace, push a 1 into their $value array in case they also
// have 2, 3, 4, and 5 in their hand.
if ($has_ace[$player_id] !== FALSE) {
array_push($values[$player_id], 1);
}
// Only check the player's unique values. Right now we're not concerned with
// pairs or anything else.
$player_cards[$player_id] = array_unique($values[$player_id]);
// Reverse sort the player's unique values to make counting sequences easier.
rsort($player_cards[$player_id]);
// Set a number to increment if one card is sequential to the other.
$increment_value[$player_id] = 1;
foreach ($player_cards[$player_id] as $key => $value) {
$next_key = $key + 1;
$next_value = $value - 1;
if (!array_key_exists($next_key, $player_cards[$player_id])) {
return 0;
}
if ($player_cards[$player_id][$next_key] == $next_value) {
$increment_value[$player_id]++;
}
else {
$increment_value[$player_id] = 1;
unset($player_cards[$player_id][$key]);
}
if ($increment_value[$player_id] == $required_consecutive_cards) {
// Reverse sort what's left of the values so that the first one can be
// the value returned.
rsort($player_cards[$player_id]);
return $player_cards[$player_id][0];
}
}
return 0;
}
したがって、プレイヤー 0 がストレートを持っているかどうかを判断するには、次のように実行します。
<?php
$player_to_check = 0;
print has_straight($hands, $player_to_check);
...結果10
として出力されるはずです(プレーヤー0のストレート内の10
最大値です-、、、、、)。6
7
8
9
10
私が抱えている問題は、たとえば、プレーヤー 1 のストレート (プレーヤー 0 のストレートと同じである必要があります) をチェックすると、出力14
が10
.
これが発生する理由は、プレイヤー 1 も を13
ハンドに持っていて、13
が と連続しているため、代わりに が返さ14
れるためです (プレイヤー 1 のストレート内にない場合でも)。14
10
14
プレイヤー 3 とプレイヤー 4 を比較すると、同じ問題が見られます。
(最初に見つかった一連の連番の最高値ではなく) 5 つの連番のセット内の最高値が返されるようにするには、関数内で何をする必要がありますか?