Eloquent Javascript:Chessboard

时间:2015-06-22 22:44:51

标签: javascript eloquent

编写一个程序,创建一个代表8×8网格的字符串,使用换行符分隔行。在网格的每个位置处都有空格或“#”字符。角色应该成为棋盘。

我的代码不断创建一个包含所有哈希值的8 x 8结构。 有人可以提供一些建议来编辑我的代码吗?

 var size = 8;

 var str = "";

 var altern = false;
 var line = 1;

 while (line <= size) {
     var character = 1;
     while (character <= size) {
         if (altern) {
             if (character % 2 === 0) {
                 str += "#";
                 console.log(character);
                 console.log(str);

             } else {
                 str += " ";
                 console.log(character);
                 console.log(str);
             }

         } else {
             if (character % 2 === 0) {
                 str += " ";
                 console.log(character);
                 console.log(str);
             } else {
                 str += "#";
                 console.log(character);
                 console.log(str);
             }
         }

         altern = !altern;
         character++;

     }

     str += "\n";
     line++;
 }

 console.log(str);

9 个答案:

答案 0 :(得分:1)

通过同时使用alterncharacter % 2,您可以选择带#every迭代的分支。只使用其中一个。

答案 1 :(得分:1)

在找到OP的代码之前,我不知道该如何回答。这是我发现可以使用的内容:

var size = prompt("What is the size?");
var str = "";
var line = 0; 
//Instead of using 1, use 0. It'll make sense in the next comment.

while (line < size) {
    var character = 0; // Changed this to 0 as well.
        while (character < size) {
            if (line % 2 === 0){

            /*Instead of using logic negate(altern = !altern), you could use one of the variables
            you already have. Changing line = 1 to line = 0, we now can write the conditon above. 
            Where the first line holds true, because 0 % 2 === 0 is true.*/ 
                
                if (character % 2 === 0) {
                    str += " "; // I switched the string values around, to get what is resembled in the book.
                    console.log(character);
                    console.log(str);
                } else {
                    str += "#"; // Here
                    console.log(character);
                    console.log(str);
                }
            } else {
                if (character % 2 === 0) {
                str += "#"; // Here
                console.log(character);
                console.log(str);
                } else {
                str += " "; // Here
                console.log(character);
                console.log(str);
                }
            }
        character++;
        }

    str += "\n";
    line++;
}
alert(str);
//Changed this so the final result is easier to see, rather than in the jumbled mess of the console. 

答案 2 :(得分:0)

我怀疑您想要为每个新切换altern,而不是每个正方形

这里有一个循环循环。将您的altern切换代码从内循环移动到外循环。

while (line <= size) {
     var character = 1;
     while (character <= size) {
         // inner loop code here
         character++;
     }

     // Outer loop end code. HERE is where you toggle altern
     str += "\n";
     line++;
     altern = !altern;
 }

答案 3 :(得分:0)

下面有一个可以工作,但我用Os(大写o)替换了空格,并且代码稍有变化。

 var size = 8;

 var str = "";

 var altern = false;
 var line = 1;

 while (line <= size) {
     var character = 1;
     while (character <= size) {
       console.log('altern: ' + altern + 'character: ' + character);
         if (altern) {
             if (character % 2 === 0) {
                 str += "O";
                 console.log(character);
                 console.log(str);

             } else {
                 str += "#";
                 console.log(character);
                 console.log(str);
             }

         } else {
             if (character % 2 === 0) {
                 str += "O";
                 console.log(character);
                 console.log(str);
             } else {
                 str += "#";
                 console.log(character);
                 console.log(str);
             }
         }

         altern = !altern;
         character++;

     }

     str += "\n";
     line++;
 }

//  console.log(str);
alert(str);

这个有效,但不是,我建议你尝试以更好的方式重写这段代码。提示:注意@koenpeters所说的内容。

答案 4 :(得分:0)

而不是使用所有这些循环,你可以这样做:

var width = 8,
    height = 8,
    str = new Array(1 + (width * height + height) / 2).join('# ').replace(new RegExp('(.{' + width + '}).', 'g'), '$1\n');

