所以,我做这个是为了练习我的Python OOP和算法技巧,在经历了几个月的S故事之后,我对它进行了一些重构。谁能在公共关系中回顾一下吗?希望看到可以修复的缺陷,考虑到从最初的开发到现在,我并没有什么改进。https://github.com/fen0s/TABSlike/特别让我担心的是,在部队周围设置一个3x3区域来检查敌人的部队.很好,你能全面理解吗?
def check_surroundings(self, y_coord, x_coord):
y_coord -= 1 #to check y level above unit
enemies = []
for _ in range(3):
if self.engine.check_inbounds(y_coord, x_coord-1) and self.engine.check_inbounds(y_coord, x_coord+2):
for entity in self.engine.techmap[y_coord][x_coord-1:x_coord+1]:
if entity and entity.team != self.team:
enemies.append(entity)
y_coord+=1
return enemies发布于 2020-05-31 21:45:40
在这里,您对y_coord和range的使用并不理想。您正在迭代一个range(3),忽略产生的数字,同时也使用y_coord作为迭代变量。
只需从一开始就遍历您想要的数字范围:
def check_surroundings(self, y_coord, x_coord):
enemies = []
for cur_y in range(y_coord - 1, y_coord + 2): # Exclusive end
if self.engine.check_inbounds(cur_y, x_coord - 1) and self.engine.check_inbounds(cur_y, x_coord + 2):
for entity in self.engine.techmap[cur_y][x_coord - 1:x_coord + 1]:
if entity and entity.team != self.team:
enemies.append(entity)
return enemies这里的主要好处是提高可读性。理想情况下,仅仅通过查看for循环,就可以很容易地判断出它的迭代目的。
for entity in self.engine.techmap[cur_y][x_coord - 1:x_coord + 1]:很明显,您正在从techmap中获取所有匹配的实体,然后对每个实体执行一些操作。
for _ in range(3):但是,在这里,您忽略了迭代变量,因此不清楚每个迭代实际上在改变什么。表面上看,你只是重复了三次相同的身体,这是很奇怪的。这需要第二步的思考才能意识到您正在使用y_coord进行迭代。
这也可以说是一个使用列表理解的好地方(尽管2D+列表理解通常倾向于一些丑陋的方面)。嵌套循环的要点是从现有集合( techmap和range返回的可迭代性)中生成一个筛选列表。这正是清单理解的用例。
def check_surroundings(self, y_coord, x_coord):
return [entity
for cur_y in range(y_coord - 1, y_coord + 2)
if self.engine.check_inbounds(y_coord, x_coord - 1) and self.engine.check_inbounds(y_coord, x_coord + 2)
for entity in self.engine.techmap[cur_y][x_coord - 1:x_coord + 1]
if entity and entity.team != self.team]您可能希望将其保存到变量中,然后返回变量。这取决于你的风格。我不能说我一定建议在这里使用理解,但我想我会证明这样的一个选项是可用的。我也会注意到,我没有测试这个,我盯着它看。不过,看起来应该是等价物。
https://codereview.stackexchange.com/questions/243147
复制相似问题