嵌套循环javascript棋盘

nested for loop javascript chess board

本文关键字:棋盘 javascript 嵌套循环      更新时间:2023-09-26

我正在努力理解javascript,但我不明白为什么这不能作为javascript雄辩的书中提到的棋盘任务的嵌套循环工作。我知道解决方案以及如何做到这一点,但我只是想知道为什么下面显示的代码不起作用。如果有人能解释一下的话。我希望从这段代码中得到的是,制作一个棋盘,但它显然输出错误。所以,再一次,我不需要一个棋盘的解决方案,只需要解释为什么这不起作用。我原以为,var board在第一次if语句为true时会被空字段填充,如果为false,它会得到#。此外,直到var x为9,语句x%(width-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);

您可以将其作为嵌套循环来执行,但输出不正确的原因是您的逻辑有缺陷。

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

原因2:对于每个奇数值,也会出现在x%(width-1)===0(每个内环再次发生两次)的点上,通常会有一个"#",现在有一个

如果您通过将else-If语句更改为:来解决此问题

 if(x%(width-1) === 0 && x>0){
     board += "'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);

您的问题是(x+y)%2==0和x%(width-1)==0(或者,更简单地说,x==width-1的值)可以同时为true,那么哪个条件检查应该优先于另一个条件检查?

例如,

如果x==9,y==7,则

(9+7)%2==0

因此,您应该首先根据x的宽度边界测试x,以获得所需的输出;也就是说,我会尝试这个,而不是:

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 += "#";
     }
   }
}