如何计算RPG等级进度百分比

时间:2014-12-13 01:05:18

标签: ios objective-c algorithm

我正在设计一款RPG游戏,用户可以根据XP积累经验值(XP)并升级。计算当前水平是微不足道的; if else似乎最有效率。

我想计算当前水平的进展百分比。基于我有10个等级的假设,其中每个等级的上限都有一个指数值:

typedef NS_ENUM(NSInteger, RPGLevelCap) {
    RPGLevelCap1=499,
    RPGLevelCap2=1249,
    RPGLevelCap3=2249,
    RPGLevelCap4=3499,
    RPGLevelCap5=4999,
    RPGLevelCap6=6999,
    RPGLevelCap7=9999,
    RPGLevelCap8=14999,
    RPGLevelCap9=19999,
    RPGLevelCap10=19999 // Anything beyond previous level is Lvl 10; display as 100%
};

根据用户的当前水平计算用户级别进度是一种有效且易于理解的方法吗?

if else语句难以理解和维护,但可能相当有效:

float levelProgression=0;

// Calculate level progression as a fraction of 1
if(xp <= RPGLevelCap1)
{
    levelProgression = ((float)xp / RPGLevelCap1);
}
else if (xp <=RPGLevelCap2)
{
    levelProgression = ((float)(xp-RPGLevelCap1) / (RPGLevelCap2-RPGLevelCap1));
}
else if (xp <=RPGLevelCap3)
{
    levelProgression = ((float)(xp-RPGLevelCap2) / (RPGLevelCap3-RPGLevelCap2));
}

...

else if (xp>RPGLevelCap10)
{
    levelProgression = 1;
}

鉴于级别上限不一致......我该如何处理这个问题?

2 个答案:

答案 0 :(得分:1)

嗯。一种简单的方法是将级别上限值存储在数组中。根据小于的最大值查找玩家的当前等级。 (第一级为0到499,第二级为500到1249等)使用循环查找用户的级别而不是一组if / else语句。

然后计算玩家当前等级的范围,(end_of_range - start_of_range)

0 - 499 = 499
500 - 1249 = 749,

如果一名玩家处于600分,那么他就是2级角色,在500-1249范围内。

他在600-500或100分范围内。 (600-500)/ 749 * 100是玩家在该范围内完成的百分比。在此示例中,完成了13.35%。

答案 1 :(得分:0)

有几种方法可以解决这个问题。我在这里选择的武器是在LevelData的概念中体现XP值,而不是使用枚举,XP值数组等。这样的好处是,对于每个级别,您通常会有许多可配置的值(对于基于级别的基于示例级别的乘数)。通过这种方式,它们都在一起。

在您的LevelData中,有不同的方法可以编码XP。这些范围从下一级别的XP总计,或下一级别的开始和结束XP总计。显然还有其他的排列。

我通常使用后者,主要是因为它阻止我必须“知道”上一级别的LevelData。

所以我通常会在JSON中使用它

{
    "levelData": [
    {
        "levelStartXP": "0",
        "levelUpXP": "250",
        "levelUpBonus": 0
    },
    {
        "levelStartXP": "250",
        "levelUpXP": "1000",
        "levelUpBonus": 50
    },
    {
        "levelStartXP": "1000",
        "levelUpXP": "2500",
        "levelUpBonus": 100
    },
    ]
}

这只是一个无聊的例子。然后,我当然有一个LevelData类,它体现了每个级别。我也有一个LevelDataManager。该经理用于逐级销售信息。方便的方法有帮助。例如,好的有:

- (NSInteger)levelWithXP:(NSInteger)xp; // for a given XP, give me the appropriate level
- (LevelData *)levelDataWithXP:(NSInteger)xp; //for a given XP, give me the appropriate LevelData
- (LevelData *)levelDataWithLevel:(NSInteger)level; // for a given level, give me the appropriate LevelData
- (NSInteger)levelUpXPForLevel:(NSInteger)level; // for a given level, give me the XP value needed for the next level)

我只是随意使用NSInteger,为您的案例使用适当的数据类型。

您想要支持的内容真的取决于您。

整个事情的要点是尽量不存储个别级别的组件。而是将它们聚合在LevelData或其他一些集合中,这样您就可以获得每个级别的所有信息,并创建某种形式的管理器/界面来获取所需的信息。

回答你的问题。假设我们有一个LevelData类(假设它使用上面的JSON,这些字段由属性表示)和一个名为theLevelDataMgr的LevelDataManager实例,你可以根据以下内容计算%:

LevelData *levelData = [theLevelDataMgr levelDataWithLevel:currLevel]; // currLevel is the current level
float xpDiffInLevel = levelData.levelUpXP - levelStartXP;
float xpInLevel = currXP - levelStartXP; // currXP is the current XP of the user
float pctOfXP = xpInLevel / xpDiffInLevel; // You should add divide by zero check

是的,如果你愿意的话,你可以让LevelData类包含一个方法来为你做这个计算,以帮助更好地封装它。

代码未经过测试,列出的内容只是为了让您更好地了解如何操作。此外,您决定如何为每个级别存储XP决定了这将如何工作。此代码基于我通常使用的方法。