你能把这个整理一下吗?

2024-10-03 04:34:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我这里有一个python类方法的怪物。我唯一能想到的办法就是一个巨大而丑陋的if/elif/else块。你们谁能想出什么办法让这个更好?你知道吗

对于context,这是pygame的网格生成库的一部分,是一个函数,它获取网格中的一个tile并返回周围的tile。如果“horizontal”设置为false,则只返回与该图块垂直相邻的图块,反之亦然。你知道吗

def getSurroundingTiles(self, tile, horizontal = True, vertical = True):
    index = list(self.getTiles()).index(tile)
    maxtile = self.sqrtnum - 1 # Offset for 0 indexing

    i = int(math.floor(index / self.sqrtnum))
    j = int(index % self.sqrtnum)

    surroundingTiles = []

    if i == 0 and j == 0:
        #Top left corner
        if horizontal:
            surroundingTiles.extend((self[i + 1][j], self[i][j + 1]))
        if vertical:
            surroundingTiles.append(self[i + 1][j + 1])
    elif i >= maxtile and j == 0:
        #Top right corner
        if horizontal:
            surroundingTiles.extend((self[i - 1][j], self[i][j + 1]))
        if vertical:
            surroundingTiles.append(self[i - 1][j + 1])
    elif i == 0 and j >= maxtile:
        #Bottom left corner
        if horizontal:
            surroundingTiles.extend((self[i + 1][j], self[i][j - 1]))
        if vertical:
            surroundingTiles.append(self[i + 1][j - 1])
    elif i >= maxtile and j >= maxtile:
        #Bottom right corner
        if horizontal:
            surroundingTiles.extend((self[i - 1][j], self[i][j - 1]))
        if vertical:
            surroundingTiles.append(self[i - 1][j - 1])

    elif i == 0:
        #Top border
        if horizontal: 
            surroundingTiles.extend((self[i + 1][j], self[i][j + 1],
                                     self[i][j - 1]))
        if vertical:
            surroundingTiles.extend((self[i + 1][j + 1],
                                     self[i + 1][j - 1]))
    elif i >= maxtile:
        #Bottom border
        if horizontal:
            surroundingTiles.extend((self[i - 1][j], self[i][j + 1],
                                     self[i][j - 1]))
        if vertical:
            surroundingTiles.extend((self[i - 1][j + 1],
                                     self[i - 1][j - 1]))
    elif j == 0:
        #Left border
        if horizontal:
            surroundingTiles.extend((self[i + 1][j], self[i - 1][j],
                                     self[i][j + 1]))
        if vertical:
            surroundingTiles.extend((self[i + 1][j + 1],
                                     self[i - 1][j + 1]))
    elif j >= maxtile:
        #Right border
        if horizontal:
            surroundingTiles.extend((self[i + 1][j], self[i - 1][j],
                                     self[i][j - 1]))
        if vertical:
            surroundingTiles.extend((self[i + 1][j - 1],
                                    self[i - 1][j - 1]))

    else:
        if horizontal:
            surroundingTiles.extend((self[i + 1][j], self[i - 1][j],
                                     self[i][j + 1], self[i][j - 1]))
        if vertical:
            surroundingTiles.extend((self[i + 1][j + 1], self[i + 1][j - 1],
                                    self[i - 1][j + 1], self[i - 1][j - 1]))

    return surroundingTiles

Tags: andselfindexiftileelifverticalappend
2条回答

尝试以下操作:

# indices 0 - 3 are for horizontal, 4 - 7 are for vertical
dij = [(0, 1), (1, 0), (0, -1), (-1, 0),
       (1, 1), (1, -1), (-1, 1), (-1, -1)]

def getSurroundingTiles(self, tile, horizontal = True, vertical = True):
    index = list(self.getTiles()).index(tile)
    maxtile = self.sqrtnum - 1 # Offset for 0 indexing

    i = int(math.floor(index / self.sqrtnum))
    j = int(index % self.sqrtnum)

    surroundingTiles = []

    startat = 0 if horizontal else 4
    stopat = 8 if vertical else 4

    for di, dj in dij[startat:stopat]:
        if 0 <= i + di <= maxtile and 0 <= j + dj <= maxtile:
            surroundingTiles.append(self[i + di][j + dj])

    return surroundingTiles

(未测试)它使用单位步长相对地计算相邻索引,这样您就不必显式地键入它们。它还同时测试所有out of bounds情况。你知道吗

我假设horizontalvertical的意思是horizontally and vertically adjacentdiagonally adjacent,正如代码所示。你知道吗

把@irrelephant的观点看得更进一步(你认为这是合乎逻辑的结论或荒谬的简化):

d = (
    ( ( 0, 1), ( 1, 0), ( 0,-1), (-1, 0) ),
    ( ( 1, 1), ( 1,-1), (-1, 1), ( 1,-1) )
)

def getSurroundingTiles(self, tile, horizontal = True, vertical = True):
    index = list(self.getTiles()).index(tile)
    maxtile = self.sqrtnum - 1 # Offset for 0 indexing

    fhv = (horizontal, vertical)
    ij = ( int(math.floor(index / self.sqrtnum)),
           int(index % self.sqrtnum) )

    surroundingTiles = []
    for ihv in range(2):
        if fhv[ihv]:
            for k in range(4):
                n = [sum(p) for p in zip(ij, d[ihv][k])]
                if all([0 <= n[i] <= maxtile for i in range(2)]):
                    surroundingTiles.append(self[n[0]][n[1]])

    return surroundingTiles

请注意:此代码未经测试。你知道吗

相关问题 更多 >