基于PHP的二十一点脚本(ace)

时间:2012-11-22 09:49:32

标签: php

我有一个问题。我已经构建了这个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;
}

4 个答案:

答案 0 :(得分:1)

对卡片列表进行排序,以便最后评估aces。

答案 1 :(得分:0)

为什么global $faces;

要使代码正常工作,只需在函数顶部添加asort($hand);即可。 这将对数组进行排序,将A作为最后一个。

编辑:你是对的。我已将功能更改为始终将aces评估为最后一次。

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。