我这里有一个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
尝试以下操作:
(未测试)它使用单位步长相对地计算相邻索引,这样您就不必显式地键入它们。它还同时测试所有
out of bounds
情况。你知道吗我假设
horizontal
和vertical
的意思是horizontally and vertically adjacent
和diagonally adjacent
,正如代码所示。你知道吗把@irrelephant的观点看得更进一步(你认为这是合乎逻辑的结论或荒谬的简化):
请注意:此代码未经测试。你知道吗
相关问题 更多 >
编程相关推荐