【问题标题】:Algorithm for a poker-style scoring system扑克风格评分系统的算法
【发布时间】:2013-04-27 18:01:25
【问题描述】:

我需要的是创建五个随机整数(比如rand(1,5))。然后,我根据这些数字生成一个分数。例如,如果我得到1,2,3,4,5 的结果,那将等于零分,但如果我得到1,1,3,4,5,那将是1,因为我们有一对。类似于扑克的计分方式,因此相同数字的五个将是“满屋”,从而产生最高分。

即使只是数学方程式,我将如何处理评分系统?

更多细节:

1-5 将持有单独的图像,然后将与具有与用户相同的代码的“The House”进行战斗以确定获胜者。以下是一些抽签示例和他们将获得的分数:

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)

数字的组合是不敬的,如果他们得 6 而房子得 6,那就是平局。

    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 //
                    );
                }
            }
        }
    }   
}

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

【问题讨论】:

  • 您能展示一下到目前为止您为解决问题而编写的代码吗?另外,你能更具体地了解评分规则吗? 1 1 1 1 1 的得分是否与 5 5 5 5 5 相同?
  • @mikejones 该操作显然没有使用 Java,因为该问题被标记为 phpmysql,尽管我看不到与后者的联系。
  • @Havelock,我正在浏览 Java 部分以找到这个问题......所以冷静点。
  • 你如何生成你的随机整数,这也会影响结果
  • 我将添加我所拥有的,它的输出。

标签: php


【解决方案1】:

为此使用 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,1,1,3,5 中出现的次数并给出 3 的分数吗?或者如果它显示 1、1、1、3、3,那么它会在 3 个同类和 2 个同类中得分 5?
  • 这个函数只是给出一个值被重复的次数。如果要计算某个分数,则需要对其计数应用公式。
  • 我很难理解你在 "Array(" 之后建议的部分,如果它确实计数 1 出现 3 次,那会给我 3 分?如果你的数组如果有 1,1,1,2,2 会输出 5 个计数吗?
【解决方案2】:

这是我会考虑的方法,基于@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”表示您不匹配。因此,您的查找表将四个数字与一个分数相匹配。

我对这个问题很感兴趣,所以我写了一些代码来完成上述工作。你仍然需要做查找表,但这相对来说是微不足道的,对你来说是个好习惯。这是一个演示,带有 cmets (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));

?>

我包含的演示似乎可以工作,但要寻找错误!

【讨论】:

  • 感谢您的出色回答,我想我会努力克服这个困难,但感谢您对我的教育!很抱歉对此不熟悉,但是当您说..创建一个存储桶时。我迷路了。
  • 啊,好吧:存储桶只是一个计算机科学术语,用于存储索引。所以,在我说 'bucket' 的地方,把它换成 'array' :)
  • 好的,我理解你写的很好,我遇到的问题是创建这些数组并扫描用户编号以对应你所说的。如果 1,1,1,3,3 则在数组中 = 3,0,2,0,0,而 1,2,3,4,5 在数组中 = 1,1,1,1,1大批。但是我如何创建这些数组来获得像你展示给我的计数?
  • 感谢代码更新,这为我指明了正确的方向! :D
  • 太棒了。请注意,在 Stack Overflow 上,在大多数问题上,人们会首先询问您的代码,因为最好的学习方式是尝试。无论如何,还有最后一点(查找表)供您做,所以我还没有做完所有事情。我认为这一位足够短,您可以使用一系列 if 语句,但如果您愿意,请尝试查找数组!
【解决方案3】:

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

【讨论】:

  • 亲爱的反对者,请您解释一下,而不是仅仅反对并离开?告诉我我的解决方案出了什么问题
  • 我觉得没问题,+1。我同意最初不希望提供完整的代码解决方案,直到 OP 向我们展示他们的尝试。
  • 啊,如果你有一个1, 1, 2, 2, 4 的输入,那么桶方法给出:1 =&gt; 2, 2 =&gt; 2, 4 =&gt; 1。分数(根据现在修改的问题)应该是 2,所以我想如果它们小于 3(它们都是),我们可以从所有存储桶中减去 1,然后将它们相加。因此,它看起来像 1' =&gt; 1, 2' =&gt; 1, 4' =&gt; 0。加起来就是 2。
  • 哎呀,这对满屋子的人来说分崩离析!我认为存储桶方法以及组合的手动查找表可能是最好的方法。
  • 现在你更新问题后,我需要更新很多。我以前不了解配对或全屋规则。但是@halfer 似乎已经给了你这个,所以我不会改变我的。手动查找表也包含在他的 cmets 中。
猜你喜欢
  • 1970-01-01
  • 2012-05-08
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多