1

扫雷,还是。我找到了一种方法来做到这一点,但我知道必须有一种简化的方法来做到这一点。我必须在矩阵中放置一个数字来表示它周围有多少炸弹(“b”)。这就是我所拥有的,我知道必须有更短的方法。

def check(y,x):
    if ((y < 0) or (y >= len(mat1)) or (x < 0) or (x >= len(mat1))):
        return (False)
    else:
        return mat1[y][x]

def addscores():
    for x in range(len(mat1)):
        for y in range(len(mat1)):
            if mat1[y][x] != "b":
                if check(y-1,x-1) == "b" or check(y,x-1) == "b" or check(y+1,x-1) == "b" or check(y+1,x) == "b" or check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) =="b":
                    mat1[y][x] = 1
                if check(y-1,x-1) == "b":
                    if check(y,x-1) == "b" or check(y+1,x-1) == "b" or check(y+1,x) == "b" or check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                        mat1[y][x] = 2
                if check(y,x-1) == "b":
                    if check(y+1,x-1) == "b" or check(y+1,x) == "b" or check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                        mat1[y][x] = 2
                if check(y+1,x-1) == "b":
                    if check(y+1,x) == "b" or check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                         mat1[y][x] = 2
                if check(y+1,x) == "b":
                    if check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                        mat1[y][x] = 2
                if check(y+1,x+1) == "b":
                    if check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                        mat1[y][x] = 2
                if check(y,x+1) == "b":
                    if check(y-1,x+1) == "b" or check(y-1,x) == "b":
                        mat1[y][x] = 2
                if check(y-1,x+1) == "b":
                    if check(y-1,x) == "b":
                        mat1[y][x] = 2
                if check(y-1,x-1) == "b":
                    if check(y,x-1) == "b":
                        if check(y+1,x-1) == "b" or check(y+1,x) == "b" or check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                            mat1[y][x] = 3
                    if check(y+1,x-1) == "b":
                        if check(y+1,x) == "b" or check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                            mat1[y][x] = 3
                    if check(y+1,x) == "b":
                        if check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                            mat1[y][x] = 3
                    if check(y+1,x+1) == "b":
                        if check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                            mat1[y][x] = 3
                    if check(y,x+1) == "b":
                        if check(y-1,x+1) == "b" or check(y-1,x) == "b":
                            mat1[y][x] = 3
                if check(y-1,x-1) == "b":
                    if check(y,x-1) == "b":
                        if check(y+1,x-1) == "b":
                            if check(y+1,x) == "b" or check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                                mat1[y][x] = 4
                    if check(y+1,x-1) == "b":
                        if check(y+1,x) == "b":
                            if check(y+1,x+1) == "b" or check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                                mat1[y][x] = 4
                    if check(y+1,x) == "b":
                        if check(y+1,x+1) == "b":
                            if check(y,x+1) == "b" or check(y-1,x+1) == "b" or check(y-1,x) == "b":
                                mat1[y][x] = 4
                    #ETC
4

3 回答 3

2
def check(y,x):
    if ((y < 0) or (x < 0) or (y >= len(mat1)) or (x >= len(mat1))):
        return False
    else:
        if mat1[y][x] == 'b':
            return 1
        else:
            return 0

def check_all(y,x):
    if mat1[y][x] != 'b':        
        return sum([check(y + yy, x + xx) for xx in range(-1,2) for yy in range(-1,2)])
    else:
        return 'b'

def addscores():
    for x in range(len(mat1)):
        for y in range(len(mat1)):
            mat1[y][x] = check_all(y,x)

如果我理解您的操作正确,那么这段代码——尤其是check_all函数——应该可以解决您的问题。你是对的,肯定有更短的方法,使用循环(或列表推导,在这种情况下),而不是必须单独写出每个检查。

我尽可能保留了您的代码,因为我没有足够的上下文来知道进行更改是否会破坏任何内容。

于 2012-11-26T21:01:34.397 回答
1

你可以使用这样的东西:

def add_scores():
    def bounded_range(i):
        return range(max(0, i - 1), min(len(mat1) - 1, x + 1))

    for x in range(len(mat1)):
        for y in range(len(mat1)):
            Xs = bounded_range(x)
            Ys = bounded_range(y)
            mat1[x][y] = len([0 for _x in Xs for _y in Ys
                    if not (x == _x and y == _x) and mat1[_x][_y] == 'b'])
于 2012-11-26T21:01:05.210 回答
0

如果您想了解如何编写 Minesweeper,您可以查看Python Cookbook 上的MineSweep,它展示了开发游戏 GUI 版本的十二步过程。

于 2012-11-26T21:26:28.770 回答