编写一个表示8×8网格的程序?

时间:2018-08-07 03:02:26

标签: javascript loops for-loop

这是来自一本教科书:

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

棋盘看起来像这样:

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

这是我的代码:

const lineOne = ' # # # # '

const lineTwo = '# # # #'

const chessboard = function() {
  console.log(lineOne)
  console.log(lineTwo)
  console.log(lineOne)
  console.log(lineTwo)
  console.log(lineOne)
  console.log(lineTwo)
  console.log(lineOne)
  console.log(lineTwo)
}

console.log(chessboard())

尽管这确实输出了棋盘,但我可以说这是非常低效的。有什么更好的书写方式?

一旦我写完了 输出我应设置绑定值的棋盘:size = 8并更改程序以使其适用于任何大小,并输出给定​​宽度和高度的网格。

这是怎么做到的?有人告诉我我们需要一个循环,但是我不知道吗?

请记住,我是一个正在学习的新手,所以您解释得越多越好。

谢谢您的帮助。

5 个答案:

答案 0 :(得分:1)

正如您的书所说,我们可以通过几个<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <!-- Exclude the shared preferences file that contains the GCM registrationId --> <exclude domain="sharedpref" path="com.google.android.gms.appid.xml"/> <exclude domain="sharedpref" path="com.google.android.gms.measurement.prefs.xml"/> </full-backup-content> 循环来实现。对于行(for坐标)和列(y坐标),我们将有一个循环。

for循环通常用于执行某些操作。 (从技术上讲,直到满足条件为止。)这是一个示例:

x

在此示例中,我们使用值for (let y = 0; y < 8; y++) { // Do something } 初始化y变量。只要0小于y,我们将继续运行此循环。另外,在每个循环中,我们都将8添加到1的值中。 (y运算符就是这样做的。)

现在,我们的“做某事”可以在其中包含另一个循环。放在一起,这是您需要的代码:

++

外循环用于行,内循环用于列。现在,您将在内环中看到这一行:

const gridSize = 8;

for (let y = 0; y<gridSize; y++) {
  let line = '';
  for (let x=0; x<gridSize; x++) {
    line += ((x+y)%2) ? ' ' : '#';
  }
  console.log(line);
}

line += ((x+y)%2) ? ' ' : '#'; 开始...

这意味着我们将使用line +=变量并将一些数据连接到该变量。也就是说,由于line是字符串,因此它获取现有文本数据并将更多文本放在其末尾,然后将其重新分配回+=变量。

现在,line ...

首先,模运算符(x+y) % 2%0 % 201 % 212 % 203 % 2,依此类推上。基本上,除,剩下的就是您得到的。在这种情况下,我们将添加行1和列x,以便为每行替换奇/偶值。其结果将是y1

0 ...

这称为三元。 ((x+y)%2) ? ' ' : '#'表示如果something ? 'truthy' : 'falsy'为真(或为真,例如something),则返回1。如果不是,请返回'truthy'。在我们的例子中,如果行加列为奇数,则返回一个空格(将其连接到该行)。否则,如果它是偶数,则返回一个'falsy'(它也被连接到该行)。

在每个内部循环之后,输出行,然后重新开始。

答案 1 :(得分:1)

我认为对于初学者来说,这是最简单的方法。

以下是执行此操作的步骤:

  1. 2 loops迭代size of chessboard。外部循环代表line,而内部循环代表column。 //在这里循环迭代(从0到表示从0到7。

  2. 内部内部循环根据模块确定outer loop的索引是evenodd。它将决定行的起始列是space或{ {1}}。

  3. block(#) 内部,只需找出内部循环索引是this if and elseeven并附加列oddspace

block(#)

答案 2 :(得分:0)

在棋盘上,呼叫每个单元格A[i, j]i是行索引,j是列索引。

  • i + j甚至是黑色的所有单元格。
  • i + j为奇数的所有单元格均为白色。
var numberColumns = 8;

for (var i = 0; i < numberColumns; i++) {
  var line  = ""
  for (var j = 0; j < numberColumns; j++) {
     line += ((i + j) % 2 ? "#" : " ");
  }
  // print the new line
  console.log(line + "\n");
}

答案 3 :(得分:0)

  1. 使用2个循环
  2. 检测奇数和偶数行。
  3. 写入缓冲区。

function createGrid(size) {
  var s = ''
  for (var row = 0; row < size; row++) {
    var oddRow = row % 2 == 0
    if (oddRow) {
      s += ' '
    }
    for (var col = 0; col < size; col++) {
      s += ' #';
    }
    s += '\n'
  }
  return s
}

console.log(createGrid(8))
console.log()
console.log(createGrid(16))

答案 4 :(得分:-1)

循环会使您的代码短一些。

代替打印# # # #,可以循环写入8次,而只需编写1次即可使程序打印8次。

循环中的if条件只会使打印交替进行,从而使其看起来像棋盘。

循环从1开始,在8结束,由变量i表示。在这种情况下,我们可以将交替数区分为奇数和偶数。

如果if变量是偶数,则lineTwo条件将显示i,如果lineOne变量是奇数,则将显示i

循环使它更具动态性,因为您只需更改size当前变量8所代表的循环结尾即可。

const lineOne = ' # # # # '

const lineTwo = '# # # #'

const size = 8

const chessboard = function() {
  for ( let i = 1; i <= size; i++ ) {
    if ( i % 2 === 0 ) {
      console.log(lineTwo)
    }
    else {
      console.log(lineOne)
    }
  }
}

console.log(chessboard())

已更新

const chessboard = (size) => {
  for ( let i = 1; i <= size; i++ ) {
    var row = ''
    for ( let j = 1; j <= size; j++ ) {
      i % 2 === 0 ? j % 2 === 0 ? row += '#' : row += ' ' : j % 2 === 0 ? row += ' ' : row += '#'
    }
    console.log(row + "\n")
  }
}

console.log(chessboard(8)) //pass the size of the chessboard here

我重新制作了棋盘功能以接受一个保存棋盘大小的变量。

我在一个循环内创建了另一个循环。上面的循环与我在第一个示例中所做的一样。但是在第二个循环中,它以备用模式打印# # # #。与其将字符串写为固定字符串,不如使它变得更加动态。