Skip to main content
 首页 » 编程设计

python之Pygame 球弹跳模拟中的变量赋值

2025年05月04日11luoye11

我正在尝试使用 Python 3.7.3 中的 Pygame 模块进行球弹跳模拟。我上的课展示了球,但不适用于运动。错误是“赋值前引用了局部变量 x”。我认为这意味着它是本地的但需要是全局的,但是要将球的数量作为变量(所以我可以说要生成多少)我不知道如何解决这个问题。

我试过阅读其他问题,但没有一个能解决我的问题。我能够在边界碰撞工作的情况下让一个球在屏幕上弹跳,但当我让它面向对象时却不行。我也尝试过使用 self 变量来引用每个单独的球,但这没有用。

class BallEntity(): 
    def __init__(self, radius): 
        x = random.randint(radius, win_width - radius) 
        y = random.randint(radius, win_height - radius) 
        pos = x, y 
        pygame.draw.circle(win, (248, 24, 148), pos, radius) 
        dx = random.randint(-5, 5) 
        dy = random.randint(-5, 5) 
        BallEntity.movement(self) 
 
    def movement(self): 
        if x <= r1 or x >= win_width - r1: 
            dx = -dx 
        elif x > r1 and x < win_width -r1: 
            x += dx 
 
        if y <= r1 or y >= win_height - r1: 
            dy = -dy 
        elif self.y > r1 and self.y < win_height -r1: 
            y += dy 
 
 
numbBalls = 8 
r1 = 8 
for i in range(numbBalls): 
    BallEntity.__init__(i, r1) 

我希望球在碰撞工作时打印和移动,但我却收到错误“局部变量 x 在赋值前被引用。”

请您参考如下方法:

  • global win,x,y 让我们删除未定义的 x`
  • 此外,x、y在内部类中使用,而不是全局变量指向各个圆点。

import random 
 
import pygame, sys 
import time 
from pygame.locals import * 
 
pygame.init() 
 
win_width = 500 
win_height = 400 
radius = 90 
 
win = pygame.display.set_mode((win_width, win_height), 0, 32) 
 
class BallEntity(): 
    win = None 
 
    x = 0 
    y = 0 
 
    dx = 1 
    dy = 1 
 
    radius = 0 
    # preious position(used for delete previous circle after movement) 
    prePos = 0, 0 
    pos = 0, 0 
    def __init__(self, i, radius): 
        self.radius = radius 
 
        # random position (x, y) 
        self.x = random.randint(radius, win_width - radius) 
        self.y = random.randint(radius, win_height - radius) 
 
        self.dx = random.randint(-5, 5) 
        self.dy = random.randint(-5, 5) 
 
    def movement(self): 
        global win 
 
        if self.x <= r1 or self.x >= win_width - r1: 
            self.dx = -self.dx 
        elif self.x > r1 and self.x < win_width -r1: 
            self.x += self.dx 
 
        if self.y <= r1 or self.y >= win_height - r1: 
            self.dy = -self.dy 
        elif self.y > r1 and self.y < win_height -r1: 
            self.y += self.dy 
 
        self.pos = self.x, self.y 
        # draw background color to delete previous position 
        pygame.draw.circle(win, (0, 0, 0), self.prePos, self.radius) 
        # draw circle 
        pygame.draw.circle(win, (248, 24, 148), self.pos, self.radius) 
 
        self.prePos = self.pos 
 
numbBalls = 5 
r1 = 8 
 
 
balls = [] 
 
 
 
# Create balls and store list 
for i in range(numbBalls): 
    e = BallEntity(i, r1) 
    balls.append(e) 
 
while True: 
    # update circle position via movement() 
    for i in range(numbBalls): 
        balls[i].movement() 
 
    pygame.display.update() 
    # delay for animation 
    time.sleep(0.1) 
    for event in pygame.event.get(): 
        if event.type == QUIT: 
            pygame.quit() 
            sys.exit()