4

我有一个看起来像这样的网格。我在网格中随机放置一个“b”并将数字 1 放在字母“b”周围。这似乎在任何地方都有效,除非应该将 1 放在底行和列一直到右边。例如,它看起来像这样

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 b
0 0 0 0 0 0 0 0 0 0

它应该是什么样子

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 1 b
0 0 0 0 0 0 0 0 1 1

这是我正在使用的代码,我无法弄清楚为什么那些 1 没有被放置在那里。

from random import*
mat1 = []
mat2 = []

def makemat(x):
    for y in range(x):
        list1 = []
        list2 = []
        for z in range(x):
            list1.append(0)
            list2.append("-")
        mat1.append(list1)
        mat2.append(list2)
makemat(10)


def printmat(mat):
    for a in range(len(mat)):
        for b in range(len(mat)):
            print(str(mat[a][b]) + "\t",end="")
        print("\t")



def addmines(z):
    count = 0
    while (count < z):
        x = randrange(0,len(mat1))       
        y = randrange(0,len(mat1))      
        if mat1[y][x] == "b":
            count -= 1
        else:
            mat1[y][x] = "b"
        count += 1
addmines(1)




def addscores():
    for x in range(len(mat1)):
        for y in range(len(mat1)):
            if ((y < len(mat1)-1) and (x < len(mat1)-1)) and ((y >= 0) and (x >= 0))):
                if mat1[y+1][x] == "b":
                    mat1[y][x] = 1
                if mat1[y-1][x] == "b":
                    mat1[y][x] = 1
                if mat1[y][x+1] == "b":
                    mat1[y][x] = 1
                if mat1[y][x-1] == "b":
                    mat1[y][x] = 1
                if mat1[y+1][x+1] == "b":
                    mat1[y][x] = 1
                if mat1[y+1][x-1] == "b":
                    mat1[y][x] = 1
                if mat1[y-1][x+1] == "b":
                    mat1[y][x] = 1
                if mat1[y-1][x-1] == "b":
                    mat1[y][x] = 1
    printmat(mat1)
addscores()
4

3 回答 3

2

您的嵌套循环会检查每个方块,看它是否应该有一个 1。但是,在您的第一if个子句中addscores(),您省略了位于正方形边缘的每个正方形。解决这个问题的一个好方法是省略ifcluase,而是添加一个函数来检查自动检查边界的正方形。例如:

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

if mat1[y - 1][x - 1]:然后,您可以代替, if checksqu(y - 1, x - 1):(等等)。

于 2012-11-17T00:34:09.420 回答
0

您可以简化这部分:

def addscores():
    for x in range(len(mat1)):
        for y in range(len(mat1)):
            if ((y < len(mat1)-1) and (x < len(mat1)-1)) and ((y >= 0) and (x >= 0))):
                if mat1[y+1][x] == "b":
                    mat1[y][x] = 1
                if mat1[y-1][x] == "b":
                    mat1[y][x] = 1
                if mat1[y][x+1] == "b":
                    mat1[y][x] = 1
                if mat1[y][x-1] == "b":
                    mat1[y][x] = 1
                if mat1[y+1][x+1] == "b":
                    mat1[y][x] = 1
                if mat1[y+1][x-1] == "b":
                    mat1[y][x] = 1
                if mat1[y-1][x+1] == "b":
                    mat1[y][x] = 1
                if mat1[y-1][x-1] == "b":
                    mat1[y][x] = 1

通过使用此代码:

def addscores():
    size = len(mat1)
    directions = [(dx, dy) for dx in [-1,0,1] for dy in [-1,0,1] if (dy!=0 or dx!=0)]
    for x in range(size):
        for y in range(size):
            for dx, dy in directions:
                try:
                    if mat1[y+dy][x+dx] == "b":
                        mat1[y][x] = 1
                except:
                    pass
于 2012-11-17T00:46:08.467 回答
0

这似乎可以解决问题:

def addscores(mat):
    for y in range(len(mat)):
        for x in range(len(mat[y])):
            if mat[y][x] == 'b':
                mat = pad(mat, x, y, '1')
    return mat

def pad(mat, x, y, n):
    for i, (x,y) in enumerate(itertools.product(range(x-1, x+2), range(y-1, y+2))):
        if i != 4: # the coordinate at index 4 is where the bomb is
            if 0<=y<len(mat) and 0<=x<len(mat[y]):
                mat[y][x] = n
    return mat

测试:

In [127]: mat
Out[127]: 
[['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '1', '1', '1'],
 ['0', '0', '0', '0', '0', '0', '0', '1', '0', '1']]

In [129]: addscores(mat)
Out[129]: 
[['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '1', '1'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '1', 'b'],
 ['0', '0', '0', '0', '0', '0', '0', '0', '1', '1']]
于 2012-11-17T00:48:30.523 回答