同时更新对象

2024-04-23 09:13:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须用python创建一个程序,其中我必须使用类使30个球在屏幕上反弹。我创建了一个名为“Ball”的类,我正在尝试创建一个Ball列表,并一次更新所有对象,这样我就可以让所有的球同时移动。在

from graphics import *
from random import *
from time import sleep

class Ball:

    def __init__(self, win):
        self.centerX, self.centerY = randrange(720), randrange(720)
        radius = randrange(5, 25)
        self.ball = Circle(Point(self.centerX, self.centerY), radius)
        colour = (randint(0,255), randint(0,255), randint(0,255))
        self.ball.setFill('cyan')
        self.ball.draw(win)


    def update(self):

        dx = 1
        dy = 1
        Point1 = 37
        Point2 = 22
        for j in range(1000):
            x = self.ball.getCenter()
            y = x.getX()
            z = x.getY()
            if y>= 720:
                Point1 *= (-1 * dx)
            if y<= 0:
                Point1 *= (-1 * dx)
            if z>= 720:
                Point2 *= (-1 * dy)
            if z<= 0:
                Point2 *= (-1 * dy)
            self.ball.move(Point1, Point2)
            print(y,z)
            sleep(0.05)


def main():
    win = GraphWin("Bouncy Many!", 720,720)
    for i in range(30):
        i = Ball(win)
        ballList.append(i)
        ballList.update()
main()

Tags: fromimportselfifdefsleepwinrandint
1条回答
网友
1楼 · 发布于 2024-04-23 09:13:22

而不是跑步自我。球。移动在函数更新内部调用1000次;可以从外部调用函数1000次。问题是:对函数update的每次调用都会运行循环1000次;当它运行时,您不能更新其他ball。我的建议是编写一个外部函数,循环遍历ball列表,更新每个球。然后它睡觉(0.05),然后再重复1000次:

class Ball:

    def __init__(self, win):
        self.centerX, self.centerY = randrange(720), randrange(720)
        radius = randrange(5, 25)
        self.ball = Circle(Point(self.centerX, self.centerY), radius)
        colour = (randint(0,255), randint(0,255), randint(0,255))
        self.ball.setFill('cyan')
        self.ball.draw(win)

        #I put Point1 and Point2 here so that they will not reset to
        #37, 22 every time you call update()
        self.Point1 = 37
        self.Point2 = 22

    def update(self):

        #Also, if you never plan to change dx, dy, you should declare them
        #inside the __init__ method as self.dx and self.dy, because they are not
        #local variables of update()
        dx = 1 
        dy = 1
        x = self.ball.getCenter()
        y = x.getX()
        z = x.getY()
        if y>= 720:
            self.Point1 *= (-1 * dx)
        if y<= 0:
            self.Point1 *= (-1 * dx)
        if z>= 720:
            self.Point2 *= (-1 * dy)
        if z<= 0:
            self.Point2 *= (-1 * dy)
        self.ball.move(self.Point1, self.Point2)
        print(y,z)

def moveAll(n):
#This updates all the balls, then sleeps(0.05)
#and does it again n times
    for i in range(n):
        for ball in ballList:
            ball.update()
        sleep(0.05)


def main():
    win = GraphWin("Bouncy Many!", 720,720)
    for i in range(30):
        i = Ball(win)
        ballList.append(i)
    moveAll(1000)


main()

相关问题 更多 >