求一个小游戏的算法

游戏需求是这样的:
用户在出生的时候,就有一个运气值 x,这个运气值负责控制游戏事件的发生的,游戏事件设置了触发频率 y ,还有游戏事件的随机值 z;

求一个算法,能让用户根据自己的随机值,并且根据游戏的触发频率,来决定是否触发游戏事件。

1、用户在一个场景里,比如挖宝贝。他的幸运值是:x
2、这个场景里有 3 个事件。
比如是:事件一 A1,事件频率是 y1 ,事件随机值是 z1;
比如是:事件二 A2,事件频率是 y2 ,事件随机值是 z2;
比如是:事件三 A3,事件频率是 y3 ,事件随机值是 z3;

能否有一个算法,可以计算出来,者三个事件,哪一个触发,或者哪两个触发,或者都触发?

备注:这里的 z1,z2,z3 可以是变化的。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9

想要知道 x y z 之间的关系。感觉你说得触发事件 = xyz ,然后再给触发事件一个值。

4年前 评论

@Gebriel 比如,
1、用户在一个场景里,比如挖宝贝。他的幸运值是:x
2、这个场景里有3个事件。
比如是:事件一A1,事件频率是 y1 ,事件随机值是z1;
比如是:事件二A2,事件频率是 y2 ,事件随机值是z2;
比如是:事件三A3,事件频率是 y3 ,事件随机值是z3;

能否有一个算法,可以计算出来,者三个事件,哪一个触发,或者哪两个触发,或者都触发?

备注:这里的 z1,z2,z3 可以是变化的。

4年前 评论
lddtime 4年前
andyzu (作者) (楼主) 4年前

也就是说 是看事件的频率来生出事件,然后这个生出的事件的随机值再和用户幸运值做剩下的操作?

4年前 评论

感觉和梦幻西游的挖宝图一样

4年前 评论
andyzu (楼主) 4年前

@andyzu 不知道满足你的要求不

   $proArr=[1,2,3];//概率数组

    $result = '';//结果数据
    //概率数组的总概率和

    $proSum = array_sum($proArr);
    //概率数组循环再次

    foreach ($proArr as $proArrItem => $proArrValue) {
        //总概率和去随机值,匹配当前循环的概率数组值

        $randNum = mt_rand(1, $proSum);
        //判断当前随机值是否小于当前循环的概率值
        if ($randNum <= $proArrValue) {
        //概率满足退出整个循环,获得概率值
            $result = $proArrValue;
            break;
        } else {
        //概率不满足 总概率值 - 当前循环值,将循环的概率数组值从数组中排除掉
        /**
        概率数组 =[1,2,3];\
        概率和 = 6\
        循环开始到 else 就是 6 -1 = 5\
        这个 5 就可以看做是 概率数组变成了 [2,3]
        */
            $proSum -= $proArrValue;
        }
    }
    return $result; 
4年前 评论

@手残哈哈 你的 else 那里面我没有明白。为什么要 $proSum -= $proArrValue ?? 然后 -- (减减)之后要在循环没有什么意思吧?
不过你这个给了我一个思路

function CalTriggerEvent(float $luckyValue,array $rateAndrandom,float $triggerValue) {
    $newArray = [];

    foreach($rateAndrandom as $event => $value) {
        if($value['rate'] * $value['random'] * $luckyValue > $triggerValue) {
            $newArray = $event;
        }
    }

    return $newArray;
};

$luckyValue = 20;
$rateAndrandom = [
    1 => [0.5,20],
    2 => [0.2,30]
];
$triggerValue = 10;
4年前 评论

@Gebriel
else 减去的是你概率数组里面的值,也就等于是把当前循环到的这个概率排除掉

比如:
概率数组=[1,2,3];
概率和=6
循环开始到else就是 6 -1 = 5
这个5 就可以看做是 概率数组变成了 [2,3] 概率和就等于5 一次一次的排除,就至少会有一个概率数组里面的值满足条件

4年前 评论
public function test()
{
       // 这里没有用到事件的系数
    $event_modulus = 0.1;

    //事件总数为:50
    $event_count = 50;
    $user_lucknum = mt_rand(1,$event_count + 10);
    //$user_lucknum = 20;
        dump( '用户的幸运值为:'.$user_lucknum );

$count = 0;
for ( $i = 1; $i <= $event_count; $i++ ) 
{
       //$andyzu = '$event_randnum'."$i";
    $andyzu = mt_rand( 1 , $event_count );

    if ( $user_lucknum == $andyzu ) {
            //$msg = '事件'."$i".'触发的随机值为:';
        //echo '<script>alert($msg);</script>';
        dump( '事件'."$i".'触发的随机值为:'.$andyzu );
        $count = $count + 1;
        //return;
    }

}
dump( '总触发事件次数:'.$count );
}
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!