首页 > 解决方案 > 如何创建同一类的多个对象,每个对象内部都有一个无限循环

问题描述

我尝试使用 onkey(spawn, "space") 生成球,这没关系。但是如何使用 for 循环生成它们?似乎类方法内的“while True”循环不允许在外面进行“for循环”的迭代。

from turtle import *
from random import randint

w = 100
h = 100
BallList = []

sc = Screen()
sc.tracer(0)

class Ball(Turtle):
  def __init__(self, x, y, s, c):
    Turtle.__init__(self)
    self.x = x
    self.y = y
    self.s = s
    self.c = c
    self.color(self.c)
    self.shape("circle")
    self.penup()
    self.speed(0)
    self.setheading(self.towards(randint(-100, 100), randint(-100, 100)))

  def move(self):
    self.forward(self.s)

  def bounce(self):
    if self.xcor() > w:
      self.setheading(self.towards(-w, randint(-100, 100)))
    if self.xcor() < -w:
      self.setheading(self.towards(w, randint(-100, 100)))
    if self.ycor() > h:
      self.setheading(self.towards(randint(-100, 100), -h))
    if self.ycor() < -h:
      self.setheading(self.towards(randint(-100, 100), h))

  def loop(self):
    while True:
      self.move()
      self.bounce()
      sc.update()

for i in range(10):
  BallList.append(Ball(0, 0, 10, (0, 100, 0)))
  BallList[i].loop()

标签: pythonturtle-graphics

解决方案


  1. loop删除类方法中的无限循环Ball,使其看起来像这样:
  def loop(self):
    self.move()
    self.bounce()
    sc.update()
  1. 首先创建你的球,不要尝试处理它们:
for i in range(10):
  BallList.append(Ball(0, 0, 10, (0, 100, 0)))
  1. 跟进一个无限循环来更新球:
while True:
  for i in range(10):
    BallList[i].loop()

  • loop我认为将类的方法重命名为类似的Ball东西是有意义的update,因为它不再循环任何东西
  • BallList 不是一个类,我认为将其重命名为更有意义balls(注意小写字母,不要弄乱类)

编辑:我认为sc.update()在 Ball-sloop方法中调用可能是多余的。sc.update()在重新计算所有球之后,调用那个东西可能就足够了,如下所示:

while True:
  for i in range(10):
    BallList[i].loop()
  sc.update()

推荐阅读