扑克式评分系统的算法

时间:2013-04-27 18:01:26

标签: php

我需要创建五个随机整数(比如rand(1,5))。然后,我根据这些数字生成一个分数。例如,如果我得到1,2,3,4,5的结果,那么这将等于零分,但如果我得到1,1,3,4,5,那么我将有一对1,2,3,4,5 = score 0 1,1,2,3,4 = score 1 (1 pair) 1,1,2,2,4 = score 2 (2 pair) 1,1,1,3,4 = score 3 (3 of a kind) 1,1,1,1,5 = score 4 (4 of a kind) 1,1,1,3,3 = score 5 (full house) 1,1,1,1,1 = score 6 (5 of a kind) 。与扑克类似的得分类似,因此五个相同的数字将是“满堂红”,从而获得最高分。

我如何评价评分系统,即使它只是数学方程?

更多细节:

1-5将保留单独的图像,然后将与“众议院”进行战斗,“众议院”将为用户提供相同的代码以确定获胜者。以下是一些示例抽奖和他们将获得的分数:

    if (isset($_POST['play'])) {
    $rand1 = rand(1, 5);
    $rand2 = rand(1, 5);
    $rand3 = rand(1, 5);
    $rand4 = rand(1, 5);
    $rand5 = rand(1, 5);
    if ($_POST['bet'] <= $user_data['coins']) {
        if ($_POST['bet'] < 999999999) {
            if ($_POST['bet'] > 0.99) {
                if ($user_data['coins'] >= 1) {
                    $array = array($rand1,$rand2,$rand3,$rand4,$rand5);
                    print_r(array_count_values($array));
                    echo $rand1.', '.$rand2.', '.$rand3.', '.$rand4.', '.$rand5;

                    Array( // Here I don't understand
                    1 => 3,//
                    2 => 1,//
                    3 => 1 //
                    );
                }
            }
        }
    }   
}

如果他们得分为6并且房子得分为6,则数字组合是不敬的。这是一个平局。

{{1}}

这输出;数组([5] =&gt; 2 [4] =&gt; 2 [1] =&gt; 1)5,5,4,4,1

3 个答案:

答案 0 :(得分:5)

使用array_count_value函数。

$array = array(1,1,1,2,5);

print_r(array_count_values($array));

Array(
1 => 3,
2 => 1,
3 => 1
);

答案 1 :(得分:1)

如果范围很小,您可以使用计数排序方法。对于每个数字,提供一个“桶”来计算数字出现的次数。扫描一次以填充存储桶。然后另一次扫描,但这次反对斗得到最高值。这是你的分数。

答案 2 :(得分:1)

这是我考虑的方法,基于@Lele的回答。警告:这有点令人困惑,所以请坐下来喝一杯茶。

  • 构建一组五个桶,[1]到[5],并扫描一个玩家的号码,以便每个号码的计数存储在相应的桶中
  • 然后将您剩下的数字计入新的水桶系统,每个位置代表您拥有的食物数量。

所以,如果你的分数如此:

1 1 2 2 4

然后你的第一个桶是:

2 2 0 1 0

那是因为你有两个,两个两个,一个四个。你的第二桶是:

1 2 0 0 0

那是因为你有两个两个计数,一个一个计数。在这里,你忽略了第一个位置(因为一个东西的一个计数没有得分)和其他人的得分。所以,测试两个二,并得分那两个。

如果你得分是这样的:

5 5 5 5 1

然后你的第一个桶是:

1 0 0 0 4

这是一,四,五。所以你的第二个桶是:

1 0 0 1 0

您的查找表可能是:

x 1 0 0 0 -> one pair
x 2 0 0 0 -> two pairs
x 0 1 0 0 -> three of a kind
x 1 1 0 0 -> full house
x 0 0 1 0 -> four of a kind
x 0 0 0 1 -> five of a kind

'x'表示您不匹配。因此,您的查找表将四个数字与分数匹配。

我对这个问题很感兴趣,所以我写了一些代码来做上面的事情。你仍然需要做查找表,但这是相对微不足道的,对你来说将是一个很好的做法。这是一个演示,带有注释(run code here):

<?php
    function counting(array $array) {
        // Input figures
        print_r($array);

        // Run the figures twice through the bucket-counter
        $firstBuckets = bucketCounter($array);
        $secondBuckets = bucketCounter($firstBuckets);

        // Ignore counts of 1
        array_shift($secondBuckets);

        // Output, just need to do the lookup now
        echo ' converts to ';
        print_r($secondBuckets);
        echo "<br />";
    }

    /**
     * Bucket counter
     */
    function bucketCounter(array $array) {
        $result = array(0, 0, 0, 0, 0, );
        foreach($array as $value) {
            if ($value > 0) {
                $result[$value - 1]++;
            }
        }

        return $result;
    }

    // Try some demos here!
    counting(array(1, 2, 3, 4, 5));
    counting(array(1, 1, 2, 4, 2));
    counting(array(1, 1, 1, 1, 1));

?>

我所包含的演示似乎有效,但是要寻找错误!