我正在编写一个扫雷游戏,我遇到了一个问题,我无法自己解决。如果一个M接近它,我想将M&#39周围的0改为1,如果两个地雷靠近它,则将2改为2,依此类推。我写了这段代码:
hiddenfield = [[0, 0, 0, 0, 0, 'M', 0, 0, 0, 'M'],
[0, 0, 0, 'M', 0, 0, 0, 'M', 'M', 'M'],
[0, 0, 'M', 0, 'M', 0, 0, 'M', 0, 'M'],
[0, 0, 0, 0, 'M', 0, 0, 0, 0, 0],
[0, 0, 'M', 0, 'M', 0, 0, 0, 0, 0],
[0, 0, 0, 'M', 0, 'M', 'M', 0, 0, 0],
[0, 0, 0, 'M', 0, 0, 0, 'M', 0, 0],
[0, 0, 0, 'M', 0, 0, 0, 0, 0, 0],
[0, 'M', 'M', 0, 'M', 0, 0, 0, 0, 0],
['M', 0, 0, 'M', 0, 0, 0, 0, 'M', 0]]
for i in range(0,len(hiddenfield)):
for j in range(0,len(hiddenfield)):
try:
if hiddenfield[i][j] == 'M':
hiddenfield[i+1][j] += 1
hiddenfield[i-1][j] += 1
hiddenfield[i][j+1] += 1
hiddenfield[i][j-1] += 1
hiddenfield[i+1][j-1] += 1
hiddenfield[i-1][j+1] += 1
hiddenfield[i+1][j+1] += 1
hiddenfield[i-1][j-1] += 1
except IndexError:
continue
def showMineFieldHidden(hiddenfield):
border = list(range(0,len(hiddenfield)))
row = [' ']+border
i = 0
for rows in [border]+hiddenfield:
print(row[i], end=' ')
i += 1
for lines in rows:
print(lines, end=' ')
print()
但我得到的是:
0 1 2 3 4 5 6 7 8 9
0 0 0 0 1 1 M 1 0 1 M
1 0 0 2 M 2 1 1 M M M
2 0 1 M 2 M 0 0 M 1 M
3 0 1 2 1 M 0 0 1 0 1
4 0 1 M 1 M 1 1 0 0 0
5 0 1 1 M 1 M M 2 1 0
6 0 0 0 M 0 1 2 M 1 0
7 0 1 1 M 1 0 1 1 1 0
8 0 M M 3 M 1 0 0 0 0
9 M 1 1 M 2 1 1 0 M 0
真的很感激一些帮助。
答案 0 :(得分:2)
你有两个问题:
你覆盖其他地雷
Router
这很糟糕,因此你应该把它变成一个功能
for i in range(0, len(hiddenfield)):
for j in range(0, len(hiddenfield)):
if hiddenfield[i][j] == 'M':
if hiddenfield[i + 1][j] != 'M':
try:
hiddenfield[i + 1][j] += 1
except IndexError:
pass
if hiddenfield[i + 1][j] != 'M':
try:
hiddenfield[i - 1][j] += 1
except IndexError:
pass
#and so on ..... :(
现在看起来更好:)
答案 1 :(得分:0)
我首先将炸弹的索引存储在列表中。然后我会尝试使用一个函数来获取给定位置的所有相邻元素。
然后你可以更新这个函数来获取一个额外的参数,该参数可以是在所有相邻单元格上执行的递增或递减函数