2011-10-19 45 views
0

我想开始我的循环在一定的数量,并使其循环。像这样: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); 
} 

感谢

回答

5

如果你想要像5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4序列(其中起点可以是任何数量的那一套),你不需要花哨的循环结构。

您可以只使用一个正常环与模运算符,类似的信息(因为标签中的一个伪代码为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,骑自行车在10之后回到0。

+0

非常优雅的解决方案! –

1

你的问题是有点混乱,但我确实看到基于断号的顺序,一对夫妇可能出现的错误你说你正在努力实现。

首先,如果你想为j最大可能的数目是10,你的条件应该是for (j > 10),不for (j > 11)。现在它的方式允许j重复一次为11

接下来,在相同的条件下,您需要将j设置为-1,而不是0。这是因为j将在下一个循环中递增,并将其设置为0意味着在下一个循环中j实际上等于1,并跳过0迭代(这可能是您说“跳过一个数字”时的意思)。所以它会是:

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

希望有帮助。

+0

对不起,在我的例子中我用了10,但代码来自我的实际项目(11和23)。 – apscience

1

这可以通过我独自完成;然而,试图可能使用你的例子是这样的:

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); 
      } 
     } 

    } 
} 
+0

根据您的要求生产:“5,6,7,8,9,10,0,1,2,3,4”。 –