首页 > 解决方案 > 调平系统 - 携带额外的 XP 到下一个级别

问题描述

我正在创建一个基本的调平系统,但是我遇到了一些障碍,这更像是一个数学问题而不是 Java 问题。我想动态地将任何额外的 XP 转移到下一个级别,目前一旦达到升级要求,XP 计数就会简单地设置为 0。请注意,我希望这能够处理用例如果玩家获得足够的 XP 以一次提升几个级别。

我当前的代码如下:

    public void giveXP(String name, int xp) {
        
    int pXP = Main.storedUsers.get(name).getXP();
    
    this.xp = (pXP + xp);
    
    int pLevel = Main.storedUsers.get(name).getLevel();
    double constant = 2;
    double fixed = 450;
    int nextLevelXP = Math.round((pLevel * constant) + fixed);
    int xpNeededToLevelUp = nextLevelXP - pXP;
    
    if (xpNeededToLevelUp > 0) {
        Admin.debugMessage("You gained " + xp + " XP, "+ xpNeededToLevelUp + " needed for next Level.");            
    }
    
    else if (xpNeededToLevelUp <= 0) {
        Admin.debugMessage(name + " leveled up to level " + (pLevel+1));
        UserFetch.setLevel(name, (pLevel+1));
        Main.storedUsers.get(name).setLevel(pLevel+1);
        this.xp = 0;
    }
}

标签: javamath

解决方案


只是为了更新我如何解决我遇到的问题,同时还能够一次处理多个级别,代码如下:(唯一的问题是较低级别的 XP 差距很小,但这是一个数学问题)

    public static int getLevelXPThreshold(int level) {
    int value = (int) (75+(400+(75*(Math.pow(1.10409,level)))));
    return value;
}

        
public static Map<Integer, Integer> getXPThresholds() {
    
    int maxLevel = 90;
    
    Map<Integer, Integer> levelXPThresholds = new HashMap<Integer, Integer>();


    for (int level = 1; level < maxLevel; level++) {
        int levelXP = getLevelXPThreshold(level);
        levelXPThresholds.put(level, levelXP);
    }
    
    return levelXPThresholds;
}

public static int canUserLevelUp(User user) {
    
    int xp = user.getXp();
    
    Map<Integer, Integer> levelXPThresholds = getXPThresholds();

    for (int levels : levelXPThresholds.keySet()) {
        
        if (!(xp >= levelXPThresholds.get(levels))) { 
                                
            if (user.getLevel() != levels) {
                
                UserFetch.setLevel(user.getName(), (levels));
                Main.storedUsers.get(user.getName()).setLevel(levels);
            }
            
            int nextLevelXP = getLevelXPThreshold(levels); //<--- this means it will always return the level higher than the current user level based on xp value.
            
            return nextLevelXP -= xp;
            
        }
    }
    
    return 0;
}

推荐阅读