我正在编写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
类,对它处理card
s,如果你的卡是ace
,你知道它有两个值。
收到王牌后,您可以复制您的手牌并运行双手直到结束,也可以编写hand
和card
类,使$hand->getTotal()
返回一个包含所有可能总数的数组。
OOP非常容易做到这一点。
如果你只想要最后一个cardsArray
的最终分数,你可以用rsort()
从高到低对数组进行排序,这样ace值总是倒数第一,因此你以后不需要重新评估它。