0

質問があります。私はこのPHPスクリプトを作成しましたが、エースが正しく機能しないという事実を除いて、問題なく機能します。5 A 5 5を引くと、26などあると思います。

誰かがこの問題を解決する方法を知っていますか?評価する関数Hand:

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;
}
4

4 に答える 4

1

エースが最後に評価されるように、カードのリストを並べ替えます。

于 2012-11-22T09:55:00.683 に答える
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;
}
于 2012-11-22T09:56:01.603 に答える
0

コメントの 1 つで述べたように、並べ替えは次のようになるため、並べ替えだけでは機能しません: 0-9、次に A から Z であるため、エースは他の数字の前にまだチェックされています。

私はあなたの関数を少し修正したので、そのようにうまく機能します:

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;
    }

私が行ったことは、エース カウンター ($aces = 0) を作成することです。エースがある場合は、合計をスキップしてカウンターを増やします。foreach ループの後、ハンドの合計値に基づいて目的の値を合計します。配列にあるエースに基づいて別のループを使用します。

于 2012-11-22T09:56:55.893 に答える