4

私はこのようなグリッドを持っています。グリッドにランダムに「b」を 1 つ配置し、文字「b」を囲む数字の 1 を配置します。これは、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()は、正方形の端にあるすべての正方形を省略しています。これを解決する良い方法は、句を省略しif、代わりに境界を自動的にチェックする正方形をチェックする関数を追加することです。例えば:

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 に答える