我有一个问题。我已经构建了这个PHP脚本,它运行得很好,除了aces不能正常工作的事实。如果我画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;
}
答案 0 :(得分:1)
对卡片列表进行排序,以便最后评估aces。
答案 1 :(得分:0)
为什么global $faces;
?
要使代码正常工作,只需在函数顶部添加asort($hand);
即可。
这将对数组进行排序,将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;
}
答案 2 :(得分:0)
正如你在其中一篇评论中所说的那样,单独的asort不会起作用,因为排序是这样的: 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;
}
我所做的是创建一个A计数器($ aces = 0),当有一个Ace我们跳过总和,然后增加计数器,在foreach循环之后我们总结所需的值基于手的总值,另一个循环基于我们在数组中的aces。
答案 3 :(得分:0)
正如昆汀所说,最后对待王牌。还要计算手中有多少个A(为了避免给出11到一个ace和溢出,如果你有,比方说,三个A,而不是计算1 + 1 + 1)。 一共处理所有的A,将剩下的点数除以A的数量。如果结果优于11,则将11比1和1交给其他人。如果没有,给所有的A加1。