面向对象实现Python Pong游戏时球和球拍移动互相干扰问题求助
问题原因
Python中定义在类头部的属性属于类属性,所有类实例共享同一份内存值。你代码里PongObj类的position、direction都是列表类型(可变类型),任意实例修改这两个属性的值,其他所有实例的对应属性都会同步变化,所以才会出现移动一个球拍、另一个对象也同步移动的问题。
修复方法
把原本定义在类头部的属性全部移到__init__方法内部,初始化为每个实例独有的实例属性即可,修改后的PongObj类代码如下:
class PongObj: def __init__(self, _x, _y, _wid=5, _len=1, _dir=0) -> object: # 所有属性改为实例独有,不再共享 self.score = 0 self.speed = 0 self.position = [0, 0] self.direction = [0, 0] self.shape = turtle.Turtle() # 原有初始化逻辑保持不变 self.shape.speed(self.speed) self.shape.shape("square") self.shape.color("white") self.shape.shapesize(stretch_wid=_wid, stretch_len=_len) self.shape.penup() self.set_location(_x, _y) self.direction[0] = self.direction[1] = _dir # 后续所有方法代码不用修改 def set_speed(self, n_speed): self.speed = n_speed def set_location(self, _x, _y): self.position[0] = _x self.position[1] = _y self.shape.goto(self.position[0], self.position[1]) def update_coordinates(self): self.position[1] = self.shape.ycor() self.position[0] = self.shape.xcor() def object_up(self): self.position[1] += 20 self.set_location(self.position[0], self.position[1]) def object_down(self): self.position[1] -= 20 self.set_location(self.position[0], self.position[1]) def update_pos(self): self.set_location(self.position[0] + self.direction[0], self.position[1] + self.direction[1]) def border_check(self, max_height=290, max_width=380): self.update_coordinates() if self.position[1] > max_height: self.set_location(self.position[0], max_height) self.direction[1] *= -1 return False if self.position[1] < -1 * max_height: self.set_location(self.position[0], -1 * max_height) self.direction[1] *= -1 return False if self.position[0] > max_width: self.set_location(0, 0) self.direction[0] *= -1 return True if self.position[0] < -1 * max_width: self.set_location(0, 0) self.direction[0] *= -1 return True
其他代码不需要做任何修改,运行后即可实现实例独立操控。
内容的提问来源于stack exchange,提问作者Stephan Randle
相关产品推荐
相关产品推荐

