Формула для игрового уровня на основе очков - PullRequest
0 голосов
/ 25 июня 2018

Я знаю, что есть простой ответ на этот вопрос - я просто не могу думать об этом. Я разрабатываю стратегическую игру, в которой декорации улучшают свои уровни в зависимости от очков. Итак, результат, который я ищу, это ...

Уровень от очков ...

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

Вы можете видеть, куда это идет. Так может ли кто-нибудь напомнить мне о простой формуле сделать это, чтобы я мог уйти и склонить голову от стыда?

Ответы [ 4 ]

0 голосов
/ 26 июня 2018

Последовательность, которую вы описываете, является очень известной, с именем треугольные числа последовательность, которая определяется по формуле:

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

В вашем конкретном случае эта формула дает максимумочков maxpt вы можете иметь и все еще находиться на уровне lv.

Но вы хотите обратное этому.Вы хотите знать, с какого уровня lv вы будете получать заданное количество баллов pt.Это называется треугольный корень числа (как аналогия с квадратным корнем).

Вы можете напрямую инвертировать формулу через уравнение Бхаскары, но вам нужно будет сделать некоторыехитрости, чтобы исправить базовый индекс.Это дает:

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

Это работает для pt >= 1.Для pt = 0 просто верните 0, чтобы избежать ошибки с плавающей запятой (квадратный корень из отрицательного числа).

Вы можете наверняка найти более элегантные решения для этого через Интернет .

0 голосов
/ 25 июня 2018

Попробуйте это

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;
}
0 голосов
/ 25 июня 2018

Вот довольно сексуальный алгоритм.Не стыдитесь, я никогда не видел ничего подобного раньше, и мне пришлось сесть с бумагой, чтобы выяснить это.Если вы находите циклы while немного грубыми, вы можете выполнить их с помощью рекурсии.

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

Надеюсь, это поможет!

0 голосов
/ 25 июня 2018

Хм, я не мог найти никакого алгоритма, делающего это.

Вы можете автоматически сгенерировать массив с этим соответствием в 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], и он вернет уровень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...