Пока цикл крашит Unity, но не бесконечен

Я знаю (из похожих сообщений), что бесконечные циклы while печально известны тем, что вызывают сбой Unity3d. Я пытаюсь внедрить цикл while в то, над чем я работаю, что, я уверен, не является «бесконечным», но вызывает сбой игры.

Идея логики состоит в том, чтобы проверить список целых чисел на наличие последовательных чисел и использовать это как основу для применения бонуса. Список содержит «эффективные выстрелы», и каждый раз, когда производится выстрел, добавляется новое значение — чем больше последовательных эффективных выстрелов, тем выше бонус.

Вот что у меня есть:

        int count = 0;
        int firstItem = 0;
        int multiples = 3;
        int currentMultiple = 0;
        int bonusX = 0;

        foreach (int i in effectiveShots)
        {
            if (count == 0)
            {
                firstItem = i;
                count = 1;
            }

            else if (i == firstItem + count)
            {
                count++;
            }

        }

        while (count >= multiples)
        {
            currentMultiple = multiples;

            if (count == currentMultiple + multiples)
            {
                bonusX += 1;
            }

            if (bonusX > 10 || gameOver)
                break;

            UnityEngine.Debug.Log(bonusX);
        }

Логика проверки последовательных записей в списке effectiveShots была взята из ответа @Jon Skeet здесь. Хотя это, кажется, работает, я думаю, что это может быть проблемой. Как только выстрел пропущен, count необходимо сбросить. Есть идеи или предложения?

Затем следует ввести цикл while, как только количество последовательных эффективных выстрелов достигнет первого кратного, то есть 3 выстрелов. Затем для каждой серии последовательных результативных выстрелов увеличивайте бонус, например:

3 shots: bonusX = 1
6 shots: bonusX = 2
9 shots: bonusX = 3
12 shots: bonusX = 4

and repeat this until `count` is no longer >= 3, i.e. the player missed a shot. 

Проблема в том, что как только я делаю 3 последовательных выстрела и вхожу в этот цикл, игра вылетает. Я не думаю, что назвал бы это бесконечным циклом, поскольку пропуск выстрела — настройка count == 0 — означал бы, что условия while больше не выполняются, поэтому выпадите из цикла (я думаю?). Я также добавил дополнительную проверку для выхода из цикла при определенных обстоятельствах, но это не имеет значения.

Если вы можете подсказать, как исправить этот сбой, или предложить лучший подход в целом, мы будем признательны!


person Klicker    schedule 08.08.2017    source источник
comment
yet causes the game to crash. Можете ли вы показать нам скриншот сбоя?   -  person mjwills    schedule 09.08.2017
comment
Предполагается, что ваш цикл while будет работать вечно, пока count >= multiples. Вы должны уменьшить count в цикле while, чтобы он стал < multiples. Вы не делаете это прямо сейчас.   -  person Programmer    schedule 09.08.2017
comment
Ваш не бесконечный цикл работает бесконечно   -  person maccettura    schedule 09.08.2017
comment
Да, сделав перерыв на 5 минут и взглянув на это снова, было совершенно очевидно, что это никогда не сработает! Я думаю, что у меня есть лучший подход к этому, попробую завтра и обновлю этот пост с результатами. Спасибо всем!   -  person Klicker    schedule 09.08.2017
comment
А с помощью отладчика можно найти проблему менее чем за 10 секунд, как только программа войдет в бесконечный цикл. Вы приказываете отладчику прервать выполнение, а затем проверяете переменные или выполняете код пошагово, и проблема становится очевидной. Кроме того, это может помочь быстрее отладить ваш алгоритм.   -  person Phil1970    schedule 09.08.2017


Ответы (1)


Ничто в вашем цикле while не изменяет значение ни count, ни multiples, поэтому условие всегда оценивается как одно и то же значение => Бесконечный цикл

person Mark Pim    schedule 08.08.2017
comment
Я полагаю, также стоит отметить, что это условие оказывается более редким, чем он ожидал (потому что оно также завершит цикл после 10-кратной оценки true): if (count == currentMultiple + multiples) - person Rufus L; 09.08.2017
comment
Что верно только в том случае, если count == 6 AFAICS - person Mark Pim; 09.08.2017