这来自一本教科书:
编写一个程序,创建一个表示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 % 2
是0
,1 % 2
是1
,2 % 2
是0
,3 % 2
是1
,依此类推。在这种情况下,我们添加行x
和列y
,以便为每行交替使用奇数/偶数值。其结果将是1
或0
。
((x+y)%2) ? ' ' : '#'
。。。
这被称为三元。something ? 'truthy' : 'falsy'
表示如果something
为true(或truthy,如1
),则返回'truthy'
。如果没有,返回'falsy'
。在我们的例子中,如果行加列是奇数,则返回一个空格(连接到行)。否则,如果是偶数,则返回一个#
(它也被连接到该行)。
在每个内部循环之后,输出行,然后重新开始。
我认为对于初学者来说,这是最简单的方法。
以下是实现这一点的步骤:
-
用
size of chessboard
迭代2 loops
。外循环将代表line
,而内循环代表column
。//这里循环迭代(从0到<size)意味着0到7。 -
内部循环根据模块判断
outer loop
索引是even
还是odd
。它将决定行的起始列将是space
或block(#)
。 -
在
this if and else
内部,只需找出内部循环索引为even
或odd
,并在此基础上附加列(space
或block(#)
)即可。
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");
}
- 使用2个循环
- 检测奇数行和偶数行
- 写入缓冲区
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
我重新制作了棋盘函数,以接受一个包含棋盘大小的变量。
我在一个循环中创建了另一个循环。上面的循环与我在第一个例子中所做的相同。但在第二个循环中,它以交替模式打印# # # #
。我们没有将字符串写为固定字符串,而是使其更具动态性。