我正在使用普通的python来制作棋盘格,而不是交替的1和0。我知道我可以使用带有模数运算符的嵌套for循环,但我不知道如何处理for循环中的模数。
def print_board(board):
for i in range(len(board)):
print " ".join([str(x) for x in board[i]])
my_grid = []
for i in range(8):
my_grid.append([0] * 8)
for j in range(8):
#This is where I'm stuck.
print_board(my_grid)
答案 0 :(得分:2)
也许我们首先应该解决另一个问题:如何使用棋盘格式生成列表。
这样的列表因此交错了[0,1,0,...]
行和[1,0,1,...]
行。
让我们首先构造长度为n
的第一行。我们可以这样做:
[i%2 for i in range(n)]
现在下一行应该是:
[(i+1)%2 for i in range(n)]
下一个可以是:
[(i+2)%2 for i in range(n)]
你看到一种模式出现了吗?我们可以构建如下模式:
[[(i+j)%2 for i in range(n)] for j in range(m)]
现在唯一剩下的就是将其作为字符串生成。我们可以通过将列表中的数据转换为str
,join
它们(并且可选地使用生成器而不是列表解析)来实现此目的。所以:
'\n'.join(''.join(str((i+j)%2) for i in range(n)) for j in range(m))
因此我们可以构建一个 m×n 网格,如:
def print_board(m,n):
print('\n'.join(''.join(str((i+j)%2) for i in range(n)) for j in range(m)))
然后是10x15板:
>>> print_board(10,15)
010101010101010
101010101010101
010101010101010
101010101010101
010101010101010
101010101010101
010101010101010
101010101010101
010101010101010
101010101010101
N.B。:我们可以使用&1
代替%2
来提高代码效率:
def print_board(m,n):
print('\n'.join(''.join(str((i+j)&1) for i in range(n)) for j in range(m)))
答案 1 :(得分:2)
一种简单的方法
# Function to draw checkerboard
def drawBoard(length):
for row in xrange(0, length):
for col in xrange(0, length):
# Even rows will start with a 0 (No offset)
# Odd rows will start with a 1 (1 offset)
offset = 0
if row % 2 == 0:
offset = 1
# alterate each column in a row by 1 and 0
if (col + offset) % 2 == 0:
print '1',
else:
print '0',
# print new line at the end of a row
print ""
drawBoard(8)
答案 2 :(得分:2)
这是我的解决方案,使用嵌套for循环。请注意,i+j
是偶数还是奇数是确定它应该在哪里以及它应该在0的好方法,因为它总是在相邻的'单元'之间交替。
def checkerboard(n):
board = []
for i in range(n):
board.append([])
for j in range(n):
board[i].append((i+j) % 2)
return board
for row in checkerboard(8):
print(row)
打印
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
答案 3 :(得分:1)
对于偶数宽度,你可以避免所有循环,只需乘以一些字符串:
def print_board(width):
print ('0 1 ' * (width // 2) + '\n' + '1 0 ' * (width // 2) + '\n') * (width // 2)
print_board(10)
,并提供:
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0 1 0
对于10 x 10网格,其工作原理如下:
取字符串
1 0
将字符串乘以5给出
1 0 1 0 1 0 1 0 1 0
对0 1
给予同样的信息:
0 1 0 1 0 1 0 1 0 1
在每个结尾处添加换行符并将它们连接在一起:
1 0 1 0 1 0 1 0 1 0 \n0 1 0 1 0 1 0 1 0 1 \n
现在将整个字符串乘以5得到网格。
答案 4 :(得分:0)
您可以使用列表推导和模数:
new_board = [[0 if b%2 == 0 else 1 for b in range(8)] if i%2 == 0 else [1 if b%2 == 0 else 0 for b in range(8)] for i in range(8)]
for row in new_board:
print(row)
输出:
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
[0, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 1, 0, 1, 0, 1, 0]
获得更多自定义结束:
for row in new_board:
print(' '.join(map(str, row)))
输出:
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0