2012-11-22 2 views
0

질문이 있습니다. 나는이 PHP 스크립트를 만들었지 만, 에이스가 제대로 작동하지 않는다는 것을 제외하면 잘 작동한다. 내가 5 A 5 5를 뽑으면 26 등이 있다고 생각합니다.PHP 기반 블랙 잭 스크립트 (에이스)

누구든지이 문제를 해결하는 방법을 알고 있습니까? evaluateHand에 기능 :

function evaluateHand($hand) { 

global $faces; 
$value = 0; 
foreach ($hand as $card) { 

    $values = explode("|",$card); 
    $value1= $values[0]; 

    if($value1=="Q" OR $value1=="J" OR $value1=="K"){ 
     $value = intval($value) + 10; 
    } 

    if ($value > 10 && $value1 == "A") { 
     $value = intval($value) + 1; // An ace can be 11 or 1 
    } 
    elseif($value < 12 && $value1 == "A"){ 
        $value = intval($value) + 11; // An ace can be 11 or 1 
     } 

    else { 
     $value = intval($value) + intval($value1); 
    } 
} 
return $value; 
} 
+3

'global $ faces;'? 코드 냄새? –

+0

무엇을 의미합니까? Faces는 $ suits = array ("spades", "clubs", "hearts", "diamonds"); \t $ faces = array (1 => "A", "2", "3", "4", "5", "6", "7", "8", "9" "J", "Q", "K"); –

+0

또한'$ values ​​= explode ('|', '$ card);는 무엇입니까? 나는 카드가 "A | 스페이드"또는 "10 | 클럽"과 같은 것이라고 추측하고 있습니까? 먼저 좋은 모델을 기반으로 카드를 얻으십시오. 그런 다음 카드를 추가하기위한 논리가 그렇게 어렵지 않아야합니다. 루비에서 카드 덱을 설정하는 방법은이 질문에 대한 [내 대답] (http://stackoverflow.com/a/2641421/184600)을 참조하십시오. –

답변

1

정렬 에이스가 마지막에 평가되도록 카드의 목록입니다.

+0

당신은 내 전체 스크립트를 찾을 수 있습니다 : http://pastebin.com/XNmVTp8h 그것은 실제로 좋은 모델 (제 의견으로는)에 근거합니다. 에이스는 아직 제대로 작동하지 않습니다. –

+0

작동하지만 모든 경우에있는 것은 아닙니다. 2, A, Q는 23을 얻습니다. 13을 주어야합니다. –

+0

@BabakZahedi - "A"는 마지막으로 평가되지 않습니다. 목록을 사전 순으로 정렬하지 마십시오. 정렬하여 에이스가 마지막으로 평가됩니다. – Quentin

0

global $faces;입니까?

코드를 작동 시키려면 함수 상단에 asort($hand);을 추가하십시오. 배열을 정렬하여 A를 마지막으로 배치합니다.

편집 : 당신 말이 맞습니다. 에이스를 항상 마지막으로 평가하는 함수를 변경했습니다.

function evaluateHand($hand) { 
    global $faces; 
    $value = 0; 
    $aces = 0; 
    foreach ($hand as $card) { 
     $values = explode("|",$card); 
     $value1= $values[0]; 

     if($value1 == "A") { 
      $aces++; 
     } 
     else { 
      if($value1=="Q" OR $value1=="J" OR $value1=="K"){ 
       $value = intval($value) + 10; 
      } 
      else { 
       $value = intval($value) + intval($value1); 
      } 
     } 
    } 

    while($aces > 0) { 
     if($value > 10) { 
      $value = intval($value) + 1; 
     } 
     elseif($value < 12){ 
       $value = intval($value) + 11; // An ace can be 11 or 1 
     } 
     $aces--; 
    } 

    return $value; 
} 
+0

함수 상단에 Putting asort ($ hand)가 작동했습니다. 예! 모두에게 감사드립니다. –

+1

비록 내가 Q, 8, A를 얻었지만 그것은 29에서 파열되었다 ... : S –

+0

이것은 완벽하게 도움을 주셔서 감사합니다! 감사합니다 여러분! –

0

당신이 의견 중 하나에 말했듯이 정렬은 다음과 같이 간다, 혼자 따라 asort은 작동하지 않습니다 : Z에 다음 0-9, 그래서 에이스는 여전히 전에 확인되고있다 다른 수치.

나는 함수가 그런 식으로 더 잘 작동하도록 조금 수정 : 내가 무슨 짓을

function evaluateHand($hand) { 
     asort($hand); 
     print_r($hand); 

     $aces = 0; 

     global $faces; 

     $value = 0; 
     foreach ($hand as $card) { 

      $values = explode("|",$card); 
      $value1= $values[0]; 

      if($value1=="Q" OR $value1=="J" OR $value1=="K"){ 
       $value = intval($value) + 10; 
      } elseif($value1 == "A") { 
       $aces++; 
      } else { 
       $value = intval($value) + intval($value1); 
      } 

     } 

     if($aces > 0){ 
      for($a = 0; $a < $aces; $a++){ 
       if ($value > 10) { 
        $value = intval($value) + 1; // An ace can be 11 or 1 
       }elseif($value < 12){ 
        $value = intval($value) + 11; // An ace can be 11 or 1 
       } 
      } 
     } 

     return $value; 
    } 

는 에이스 카운터를 만드는 것입니다 ($ 에이스 = 0), 그리고 에이스가있을 때 우리는 합계를 건너 카운터를 증가 시키면 foreach 루프 다음에 배열의 에이스에 기반한 다른 루프와 함께 손의 전체 값에 따라 원하는 값을 합계합니다.

0

Quentin이 말했듯이, 에이스가 마지막으로 치료합니다. 또한 손에 몇 개의 에이스가 있는지 계산하십시오 (1 + 1 + 1을 계산하는 대신 3 개의 에이스라고 가정 해 보겠습니다. 모든 에이스를 함께 처리하여 에이스 수로 남은 점의 수를 나눕니다. 결과가 11 점보다 우수하다면, 11 점을 1 점으로, 1 점을 다른 점에 제공하십시오. 그렇지 않다면 모든 에이스에게 1을줍니다.

+1

손에있는 모든 에이스를 어떻게 계산합니까? –

+0

에이스가있을 때마다 핸드 어레이를 반복하고 카운터에 1을 더합니다. 루프가 끝나면 카운터는 손에 가지고있는 에이스의 수를 알려줍니다. – barakadam

+0

정렬에 문제가있는 경우에는 에이스 배열을 만들고 루프 중에 발생한 각 에이스를 추가하십시오. 그런 식으로 에이스를 끝까지 반복 할 수 있으며, count ($ aes)를 사용하여 얼마나 많은 에이스가 있는지 파악할 수 있습니다. –

관련 문제