这个for循环如何制作8x8电路板?

时间:2015-05-15 22:01:25

标签: javascript for-loop

var size = 8;

var board = "";

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

console.log(board);

现在我明白这会创建一个8x8的主板。我在理解第二个“for”循环的方式和内容方面有问题(我想了解它的行为)。 据我所知,这2个循环创建了一个2D坐标系,第一个环用于覆盖y轴,第二个用于覆盖x轴。我理解以下块的工作原理。

{
 if ((x + y) % 2 == 0)
    board += " ";
 else
    board += "#";
}

我不明白第二个for循环是如何覆盖x轴的。 我开始阅读雄辩的javascript,这个问题是作为练习给出的。它提供了有关嵌套循环的简短信息,但没有给出这种复杂性。 我搜索了以前的答案,但没有得到有关此信息。有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

&#34;观看&#34;变量的变化可能会让你对程序的运作方式有更好的感受:

&#13;
&#13;
var prog= [],
    table= document.querySelector('table'),
    sx= document.getElementById('x'),
    sy= document.getElementById('y'),
    smod= document.getElementById('mod');

function display(x, y, c) {
  prog.push([x,y,c]);
}

function runProgram() {
  var p= prog.shift();
  if(p) {
    var x= p[0], y= p[1], c= p[2], mod= (x+y) % 2;
    sx.innerHTML= x;
    sy.innerHTML= y;
    smod.innerHTML= mod;
    table.rows[y].cells[x].innerHTML= c;
    setTimeout(runProgram, 200);
  }
}

var size = 8;

var board = "";

for (var y = 0; y < size; y++) {
  for (var x = 0; x < size; x++) {
    if ((x + y) % 2 == 0) {
      board += " ";
      display(x, y, ' ');
    }
    else {
      board += "#";
      display(x, y, '#');
    }
  }
  board += "\n";
}
console.log(board);

runProgram();
&#13;
th {
  height: 20px;
  width: 20px;
  border: 1px solid gray;
}
&#13;
y= <span id="y"></span><br>
x= <span id="x"></span><br>
(x+y) % 2 = <span id="mod"></span>
<table>
  <tr><th><th><th><th><th><th><th><th></tr>
  <tr><th><th><th><th><th><th><th><th></tr>
  <tr><th><th><th><th><th><th><th><th></tr>
  <tr><th><th><th><th><th><th><th><th></tr>
  <tr><th><th><th><th><th><th><th><th></tr>
  <tr><th><th><th><th><th><th><th><th></tr>
  <tr><th><th><th><th><th><th><th><th></tr>
  <tr><th><th><th><th><th><th><th><th></tr>
</table>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

考虑这个真值表,它显示了添加两个整数的偶数/奇数结果:

|  X is even  |  Y is even  | X + Y is even | Write a space?
|     F       |      F      |      T        |      T 
|     T       |      F      |      F        |      F
|     F       |      T      |      F        |      F
|     T       |      T      |      T        |      T

因此从位置(0,0)开始,内部循环将写入一个空格。然后考虑下一行,(0,1) - 内部循环会写一个数字符号,因为1 + 0的结果是奇数。无论当前行或列如何,整个电路板的模式都会继续。

因此,您还可以判断任意板上的任何方块是空的还是具有数字符号。

答案 2 :(得分:1)

基本的编程知识告诉我们,for循环只是一种调整变量值一定次数的方法。在你的情况下,你基本上是&#34;计数&#34;从零开始并递增y直到它大于大小。

所以第二个,"nested" for loop基本上采用这个非常简单的概念并对其进行扩展。因此,对于外部循环y的每{{}}次迭代,将从x开始并转到0

考虑这个修改过的代码示例:

size-1

生成此输出:

for (var y = 0; y < size; y++) {
    for (var x = 0; x < size; x++) {
        board += " " + (size * y + x);
    }
    board += "\n";
}

通过这种方式,变量0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 x似乎被恰当地命名。对于每一行yy将从x变为0

希望这是有道理的!