zoukankan      html  css  js  c++  java
  • 游戏中按概率播放某个音效简单c++实现

    熟悉xact的都知道一个cue可以对应多个sound。在播放某个cue的时候xact会按照每个sound播放概率进行选择某个sound然后进行下面的播放。

    在这里简单的使用rand进行一个模拟通过概率选择某一项的实现。

    假设有四个sound对应的概率分别为:

    A——%20

    B——%40

    C——%10

    D——%30

    假设100%概率的话,可以简单的指定0-100对应上面的每项的概率。

    A————对应100内的(0-19)20%

    B————对应100内的(20-59)40%

    C————对应100内的(60-69)10%

    D————对应100内的(70-99)30%

    这里使用rand()所求得出的概率尽管不能绝对的和上面类似20%这样精确,但基本上是可以做到按照给定的概率做出相应的选择的。

    下面是测试代码:

    void  main()
    {
        int ia(0),ib(0),ic(0),id(0);
        for(int i = 0;i<100;i++)
        {
            int n = rand() % 100;
            if(n<=19)
            {
                ia++;
                cout << "A"<<endl;
            }else if(n<=59)
            {
                ib++;
                cout << "B"<<endl;
    
            }else if(n<=69)
            {
                ic++;
                cout << "C"<<endl;
    
            }else
            {
                id++;
                cout << "D"<<endl;
            }
        }
    
        cout << "A=%"<<ia<<endl;
        cout << "B=%"<<ib<<endl;
        cout << "C=%"<<ic<<endl;
        cout << "D=%"<<id<<endl;
    
    
        system("pause");
    
    
    }

     今天在实际实现的时候发现了一些小问题,例如在使用rand()的时候,如果只获取一次的话,那它第一次执行的值永远是相同的,所以需要修改下逻辑。还有就是有可能让你通过概率选择的个数不固定,所以这些都是要考虑的范围。

    下面是修正版测试代码:

    struct stSound
    {
        string Name;
        int    weight;
    }
    
    string GetSelectName(vector<stSound> *vecSound)
    {
        int sum = 0;
        int ia = 0;
        vector<int> vecTemp;
        for(int i =0;i<vecSound.size();i++)
        {
            sum += vecSound.at(i).weight;
        }
    
        for(int i =0;i<vecSound.size();i++)
        {
            ia += ((vecSound.at(i).weight)*100) / sum;
            int nRange = ia;
            vecTemp.push_back(nRange);
        }
    
        srand((unsigned int)time(0));//解决rand()执行第一次值都相等的问题
        int iVlau = rand()%100;
        for(int i = 0;i<vecTemp.size();i++)
        {
            //解决通过概率选择的个数不固定的问题
            if(iVlau == vecTemp.at(i))
            {
                return vecSound.at(i).Name;
            }
        }
    
        return NULL;
    }

    效率上感觉不是很好,不过基本满足通过每项的权重计算概率,然后按照概率进行选择某一项了。

  • 相关阅读:
    angularjs学习笔记一之显示数据,修改数据
    收藏/不再提醒
    CSS3动画
    Content-Type
    键盘快捷键
    url、href、src 详解
    关于docnment.write() 会清空原来的内容
    jq事件注意点
    echart的自适应
    键盘事件
  • 原文地址:https://www.cnblogs.com/wainiwann/p/3103359.html
Copyright © 2011-2022 走看看