'ValueError:太多值无法解包'

时间:2019-09-19 17:38:42

标签: python nested-lists minesweeper

我正在尝试编写基本版本的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) 。知道我该如何解决吗?

2 个答案:

答案 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个周围的瓦片中的每个瓦片,但是希望这可以帮助您了解处理扫雷的基本情况

希望有帮助!