Вы выполняете всю орбиту для каждой планеты, прежде чем перейти к следующей.
Вы можете создать функцию для выполнения чередования орбит:
def orbit_planets():
for t in range(1000):
mercury.orbit(50, 49.9, t)
earth.orbit(75, 74.9,t)
turtle.Screen().ontimer(orbit_planets, 100)
Вам также необходимо удалить код орбиты из функций планеты.
Кроме того, функции планеты должны вызываться только один раз, чтобы инициализировать свои позиции.
Однако вы можете поместить этот код в класс Planet
:
class Planet(turtle.Turtle):
def __init__(self, colour, a, b):
turtle.Turtle.__init__(self)
self.color(colour)
self.speed(0)
self.pu()
self.goto(a + math.sqrt(a ** 2 - b ** 2), 0)
self.pd()
self.showturtle()
self.lt(90)
...
Тогда:
mercury = Planet('blue', 50, 49.9)
earth = Planet('red', 75, 74.9)
Кроме того, класс планеты может отслеживать a
и b
(нужны лучшие имена!), И тогда функции orbit
не потребуется передача значений. Это означает, что класс Planet
управляет своими данными и поведением, суть объектно-ориентированного проектирования:
def __init__(self, a, b):
...
self.a = a
self.b = b
и
def orbit(self, t):
c = math.sqrt(self.a ** 2 - self.b ** 2)
self.goto(self.a * math.cos(t / 200) + c,
self.b * math.sin(t / 200))
Тогда функция таймера орбиты будет просто:
def orbit_planets():
for t in range(1000):
mercury.orbit(t)
earth.orbit(t)
Если пойти дальше, вы можете сохранить планеты в списке:
planets = [mercury, earth]
def orbit_planets():
for t in range(1000):
for planet in planets:
planet.orbit(t)