如何获得正确的价值?

时间:2018-04-01 22:20:03

标签: c++ string list math structure

我该怎样做才能获得正确的等级?

示例:

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

ostringstream sLEVEL; sLEVEL << "Level: " << gLEVEL;

我想使用XP值来获得正确的等级。 如果我得到值24450应该给我它然后&#34; 10&#34;背部 我知道我可以使用这样的东西,但在游戏中它是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 个答案:

答案 0 :(得分:0)

使用带有exp值的std::array

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。从文件中读取它。使用一些数学公式。

答案 1 :(得分:0)

要做这样的工作,你需要std::lower_boundstd::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