我在这里有一个python类方法的怪胎。我认为做这件事的唯一方法是一个巨大而丑陋的if/elif/else块。你们有没有想出任何想法来使这个更好?你可以漂亮吗?
对于上下文来说,这是pygame的一个网格制作库的一部分,它是一个函数,它接受网格中的一个瓦片并返回周围的瓦片。如果“水平”设置为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
读取你的代码,它看起来像'垂直'这意味着'对角线'和'水平'实际上意味着('水平'+'垂直')。是对的吗? – jimhark
http://codereview.stackexchange.com/ –