1

我正在编写二十一点的 PHP 版本。我在处理 ace 时遇到了麻烦。我知道在编写这个游戏时这是一个特殊的问题。我环顾了其他人提出的其他一些问题,但我找不到我正在寻找的东西。

我认为问题在于,一旦为特定卡调用 getValue 函数,它就不会再为该卡调用它。有没有办法让它再次调用 getValue 函数,例如,如果你用 ace 和 7(即 8 或 18)击中并且你得到 10(将​​其变为 18 或 28)。在我构建的游戏中,它在那种情况下会失败,因为它不会再次检查卡片以获得总数。

代码如下。我希望它在上下文中有意义,并且我已经很好地解释了这个问题。

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

2 回答 2

0

如果您只想要 final 的最终分数cardsArray,您可以将数组从高到低排序,rsort()这样 ace 值总是最后计算,因此您以后不需要重新评估它。

于 2012-08-25T00:55:55.177 回答
0

需要“知道”当你有两个基于一组常见卡片的总价值可能性时,这是在这里使用 OOP 的一个很好的理由。

你可以有一个hand类,你处理cards,如果你的卡是ace你知道它有两个值。

收到 ace 后,您可以复制您的手并运行双手直到结束,或者您可以编写您的handcard类,以便返回一个包含所有可能总数$hand->getTotal()的数组。

这对于 OOP 来说非常简单。

于 2012-08-25T07:53:37.907 回答