PHP 21点王牌算法


PHP Blackjack aces algorithm

我正在编写Blackjack的PHP版本。我在处理王牌时遇到了麻烦。我知道这是一个特殊的问题,当涉及到编码这个游戏。我环顾四周,看看其他人问的一些其他问题,但我找不到我想要的东西。

我认为问题在于,一旦为特定的卡调用了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;
}

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

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

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

OOP非常容易做到这一点。

如果你只想要最后一个cardsArray的最终分数,你可以用rsort()从高到低对数组进行排序,这样ace值总是倒数第一,因此你以后不需要重新评估它。