私はここにpythonクラスメソッドの怪物を持っています。私が考えることができる唯一の方法は、大規模で醜いif / elif / elseブロックでした。これをより良くするためのアイデアを思いつくことができますか?
文脈上、これは pygame のグリッド作成ライブラリの一部であり、グリッド内のタイルの 1 つを取り、周囲のタイルを返す関数です。"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