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



这来自一本教科书:

编写一个程序,创建一个表示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,并更改程序,使其适用于任何大小,输出给定宽度和高度的网格。

如何做到这一点?有人告诉我,我们需要一个循环中的循环,但我想不通?

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

谢谢你的帮助。

正如您的书中所说,我们可以通过几个for循环来实现这一点。对于线(y坐标)和列(x坐标),我们将有一个循环。

for循环通常用于执行某个内容一定次数。(从技术上讲,直到满足一个条件。)下面是一个例子:

for (let y = 0; y < 8; y++) {
// Do something
}

在本例中,我们使用值0初始化y变量。只要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 % 21,依此类推。在这种情况下,我们添加行x和列y,以便为每行交替使用奇数/偶数值。其结果将是10

((x+y)%2) ? ' ' : '#'。。。

这被称为三元。something ? 'truthy' : 'falsy'表示如果something为true(或truthy,如1),则返回'truthy'。如果没有,返回'falsy'。在我们的例子中,如果行加列是奇数,则返回一个空格(连接到行)。否则,如果是偶数,则返回一个#(它也被连接到该行)。

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

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

以下是实现这一点的步骤:

  1. size of chessboard迭代2 loops。外循环将代表line,而内循环代表column。//这里循环迭代(从0到<size)意味着0到7。

  2. 内部循环根据模块判断outer loop索引是even还是odd。它将决定行的起始列将是spaceblock(#)

  3. this if and else内部,只需找出内部循环索引为evenodd,并在此基础上附加列(spaceblock(#))即可。

var size = 8;
var block = '#';
var space = ' ';
function chessBoard(ChessSize){
for (var i = 0; i < ChessSize; i++) {
var drawLine = '';
for (var y = 0; y < ChessSize; y++){
if (i%2) {
if (y%2) {
drawLine = drawLine + space;
} else {
drawLine = drawLine + block;
}
} else {
if (y%2) {
drawLine = drawLine + block;
} else {
drawLine = drawLine + space;
}
}
}
console.log(drawLine);
}
}
chessBoard(size);

在棋盘中,调用每个单元格A[i, j]i是行索引,j是列索引。

  • i + j为偶数的所有细胞均为黑色
  • CCD_ 54为奇数的所有细胞均为白色
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");
}
  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))

循环使代码比实际更短。

不打印# # # #,您可以在一个循环中写8次,让程序只写1次就打印8次。

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

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

如果i变量为偶数,则if条件将打印lineTwo;如果i变量为奇数,则lineOne条件将打印。

循环使其更具动态性,因为您只需更改由变量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

我重新制作了棋盘函数,以接受一个包含棋盘大小的变量。

我在一个循环中创建了另一个循环。上面的循环与我在第一个例子中所做的相同。但在第二个循环中,它以交替模式打印# # # #。我们没有将字符串写为固定字符串,而是使其更具动态性。

最新更新