更改列表列表中字符串的变量

时间:2015-11-25 17:06:13

标签: list python-3.x

我正在编写一个扫雷游戏,我遇到了一个问题,我无法自己解决。如果一个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

真的很感激一些帮助。

2 个答案:

答案 0 :(得分:2)

你有两个问题:

  1. 如果在结束前有索引错误,则跳过其余的
  2. 你覆盖其他地雷

    Router
  3. 这很糟糕,因此你应该把它变成一个功能

    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)

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

结帐Listing adjacent cells

然后你可以更新这个函数来获取一个额外的参数,该参数可以是在所有相邻单元格上执行的递增或递减函数