这是来自一本教科书:
“编写一个程序,该程序创建一个代表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并更改程序以使其适用于任何大小,并输出给定宽度和高度的网格。
这是怎么做到的?有人告诉我我们需要一个循环,但是我不知道吗?
请记住,我是一个正在学习的新手,所以您解释得越多越好。
谢谢您的帮助。
答案 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 % 2
,0
是1 % 2
,1
是2 % 2
,0
是3 % 2
,依此类推上。基本上,除,剩下的就是您得到的。在这种情况下,我们将添加行1
和列x
,以便为每行替换奇/偶值。其结果将是y
或1
。
0
...
这称为三元。 ((x+y)%2) ? ' ' : '#'
表示如果something ? 'truthy' : 'falsy'
为真(或为真,例如something
),则返回1
。如果不是,请返回'truthy'
。在我们的例子中,如果行加列为奇数,则返回一个空格(将其连接到该行)。否则,如果它是偶数,则返回一个'falsy'
(它也被连接到该行)。
在每个内部循环之后,输出行,然后重新开始。
答案 1 :(得分:1)
我认为对于初学者来说,这是最简单的方法。
以下是执行此操作的步骤:
用2 loops
迭代size of chessboard
。外部循环代表line
,而内部循环代表column
。
//在这里循环迭代(从0到
内部内部循环根据模块确定outer loop
的索引是even
或odd
。它将决定行的起始列是space
或{ {1}}。
在 block(#)
内部,只需找出内部循环索引是this if and else
或even
并附加列(odd
或space
)。
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)
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
我重新制作了棋盘功能以接受一个保存棋盘大小的变量。
我在一个循环内创建了另一个循环。上面的循环与我在第一个示例中所做的一样。但是在第二个循环中,它以备用模式打印# # # #
。与其将字符串写为固定字符串,不如使它变得更加动态。