我正在尝试编写基本版本的minesweeper。您从用户那里获得行,列,炸弹的数量及其位置。您应该计算每个元素周围的炸弹数量。考虑下面的示例: 输入
<div>
输出为:
4 3
5
1 1
4 3
1 3
4 2
3 2
这是我的代码:
* 2 *
2 3 2
2 * 3
2 * *
我的问题是在投降时发现炸弹。我得到n, m = [int(x) for x in input().split()]
k = int(input()) #number of bombs
#location of bombs
bomb = []
for i in range(k):
r,c = [int(r) - 1 for r in input().split()]
bomb.append([r,c])
#making the grid
map = []
for x in range(n):
map.append([])
for y in range(m):
map[x].append(0)
#locate bombs
for i, j in bomb:
map[i][j] = '*'
#count the bombs
Ns = 0
for i, j in map:
for x in range(-1, 2):
for y in range(-1, 2):
if map[i + x][j + y] == '*':
Ns += 1
map[i][j] = Ns
print(map)
。知道我该如何解决吗?
答案 0 :(得分:0)
for i, j in map:
无效。 map
是列表的列表,类似于4x3数组。
您似乎正在尝试遍历map
的索引,并将那些与列表内容混淆了。试试
for i in range(len(map)):
for j in range(len(map[i])):
...
答案 1 :(得分:0)
您的代码中存在两个潜在的问题。
首先,您的地图实际上有3个值要为每个值解包(因为您的m为3),而不是两个。这是您需要修复的行:
for i, j in map:
相反,您可能需要解压缩map的每个值,如下所示:
for x in range(len(map)):
for y in range(len(map[i])):
square = map[x][y]
第二,用于检查周围环境的代码可能会遇到问题,因为您只需将地雷的x和y减一/加一,这将使您的代码尝试在地图中查找不存在的索引!例如。如果x为2,则增加1将给您3,从而破坏列表。
您可能想要的是:
for i in range(max(0,x-1),min(x+1,n-1)+1):
for j in range(max(0,y-1),min(y+1,m-1)+1):
这仅接收周围的值,并且不违反数组范围。 Max(0,x-1)阻止我们给出负数组边界,而min(x + 1,n-1)阻止我们超越最大数组边界。 y也是如此。
结合起来,代码可能看起来像这样:
#count the bombs
for x in range(len(map)):
for y in range(len(map[i])):
# if x,y is not a mine
if map[x][y] != '*':
# check the surroundings of x,y for mines
Ns = 0
for i in range(max(0,x-1),min(x+1,n-1)+1):
for j in range(max(0,y-1),min(y+1,m-1)+1):
# if this surrounding block is a mine, add to Ns
if (map[i][j]) == '*':
Ns += 1
print("Not safe: " + str(Ns))
# append the Ns number to the x,y block
map[x][y] = Ns
for layer in map:
print(layer)
输出:
['*', 2, '*']
[2, 3, 2]
[2, '*', 3]
[2, '*', '*']
请注意,这绝对不是针对该问题的最优化的解决方案。最好的方法是在进行过程中保存值,这样就不必检查所有3到8个周围的瓦片中的每个瓦片,但是希望这可以帮助您了解处理扫雷的基本情况
希望有帮助!