【问题标题】:PHP Game weapon accuracyPHP游戏武器精度
【发布时间】:2010-05-06 03:11:51
【问题描述】:

我正在尝试想出一种方法,让玩家可以用他们的武器开火并且只命中一定的百分比。例如,一把枪只能命中 70% 的时间,而另一把只能命中 34% 的时间。

到目前为止,我能想到的只是加权数组。

尝试 1:

private function weighted_random(&$weight)
    {
        $weights = array(($weight/100), (100-$weight)/100);
        $r = mt_rand(1,1000);
        $offset = 0;
        foreach($weights as $k => $w)
        {
            $offset += $w*1000;
            if($r <= $offset)
                return $k;
        }
    }

尝试 2:

private function weapon_fired(&$weight)
    {
        $hit = array();
        for($i = 0; $i < $weight; $i++)
            $hit[] = true;
        for($i = $weight; $i < 100; $i++)
            $hit[] = false;
        shuffle($hit);
        return $hit[mt_rand(0,100)];
    }

似乎球员的命中率并不正确,但我不太确定为什么。

有什么想法或建议吗?这些有什么明显的问题吗?

谢谢

【问题讨论】:

  • 明显错了吗?是的,它们比下面显示的 Chris AtLee 等更简单的方法要慢得多。您绝对不想遍历任何类型的数组,更不用说每次武器开火时对其进行排序(随机播放)。
  • 谢谢,我没有考虑开销!

标签: php random weighted


【解决方案1】:
private function weapon_fired($weight)
    {
        return mt_rand(0, 99) < $weight;
    }

【讨论】:

  • 这是我第二次尝试的更简单的方法,对吧?你碰巧知道它是否“准确”?
  • 应该是。您可以通过调用它几千次并查看结果如何来测试准确性。
  • 取决于“准确”的含义。随机性是一件有趣的事情。仅仅因为它可能会连续 10 次返回真值,对于有 1% 命中率的武器并不意味着它不“准确”。
  • 另一个需要考虑的重要事项。在开发游戏时,您绝对希望您的武器开火功能是任何形式的循环。
  • 不会是:mt_rand(0, 99) &lt; $weight 您的答案使用 0, 100,它返回 101 个可能性中的 1 个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多