基于积分的游戏升级公式
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。
我知道对此有一个简单的答案 - 我只是想不出。我正在开发一款战略游戏,其中风景根据积分升级其等级。所以我要找的结果是这样的...
等级从分数...
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。