2012-08-25 2 views
1

나는 블랙 잭의 PHP 버전을 쓰고있다. 에이스를 다루는데 문제가 있습니다. 나는 이것이이 게임을 코딩 할 때 특별한 문제라는 것을 알고있다. 나는 다른 사람들이 물어 보았던 다른 질문들에 대해 살펴 보았지만, 내가 찾고있는 것을 찾을 수는 없다.PHP 블랙 잭 에이스 알고리즘

특정 카드에 대해 getValue 함수가 호출되면 해당 카드에 대해 다시 호출하지 않는다는 사실에 문제가 있다고 생각합니다. 예를 들어, 에이스와 7 (8 또는 18)을 치고 10을 얻으면 (18 또는 28로 바꾸는) getValue 함수를 다시 호출하는 방법이 있습니까? 내가 만든 게임으로 카드를 다시 검사하지 않기 때문에 그 시나리오에서 흉상이됩니다.

코드는 다음과 같습니다. 문맥에 어긋나지 않고 문제를 충분히 설명하기를 바랍니다.

function getValue($drawn, $total){ 
    $splitter = str_split($drawn); 
    $value = $splitter[0]; 
    if($value == 'j' or $value == 'q' or $value == 'k' or $value == 1){ 
     $value = 10; 
    }else if($value == 'a' and (($total + 11) > 21)){ 
     $value = 1; 
    }else if($value == 'a' and (($total + 11) <= 21)){ 
     $value = 11; 
    }else{ 
     $value = $value; 
    } 
    return $value; 
} 

function calculateScore($cardsArray){ 
    for($i = 0; $i < count($cardsArray); ++$i){ 
     $total += getValue($cardsArray[$i]); 
    } 
    return $total; 
} 
+0

에이스를 일관되게''a ''로 코딩하고 있습니까? 아니면 때로는'1'로 인코딩합니까? 네 번째 줄에는'or $ value == 1'이있어서 나를 후자로 의심하게 만듭니다. – wallyk

+0

우선, getValue를 1 개의 매개 변수로 호출하고, 범위에 $ total isnt가 정의되어 있는지, "... $ value == 'k'또는 $ value == 1 ..."이라고 말하면서 " $ 값 = $ 값; " –

+0

그 라인은 10h, 10d, 10s, 10c로 저장되는 10s를 다루는 것입니다. str_split은 배열에서 문자열의 첫 번째 값만 가져 오므로 그렇게하지 않으면 1로 계산됩니다. :) Oh 및 $ value = $ value는 1 - 9로 계산되기 때문에 1d, 2d, 3d 등으로 저장되기 때문에 str_split은 숫자를 값으로 사용합니다. – nerdarama

답변

0

일반적인 카드 세트를 기반으로 두 가지 총 가치 가능성이있을 때 "알아야"하는 것이 여기에서 OOP를 사용하는 좋은 이유입니다.

card을 처리 할 hand 클래스를 사용할 수 있으며, 카드가 ace 인 경우 두 값이 있음을 알고 있습니다. 에이스를 수신하면

당신은 당신의 손을 복제하고 끝날 때까지 두 손을 실행하거나 $hand->getTotal()가능한 모든 합계와 배열을 반환하도록하여 handcard 클래스를 쓸 수 수 중 하나.

OOP에서는 쉽게 할 수 있습니다.

0

방금 ​​최종 cardsArray의 최종 점수를 원하는 경우에, 에이스 값은 항상 마지막에 계산됩니다 있도록 rsort()으로 내림차순으로 배열을 정렬 할 수 있고, 따라서 당신이 나중에 재평가 할 필요가 없습니다 .

관련 문제