嵌套循环javascript棋盘

嵌套循环javascript棋盘,javascript,for-loop,Javascript,For Loop,我试图理解javascript,但我不明白为什么它不能作为javascript雄辩的书中提到的棋盘任务的嵌套循环工作。我知道解决方案和方法,但我只是想知道为什么下面显示的代码不起作用。如果有人能解释的话。我从这段代码中期望做的是,制作一个棋盘,但它显然输出错误。所以,我也不需要一个棋盘的解决方案,只是解释一下为什么它不起作用。我原以为var board在第一个if语句为true时会被空字段填充,如果为false,则会被#此外,直到var x为9,并且语句x%(宽度-1)==0变为true,它才会

我试图理解javascript,但我不明白为什么它不能作为javascript雄辩的书中提到的棋盘任务的嵌套循环工作。我知道解决方案和方法,但我只是想知道为什么下面显示的代码不起作用。如果有人能解释的话。我从这段代码中期望做的是,制作一个棋盘,但它显然输出错误。所以,我也不需要一个棋盘的解决方案,只是解释一下为什么它不起作用。我原以为var board在第一个if语句为true时会被空字段填充,如果为false,则会被#此外,直到var x为9,并且语句x%(宽度-1)==0变为true,它才会进入新行。但产出并不像预期的那样。代码如下:

     var height = 8; 
     var width = 10;
     var board = "";

     for (var y = 0; y < height; y++) {   
       for (var x = 0; x < width; x++) {
         if ((x + y) % 2 == 0){
           board += " ";
         }
         else if(x%(width-1) == 0){
           board += "\n";
         }
         else{
           board += "#";
           }
        }
     }

     console.log(board);
var高度=8;
var宽度=10;
var board=“”;
对于(变量y=0;y
您可以将其作为嵌套循环执行,但输出不正确的原因是您的逻辑有缺陷

原因1:当x也是0(初始化状态)时,实际上会得到x%(宽度-1)==0,因此每个内部循环会触发两次

原因2:对于每个奇数值,也会出现在x%(宽度-1)==0的点(每个内部循环发生两次),通常会有一个“#”,现在有一个“\n”

如果您通过将此else If语句改为:

 if(x%(width-1) === 0 && x>0){
     board += "\n";
 }
将其移动到内部循环的最后一部分,这将起作用。但是,我非常喜欢将“\n”加法移到外部循环中,这样您就不必担心这个逻辑了。如果您担心换行符没有出现在棋盘之前(或之后,具体取决于您的编码方式),则可以对换行符添加进行y>0检查:

 var height = 8;
 var width = 10;
 var board = "";

 for (var y = 0; y < height; y++) {
     if(y>0) board += "\n";
     for (var x = 0; x < width; x++) {
         if ((x + y) % 2 == 0){
             board += " ";
         } else {
             board += "#";
         }
     }
 }

 console.log(board);
var高度=8;
var宽度=10;
var board=“”;
对于(变量y=0;y0)板+=“\n”;
对于(变量x=0;x
您可以将其作为嵌套循环执行,但输出不正确的原因是您的逻辑有缺陷

原因1:当x也是0(初始化状态)时,实际上会得到x%(宽度-1)==0,因此每个内部循环会触发两次

原因2:对于每个奇数值,也会出现在x%(宽度-1)==0的点(每个内部循环发生两次),通常会有一个“#”,现在有一个“\n”

如果您通过将此else If语句改为:

 if(x%(width-1) === 0 && x>0){
     board += "\n";
 }
将其移动到内部循环的最后一部分,这将起作用。但是,我非常喜欢将“\n”加法移到外部循环中,这样您就不必担心这个逻辑了。如果您担心换行符没有出现在棋盘之前(或之后,具体取决于您的编码方式),则可以对换行符添加进行y>0检查:

 var height = 8;
 var width = 10;
 var board = "";

 for (var y = 0; y < height; y++) {
     if(y>0) board += "\n";
     for (var x = 0; x < width; x++) {
         if ((x + y) % 2 == 0){
             board += " ";
         } else {
             board += "#";
         }
     }
 }

 console.log(board);
var高度=8;
var宽度=10;
var board=“”;
对于(变量y=0;y0)板+=“\n”;
对于(变量x=0;x
您的问题是(x+y)%2==0和x%(宽度-1)==0(或者更简单地说,x==width-1)可以同时为真,那么哪个条件检查应该优先于另一个条件检查

例如:

如果x==9,y==7,那么

(9+7)%2==0

因此,您应该首先针对所需输出的宽度范围测试x;i、 例如,我想试试这个:

for (var y = 0; y < height; y++) {   
   for (var x = 0; x < width; x++)
   {
     if (x == width - 1) {
       board += "\n";
     } else if ((x + y) % 2 == 0){
       board += " ";
     }
     else {
       board += "#";
     }
   }
}
(变量y=0;y 对于(变量x=0;x您的问题是(x+y)%2==0和x%(宽度-1)==0(或者更简单地说,x==width-1)可以同时为真,那么哪个条件检查应该优先于另一个条件检查

例如:

如果x==9,y==7,那么

(9+7)%2==0

因此,您应该首先针对所需输出的宽度范围测试x;i、 例如,我想试试这个:

for (var y = 0; y < height; y++) {   
   for (var x = 0; x < width; x++)
   {
     if (x == width - 1) {
       board += "\n";
     } else if ((x + y) % 2 == 0){
       board += " ";
     }
     else {
       board += "#";
     }
   }
}
(变量y=0;y 对于(变量x=0;x是的,太明显了,我还是错过了。非常感谢。是的,很明显,但我还是错过了。非常感谢。