2013-11-19 2 views
0

Мне нужно создать программу на python, где мне нужно сделать тридцать шаров, отскакивающих вокруг экрана, используя классы. Я создал класс под названием «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() 
+0

Я думаю, что метод, который вы использовали, в порядке. – BlackMamba

+4

Итак, вот в чем вопрос. Ваша программа не работает? Вам нужен обзор кода? – Chandranshu

+0

@Chandranshu Он хочет одновременно вызвать функцию 'ballList.update()'. – BlackMamba

ответ

1

Вместо запуска self.ball.move 1000 раз ВНУТРИ функции обновления; вы можете вызвать функцию 1000 раз извне. Проблема заключается в следующем: каждый вызов обновления функции запускает цикл 1000 раз; и вы не можете обновлять другие шары во время работы. Мое предложение заключается в написании внешней функции, которая пересекает балл-лист, обновляющий каждый шар. Затем он спит (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() 
+0

Это выглядит потрясающе, но когда я пытаюсь запустить его, я получаю сообщение об ошибке «Глобальное имя» moveAll «не определено». Хотя это явно ... – spidertothefly127

+0

@ user3007613 Может быть, вы объявили функцию внутри класса Ball? – JGallo

+0

@ user3007613 Кроме того, я предполагаю, что ballList является глобальной переменной (что на самом деле не очень приятно), но в противном случае вы могли бы просто передать его moveAll в качестве другого аргумента. – JGallo

Смежные вопросы