代码之家  ›  专栏  ›  技术社区  ›  Jessy-G

如何获得正确的值?

  •  -1
  • Jessy-G  · 技术社区  · 6 年前

    我必须做些什么才能达到正确的水平?

    示例:

    int gXP = globalDoHandle::PlayerStats_XP(p);
    ostringstream sXP; sXP << "XP(RP): " << gXP;
    
    ostringstream sLEVEL; sLEVEL << "Level: " << gLEVEL;
    

    我想使用XP值来获得正确的级别。 如果我得到值24450应该给我,然后返回“10” 我知道我可以用这样的东西,但这是8000级的游戏!

    if (gXP < 800) { Rank = "1"; }
    else if (gXP < 2100) { Rank = "2"; }
    else if (gXP < 3800) { Rank = "3"; }
    ...
    
    LEVEL: XP
    Level 1: 0
    Level 2: 800
    Level 3: 2100
    Level 4: 3800
    Level 5: 6100
    Level 6: 9500
    Level 7: 12500
    Level 8: 16000
    Level 9: 19800
    Level 10: 24000
    Level 11: 28500
    Level 12: 33400
    Level 13: 38700
    Level 14: 44200
    Level 15: 50200
    Level 16: 56400
    Level 17: 63000
    Level 18: 69900
    Level 19: 77100
    Level 20: 84700
    ...Level 8000: 1787576850
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   YSC    6 年前

    要做这样的工作,你需要 std::lower_bound std::lower_bound(l, h, v) 返回迭代器 it 范围内 [l, h) 范围上的值是最小的验证 *it > v

    constexpr std::array<unsigned, 10> levels = { /* ... */ }; // xp needed for each level
    
    unsigned level(unsigned xp)
    {
        auto it = std::lower_bound(cbegin(levels), cend(levels), xp);
        return std::distance(begin(levels), it);
    }
    

    level(xp) 返回达到的级别 xp 与以下值相关的经验点: levels

    Se a full demo online

        2
  •  0
  •   super    6 年前

    使用 std::array 使用中的exp值。

    std::array<int, 8000> exp_table = { 0, 800, 2100... };
    
    int level=0;
    for(; level < exp_table.size() && exp_table[level] < gXP; ++level);
    
    Rank = std::to_string(level); // If this is needed?
    

    在此之后 level 将正确设置。剩下的就是如何生成 exp_table 。从文件中读取。使用一些数学公式。