List 更改列表中字符串周围的变量

List 更改列表中字符串周围的变量,list,python-3.x,List,Python 3.x,我正在编写一个扫雷游戏,我遇到了一个问题,我无法独自解决它。如果一个M离它很近,我想把M周围的0改成1,如果两个矿离它很近,我想把2改成1,依此类推。我编写了以下代码: 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'],

我正在编写一个扫雷游戏,我遇到了一个问题,我无法独自解决它。如果一个M离它很近,我想把M周围的0改成1,如果两个矿离它很近,我想把2改成1,依此类推。我编写了以下代码:

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

非常感谢您的帮助。

首先,我会将您的炸弹索引存储在一个列表中。然后我会尝试使用一个函数来获取给定位置的所有相邻元素

退房

然后,您可以更新此函数,以获取一个附加参数,该参数将是对所有找到的相邻单元格执行的递增或递减函数。

您有两个问题:

  • 如果在结束前出现索引错误,则跳过其余部分
  • 你覆盖了其他地雷

    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 ..... :(
    
  • 这太可怕了,所以你应该把它变成一种功能

    def update_cell(x, y):
        try:
            if hiddenfield[x][y] != 'M':
                hiddenfield[x][y] += 1
        except IndexError:
            pass
    
    for i in range(0, len(hiddenfield)):
        for j in range(0, len(hiddenfield)):
            if hiddenfield[i][j] == 'M':
                update_cell(i - 1, j - 1)
                update_cell(i - 1, j)
                update_cell(i - 1, j + 1)
                update_cell(i, j - 1)
                update_cell(i, j + 1)
                update_cell(i + 1, j - 1)
                update_cell(i + 1, j)
                update_cell(i + 1, j + 1)
    

    现在看起来好多了:)

    作为另一个想法,我会制作一个mine对象(应该保存它自己的位置),每个对象都会有一个方法接收一块板,并将它周围的所有位置增加1。