【问题标题】:Check through an array and identify matching numbers检查数组并识别匹配的数字
【发布时间】:2025-12-03 20:30:01
【问题描述】:

我正在开发一款刮刮卡游戏,用户从我/我的商店购买刮刮卡,然后可以通过刮掉数字并匹配 3 张图片来兑换该刮刮卡以赢取奖品

像实体刮刮卡一样,我希望预先配置好奖品,以便我知道何时中奖,但显然用户不知道,这样我可以限制奖品,所以它不是真正的随机,而是会中奖者是随机的。

我知道如何设置奖品,但我需要检查数组中的每个数据值,以确保没有 3 个匹配的数字,除非他们真的赢了..

到目前为止我有这个(我会整理它并尽快缩短代码)

$numbers = array(
    0 => rand(0,9),
    1 => rand(0,9),
    2 => rand(0,9),
    3 => rand(0,9),
    4 => rand(0,9),
    5 => rand(0,9),
    6 => rand(0,9),
    7 => rand(0,9),
    8 => rand(0,9)
    );

随机生成9个数字

echo "<table>";
    $i=0;
    for($x=0;$x<3;$x++){
    echo "<tr>";
       for($y=0;$y<3;$y++){
           echo "<td>" . $numbers[$i] . "</td>";
           $i++;
       }
    echo "</tr>";
    }

将它们排列成一个 3x3 的表格

我知道有命令 in_array() 将通过数组进行排序以查找某些值,但我不想运行一个无限循环检查每个值以查看是否匹配,因为它是劳动密集型的并且会很混乱也是。

我正在寻找任何人都可能提出的建议,以便我可以对数组进行排序并查看是否存在任何 3 个数字,如果存在,并且它们不应该存在(即用户实际上并没有中奖) 则应将其中一个更改为新数字。

所以提前感谢您的帮助,我期待您的建议

卢克

**** 编辑 **

+更多信息

为了挑选获胜者,我将使用这样的数据库查询

$stock = $conn -> query("SELECT DISTINCT * FROM codes WHERE Available = 1 AND 0 = FLOOR(RAND()*Chance) ORDER BY RAND()");

每个代码都有一定的获胜机会,如果匹配,则会显示,根据赢得的代码,将显示特定的奖品

$stock = $conn -> query("SELECT DISTINCT * FROM codes WHERE Available = 1 AND Win = 1);

'Win' 将是数据库中的一个表,每次有人玩游戏时它都会下降 1

所以每个代码都会有表格 Win 当它命中 1 时会在下一场比赛中弹出

这是我能想到的两种我认为可行的方法,这两种方法都可以让我大致控制何时以及是否有人获胜,但第二种解决方案显然是一种更准确的方法

【问题讨论】:

    标签: php arrays random


    【解决方案1】:

    如果发生三一,不改变数字怎么样,但防止三一发生。

    function createScratchRange()
    {
        $result = array();
        $options = array_merge(range(0,9), range(0,9));
    
        for ($i = 0; $i < 9; $i++)
        {
            $key =  array_rand($options, 1);
            $result[] = $options[$key];
            unset($options[$key]);
        }
    
        return $result;
    }
    

    您可能希望能够创造赢家:

    function createWinner()
    {
        $winningNumber = rand(0,9);
    
        $result = array();
        $possibleNumbers = range(0,9);
        unset($possibleNumbers[$winningNumber]);
        $options = array_merge($possibleNumbers,$possibleNumbers);
    
        for ($i = 0; $i < 9; $i++)
        {
            $key =  array_rand($options, 1);
            $result[] = $options[$key];
            unset($options[$key]);
        }
    
        // looks random now.. but no winning numbers... Lets just stick them in there.
        $keys = array_rand($result, 3);
        foreach($keys as $key)
        {
            $result[$key] = $winningNumber;
        }
    
        return $result;
    }
    

    用于测试:

    var_dump(createScratchRange());  // this will never give 3 identical numbers in the array.
    var_dump(createWinner());  // this will ALWAYS give 3 identical numbers, but never 2 sets of 3 identical numbers
    

    【讨论】:

    • 理想情况下,这需要对 3 个号码起作用,2 个匹配就可以,但 3 个匹配的号码意味着该人中奖,因为中奖的机会不是由 php 设置的,而是设置为数据库查询我不需要担心有多少双打我只需要它来掩盖如果 3 个数字匹配并且它们不应该匹配。谢谢你的回复,虽然有点过头了,但我想我明白它会达到什么目的
    • 对不起,这是关于三倍的,我写错了评论。第一个函数给出 9 个随机数,最大 2 个相同,第二个函数将给出 9 个随机数,但总是有 3 个相同(但绝不会有 2 组 3 个相同)。所以它不会给出 1,1,1,2,2,2,3,3,3。复制粘贴试试看
    • 啊,我明白了,谢谢!我刚刚测试了 createStratchRange 函数,看起来效果很好。使用 createWinner 函数,我可以将随机生成的号码替换为从数据库中获取的号码,例如 $winningNumber = $_SESSION['itemid'] 或类似的东西,因此中奖号码对应于赢得的奖金?
    • 刚刚测试了 createWinner 函数,并预测它工作得很好。非常感谢您的帮助,我真的很感激。卢克
    • 我不知道你是否已经尝试过了,但是是的,你可以用类似 session.但是我会通过一个参数来保持代码干净。