如何实现Rocket类的shot方法遍历检查类中所有实例对象?
解决Rocket类shot方法遍历所有实例的问题
嘿,我来帮你调整这个Rocket类的shot方法,让它能检查所有同类型的实例!
首先,你原来的代码里shot方法直接用了未定义的other变量,这肯定跑不起来。要实现遍历所有其他Rocket实例的逻辑,我们需要让类自己跟踪所有创建出来的实例。这里有个完整的修改方案:
修改后的完整代码
class Rocket: # 类级别的列表,用来存储所有创建的Rocket实例 instances = [] def __init__(self): self.x = 0 self.y = 0 # 每次创建新实例时,自动把它加入到实例列表中 Rocket.instances.append(self) def move(self, x1, y1): self.x += x1 self.y += y1 def get_position(self): return (self.x, self.y) def shot(self): # 复制一份实例列表来遍历,避免遍历过程中修改原列表引发异常 for other in list(Rocket.instances): if other is self: continue # 跳过当前调用shot的实例自己 # 第一步:判断x坐标是否相等 if self.x == other.x: # 第二步:检查击中条件 if self.y + 20 > other.y: # 从实例列表中移除两个对象(必须先移除再删除,否则列表会残留无效引用) Rocket.instances.remove(self) Rocket.instances.remove(other) # 删除实例引用 del self del other # 击中后立刻停止遍历,不再检查其他实例 return else: # 没击中当前目标,就把自己的y坐标加20 self.y += 20 # 继续检查下一个实例
关键逻辑说明
- 类属性跟踪实例:用
Rocket.instances这个类级别的列表来保存所有创建的Rocket实例,这样任何一个实例的shot方法都能访问到所有同类实例。 - 安全遍历列表:遍历的时候用
list(Rocket.instances)复制一份列表,因为如果直接遍历原列表,在删除元素时会导致遍历的索引混乱,引发错误。 - 跳过自身:用
if other is self: continue避免检查当前调用shot的实例和自己的碰撞。 - 击中即停止:一旦找到满足条件的目标,处理完删除操作后就
return,停止继续遍历其他实例,完全符合你描述的需求。 - 实例清理:先把两个实例从
instances列表中移除,再删除引用,这样后续其他操作就不会访问到已经被销毁的实例了。
你可以测试一下:比如创建r1、r2、r3三个实例,调整它们的坐标让r1和r2的x相等,且r1.y+20 > r2.y,调用r1.shot()后,r1和r2会被删除,r3会保留下来。
内容的提问来源于stack exchange,提问作者beaten
相关产品推荐
相关产品推荐

