基于积分的游戏升级公式

时间:2018-06-25 09:21:21

标签: unity3d levelup

我知道有一个简单的答案-我只是想不到。我正在开发一种策略游戏,其中风景会根据点数升级其级别。所以我要寻找的结果是这个...

从点开始的水平...

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

您可以看到前进的方向。因此,有人可以让我想起执行此操作的简单公式吗,这样我就可以羞愧地低下头了。

4 个答案:

答案 0 :(得分:2)

您描述的序列是一个众所周知的序列,名为triangular numbers,由以下公式定义:

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

在您的特定情况下,此公式给出了您可以拥有并仍处于maxpt级的最大分数lv

但是您想要相反。您想知道lv的级别pt。这被称为数字的triangular root(类似于平方根)。

您可以通过Bhaskara方程直接将公式求逆,但是您需要做一些技巧来更正基本索引。这给出了:

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

适用于pt >= 1。对于pt = 0,只需返回0即可避免浮点错误(负数的平方根)。

不过,您肯定可以找到针对此over the internet的更优雅的解决方案。

答案 1 :(得分:1)

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

您可以在游戏的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]访问您的级别,它将返回该级别。

答案 2 :(得分:1)

尝试一下

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;
}

答案 3 :(得分:1)

这是一个非常性感的算法。别感到ham愧,我以前从未见过这样的东西,我不得不坐下来坐下一些纸,以待解决。如果发现while循环有点麻烦,则可以递归地将其退出。

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

希望有帮助!