PHP Blackjack aces算法

时间:2012-08-25 00:30:19

标签: php

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

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

2 个答案:

答案 0 :(得分:0)

如果您只想获得最终cardsArray的最终得分,则可以使用rsort()将数组从高到低排序,以便始终计算ace值,因此您不需要稍后重新评估。

答案 1 :(得分:0)

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

您可以拥有一个hand课程,您可以与card人交流,如果您的卡片是ace,则您知道它有两个值。

收到王牌后,你可以复制你的手并双手直到结束,或者你可以写handcard类,使$hand->getTotal()返回一个数组< em>所有可能的总数。

使用OOP这很容易。