只要宽度不均匀,同时高度为奇数,就可以正常工作。

如果您只需要这个特定情况,您也可以摆脱一些开销,只需使用它:

var str = new Array(37).join('# ').replace(/(.{8})./g, '$1\n')

答案 5 :(得分:0)

而不是基于位置(即使是奇数)的while循环和过度重复你的案例,使用两个for循环和一个case语句来确定一个位置是否需要#vs&#34; &#34 ;.将它们存储到var中,然后在完成后打印var。

var board = "";
var countX = 0;
var countY = 0;
var size = 8;

for(var i = 0; i < size; i++) {
    for(var j = 0; j < size; j++) {
        if((countX + countY) % 2 == 0) {
            board += " ";  
        }
        else {
            board += "#";
        }
        countX++;
    }
    board += "\n";
    countY++; 
}
console.log(board);

董事会产出:

 # # # #
# # # # 
 # # # #
# # # # 
 # # # #
# # # # 
 # # # #
# # # # 

答案 6 :(得分:0)

我本来可以通过以下方式解决此问题的:首先使用while循环打印出一行8个苛刻(########)符号,然后使用另一个循环将其垂直重复8次,并编写一个测试条件,当两个迭代的值均为偶数时,更改y的值。

const size = 8
for(let i = 0; i < size; i++){
    let y = " "
    let cols = 0;
    if(i % 2 == 0){
       y = "";
    }else{
       y = " ";
    }  
    while(cols < size){
      if( cols % 2 == 0){
         y = y + "#"}
      else{
         y = y + " "
      }
    rows++
    }
  console.log(y)

}

答案 7 :(得分:-1)

要实现的基本要点是,给定 N 行,如果N为奇数,则其第一个方块将为黑色,否则为白色。

另外,如果给定行的第一个方格是黑色,那么对于给定的列 M ,如果M是奇数,则方形将是黑色,如果M是偶数,则方形将是白色。

同样,如果第一个方块是白色,那么对于列 M ,如果 M 是奇数,则方块将为白色,否则为黑色。

希望有所帮助。

编辑:

如果您是不可读代码的粉丝,请尝试此操作:

for i in range(8):
    s = ''
    for j in range(8):
        if (i - j%2) % 2 == 0:
            s = s + "#"
        else: s = s + 'O'
    print s

答案 8 :(得分:-2)

我目前也在学习JavaScript。我坚持了一天。我认识到的唯一一件事是,如果您想在JavaScript中做一些有用的事情,请使用循环。

我对复杂的编码一无所知,但是循环可以轻松地完成工作,乍一看似乎很复杂。

这是我的版本:

让b =“” // **只需创建一个空字符串,因为如果您不这样做,循环将在单列中打印出符号,数字等,但是如果使用空字符串,您以后可以在该字符串中写入符号,从而使您可以水平扩展字符串

让大小= 8 // **由于循环从0开始到无穷大,因此必须将其考虑在内

for(让i = 0; i // **创建第一个循环->(;;)。如您所见,在循环体内(该表达式将一直执行到循环有效为止),我只有b = b +“#”,这意味着,我的第一个“ for”循环将进行循环:) 8次,将存储在“ b”变量的“最后一个值”中(它将是########),您可以在一张工作表中进行检查(您会看到,该循环仍在垂直进行,但是要点是它存储了LAST VALUE)

{b = b +“#”} // **这是上面清楚描述的第一个循环的正文

for(让a = 0; a // **在第二个循环中,我们创建相同的例程,并从第一个循环中使用值“ b”进行循环循环。注意,第一个循环包含在{}中,因此它是独立运行的。

{

if(a%2 == 0) // **只是条件,它使我们可以分配不同的字符串(行)代码(希望您理解括号内的内容

{console.log(“” + b)} // **由于我们要查看棋盘,因此应将其打印到屏幕上,因为我们使用了“ console.log”,但再次注意,在这里我们不会更改变量“ b”的值,我们只是对其进行操作,但是它将保持不变“ #########”

其他{

console.log(b)} // **如果“ if”失败,我们将继续使用“ #########”值,这是“ b“变量

}