【发布时间】:2018-01-27 23:10:58
【问题描述】:
我的代码如下:
def minesweeper(matrix):
for x in range(len(matrix)):
matrix[x].insert(0, "x")
#matrix[x].insert(len(matrix)+2, "x")
frame = ["x" for i in range(len(matrix[0]))]
matrix.insert(0, frame)
matrix.insert(len(matrix), frame)
output_matrix = [[0 for j in range(len(matrix[0]))] for i in range(len(matrix))]
for i in range(0,len(matrix[0])-1):
for j in range(0,len(matrix)-1):
if matrix[i][j] == True:
output_matrix[i][j+1] += 1 # one right
output_matrix[i+1][j] += 1 # one down
output_matrix[i][j-1] += 1 # one left
output_matrix[i-1][j] += 1 # one up
output_matrix[i+1][j+1] += 1 # one down, one right
output_matrix[i+1][j-1] += 1 # one down, one right
output_matrix[i-1][j+1] += 1 # one up, one right
output_matrix[i-1][j-1] +=1 # one up, one left
output_matrix.pop(0)
output_matrix.pop(len(output_matrix)-1)
for y in range(len(output_matrix)):
output_matrix[y].pop(0)
#output_matrix[y].pop(len(output_matrix))
return output_matrix
按照codefight用户的建议,由“x”创建的边界是为了确保如果我在矩阵的边界,炸弹计数不会转移到另一边。
此代码工作正常,直到炸弹位于矩阵的最后一列,例如:
如果输入:
[[False, False, True],
[False, False, False],
[False, False, False]]
输出为:
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
谁能清楚地解释为什么会这样?
如果有人能提出更好的方法来完成这项任务,我将不胜感激。
提前谢谢你。
【问题讨论】:
-
您停在
len(matrix[0])-1以避免出现OOB 错误,但这样做也可以避免最后一列。您需要更细粒度的范围控制,以便您仍然可以检查最后一列,但在这样做时不会更新其右侧的任何内容。 -
不,他并没有提前停下来,因为他在...周围添加了一个 x 边框
-
我得到 IndexError 与此代码。好像三边加了边框,右边没有加边框。
-
如果我修复了无法正确添加和删除边框单元格的代码,这将正常工作。您可以通过使用 append 来避免一些数学运算来找到最后一项,并且不给 pop 提供任何参数。
-
我在回答中举了一个例子,说明如何在不使用 pop() 的情况下移除边框。
标签: python minesweeper