Для циклов — не проверять условие при первом запуске?

#actionscript-3 #language-agnostic #for-loop

#actionscript-3 #язык не зависит #для цикла

Вопрос:

Я хочу запустить свой цикл for с определенным номером и сделать его циклическим. Вот так:

5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4

Если максимальное число равно 10 и начинается с 5.

Причина в том, что я хочу перебирать каждую плитку в моей игре в определенном порядке (сверху вниз, затем направо).

Я пробовал следующее, но оно пропускает одно число:

 for(var i = position[0] 1; i != position[0]; i  ){
    for(var j = position[1] 1; j != position[1]; j  ){
        if(j > 11){
            j = 0;
        }
        if(i > 23){
            i = 0;
        }
        if(levelMap[i][j] == type){
            return position;
        }
        trace("j"   j);
    }
    trace(i);
}
  

Спасибо

Ответ №1:

Если вам нужна последовательность, подобная 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4 (где отправной точкой может быть любое число в этом наборе), вам не нужны причудливые конструкции цикла.

Вы можете просто использовать обычный цикл с оператором modulo, что-то вроде (псевдокод, поскольку один из тегов был language-agnostic ):

 start = 5
for i = 0 to 10
    use_i = (start   i) % 11
    // do something with use_i rather than i.
next i
  

Это будет повторяться use_i с 5 по 4, возвращаясь к 0 после 10.

Ответ №2:

Ваш вопрос немного сбивает с толку, но я вижу пару возможных ошибок, основанных на порядке чисел, который, по вашим словам, вы пытаетесь достичь.

Во-первых, если вы хотите, чтобы максимально возможное число для j было 10 , ваше условие должно быть for (j > 10) , а не for (j > 11) . То, как это происходит сейчас, позволяет j выполнять итерации 11 один раз.

Далее, в том же условном обозначении, вы захотите установить j значение -1 , а не 0 . Это потому, что j будет увеличиваться в следующем цикле, и установка его на 0 означает, что в следующем цикле j фактически будет равно 1 , и пропустить 0 итерацию (что, возможно, вы имели в виду, когда сказали, что «пропускает одно число»). Так что это будет:

 if (j > 10)
{
    j = -1;
}
  

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

Комментарии:

1. Извините, в моем примере я использовал 10, но код был из моего реального проекта (11 и 23).

Ответ №3:

Это можно было бы сделать только с помощью i; однако, пытаясь использовать ваш пример, возможно, что-то вроде:

 package
{
    import flash.display.Sprite;

    public class Test extends Sprite
    {

        public function Test()
        {
            super();

            for (var i:uint = 0, j:uint = 5; i < 11; i  , j = (5   i) % 11)
            {
                trace("j = "   j);
            }
        }

    }
}
  

Комментарии:

1. Это приводит к: «5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4» по вашему запросу.