我知道有一个简单的答案-我只是想不到。我正在开发一种策略游戏,其中风景会根据点数升级其级别。所以我要寻找的结果是这个...
从点开始的水平...
1 <= 1
2 <= 2,3
3 <= 4,5,6
4 <= 7,8,9,10
5 <= 11,12,13,14,15
您可以看到前进的方向。因此,有人可以让我想起执行此操作的简单公式吗,这样我就可以羞愧地低下头了。
答案 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;
}
希望有帮助!