В вашем коде есть две потенциальные проблемы.
Во-первых, ваша карта на самом деле имеет 3 значения для распаковки для каждого значения (так как ваш m равно 3), а не два.Это строка, которую вам нужно исправить:
for i, j in map:
Вместо этого вам, вероятно, нужно распаковать каждое значение для карты, например:
for x in range(len(map)):
for y in range(len(map[i])):
square = map[x][y]
Во-вторых, ваш код для проверки окружения может столкнуться с проблемами, потому что вы просто уменьшаете / увеличиваете x и y шахты на 1, это заставит ваш код попытаться найти индексы на карте, которая не существует!Например.если х равен 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 окружающих плиток на каждую плитку, но, надеюсь, это поможет вам понять базовый вариант работы с тральщиком.
Надеюсь, это поможет!