0

連想配列の値を使用して、ユーザーがポーカー ハンドでストレートを持っているかどうかを計算しようとしています。

各プレイヤーの手札は同じ配列内にあり、その構造は次のようになります。

<?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最大値です-、、、、、)。678910

私が抱えている問題は、たとえば、プレーヤー 1 のストレート (プレーヤー 0 のストレートと同じである必要があります) をチェックすると、出力1410.

これが発生する理由は、プレイヤー 1 も を13ハンドに持っていて、13が と連続しているため、代わりに が返さ14れるためです (プレイヤー 1 のストレート内にない場合でも)。141014

プレイヤー 3 とプレイヤー 4 を比較すると、同じ問題が見られます。

(最初に見つかった一連の連番の最高値ではなく) 5 つの連番のセット内の最高値が返されるようにするには、関数内で何をする必要がありますか?

4

4 に答える 4

0

php の max 関数を見てください。

http://php.net/manual/en/function.max.php

于 2014-07-25T08:47:28.213 に答える
0

これはどうですか?質問を理解しているかどうかわからず、テストしていませんが、役立つかもしれません。

$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) {
      if($increment_value[$player_id] == 1) {
          $top_card_key = $player_cards[$player_id][key]
          $top_card[$top_card_key] = 1;
      }
      $increment_value[$player_id]++;
      if(isset($top_card[$top_card_key])) {
          $top_card[$top_card_key]++;
      }
    }
    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]);

      // Foreach on top_card, check which one == 5  and display it 
      // return the top_card;
    }
于 2014-07-25T09:20:29.620 に答える