基于积分的游戏升级公式

Formula for game levelup based on points

我知道对此有一个简单的答案 - 我只是想不出。我正在开发一款战略游戏,其中风景根据积分升级其等级。所以我要找的结果是这样的...

等级从分数...

1 <= 1  
2 <= 2,3  
3 <= 4,5,6  
4 <= 7,8,9,10  
5 <= 11,12,13,14,15

你可以看到这是怎么回事。那么谁能提醒我执行此操作的简单公式,以便我可以离开并羞愧地低下头?

嗯,我找不到任何这样做的算法。

您可以在游戏的 Awake() 处自动生成具有此匹配项的数组:

public int startLevel = 1;
public int scoreLimit = 100;
private int currentLevel = 0;
public int[] matchingArray;

void Awake()
{
    matchingArray = new int[scoreLimit + 1];
    currentLevel = startLevel;
    int currentScore = 1;
    int availableScoreSteps = 1;

    while (currentScore <= scoreLimit)
    {
        while (availableScoreSteps > 0 && currentScore <= scoreLimit)
        {
            matchingArray[currentScore] = currentLevel;
            availableScoreSteps--;
            currentScore++;
        }
        currentLevel++;
        availableScoreSteps = currentLevel;
    }
}

现在您可以通过 matchingArray[yourscore] 访问您的级别,它将 return 级别。

试试这个

int maxLevel = 10;

int GetLevel(int points) 
{
    int maxPointsPerLevel = 0;

    for(int level=1; level<maxLevel; level++) {
        maxPointsPerLevel  += level;
        if(points <= maxPointsPerLevel )
        {
            return level;
        }
    }

    return maxLevel;
}

这是一个非常性感的算法。不要感到羞耻,我以前从未见过这样的事情,我不得不坐下来拿些纸来证明它。如果你发现 while 循环有点恶心,你可以用递归来解决它。

protected int GetLevel(int points)
{
    int i = points;
    int s = 0;
    while(i > 0)
    {
        s++;
        i -= s;          
    }
    return s;
}

希望对您有所帮助!

您描述的序列是一个非常有名的序列,名为 triangular numbers 序列,由公式定义:

maxpt = (lv * (lv + 1)) / 2

在您的具体情况下,此公式给出了您可以拥有且仍处于级别 lv 的最大分数 maxpt

但你想要相反的结果。您想知道在给定的点数 pt 下您将处于哪个级别 lv。这被命名为数字的 triangular root(类似于平方根)。

您可以通过 Bhaskara 方程直接反转公式,但是您需要做一些技巧来修正基础索引。这给出:

lv = (int)((Math.sqrt(8 * (pt - 1) + 1) - 1) / 2) + 1

这适用于 pt >= 1。对于 pt = 0 只需 return 0 以避免浮点数错误(负数的平方根)。

不过,您肯定可以找到更优雅的解决方案来解决这个 over the internet