Ios 如何以百分比计算RPG级别进度

Ios 如何以百分比计算RPG级别进度,ios,objective-c,algorithm,Ios,Objective C,Algorithm,我正在设计一个RPG游戏,用户可以积累经验点(XP)并根据XP升级。计算当前水平是微不足道的if-else似乎是最有效的 我想计算当前级别的进度百分比。基于我有10个级别的假设,其中每个级别的上限为指数值: typedef NS_ENUM(NSInteger, RPGLevelCap) { RPGLevelCap1=499, RPGLevelCap2=1249, RPGLevelCap3=2249, RPGLevelCap4=3499, RPGLevelC

我正在设计一个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;
}
float-levelProgression=0;
//以1的分数计算水平进度

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

然后计算玩家当前等级的范围(范围的结束-范围的开始)

等等

如果一个玩家在600点,他是一个二级角色,在500-1249范围内


他在600-500或100点范围内/749*100是玩家在该范围内的完成百分比。在本例中,完成率为13.35%。

有几种方法可以实现这一点。我在这里选择的武器是将XP值体现在LevelData的概念中,而不是使用枚举、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,这些字段由属性表示)和一个名为LevelDataMgr的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的方式也决定了这将如何工作。此代码基于我通常使用的方法。

使用数组存储级别上限可能会更容易
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