0

我有个问题。我已经构建了这个 PHP 脚本,它工作得很好,除了 ace 不能正常工作。如果我抽到 5 A 5 5,它认为我有 26 等等。

有谁知道如何解决这个问题?评估手的功能:

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

对卡片列表进行排序,以便最后评估 A。

于 2012-11-22T09:55:00.683 回答
0

为什么global $faces;

要使您的代码正常工作,只需asort($hand);在函数顶部添加。这将对数组进行排序,将 A 放在最后。

编辑:你是对的。我已将函数更改为始终将 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

正如您在其中一个评论中所说,单独的排序是行不通的,因为排序是这样的:0-9,然后是 A 到 Z,所以 Aces 仍然在其他数字之前被检查。

我修改了一些你的函数,所以它以这种方式工作得更好:

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 计数器($aces = 0),当有一个 Ace 时,我们跳过总和,并增加计数器,在 foreach 循环之后,我们根据手牌的总值对所需的值求和,另一个循环基于我们在数组中的 ace。

于 2012-11-22T09:56:55.893 回答
0

正如昆汀所说,最后处理 A。还要数一数手中有多少 A(以避免给一个 A 11 并在你有三个 A 时溢出,而不是计算 1+1+1)。将所有 ace 一起处理,将剩下的点数除以 ace 的数量。如果结果优于 11,则将 11 分配给一个,将 1 分配给其他。如果不是,则给所有 A。

于 2012-11-22T10:02:28.940 回答