You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面向对象实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:48:03