turtle() не вращает несколько шаров плюс ошибка атрибута

Я хотел бы создать шары, идущие по кругу с разными радиусами, как в солнечной системе. В моей попытке алгоритм должен создавать шары - инициализировать их в местоположениях радиуса, а затем начать вращаться в то же время, в моей попытке шары не запускаются одновременно, я подозреваю, что это как-то связано сfor петля.

import turtle, numpy as np 

a = np.linspace(0,2*np.pi,100)
balls = []
ball_colour = ['orange','blue','brown','black','red','pink','yellow']
ball_shape =['circle', 'square','triangle'] 

for _ in range(3):
    balls.append(turtle.Turtle())
    
for ball in balls:    
    raduis = np.random.randint(0,8)
    x = raduis*np.cos(a)
    y = raduis*np.sin(a)
    
    ball.shape(ball_shape[np.random.randint(0, 3)])
    ball.color(ball_colour[np.random.randint(0,(len(ball_colour)-1))] )
    ball.goto(raduis,y[i])
    ball.dy =0.001
    ball.dx = 0.001    
    ball.speed(np.random.randint(15))

for ball in balls:
    for i in range(100):
        ball.sety(ball.ycor()+raduis*np.sin(a)[i] +ball.dy)
        ball.setx(ball.xcor()+raduis*np.cos(a)[i]+ ball.dy)

    

Стоит отметить, что иногда я сталкиваюсь с ошибкой, говоря, что черепаха не имеет атрибута dy, но иногда она не отображает ошибку. Тем не менее, моя главная цель - инициализировать шары с разным радиусом и запускать их одновременно.

2 ответа

Решение

Вы искажаете свой код как работающий, но с ошибками - ваш код вообще не запускается, и исправления первых нескольких обнаруженных ошибок недостаточно:

В этой строке:

ball.goto(raduis,y[i])

Нет никаких iпеременная, определенная на этом этапе кода. Этот диапазон радиусов слишком узок для черепах, каждая из которых занимает около 20 пикселей:

raduis = np.random.randint(0,8)

Планеты будут перекрываться до такой степени, что их будет трудно отличить друг от друга. Непонятно, что это делает:

ball.speed(np.random.randint(15))

Черепахи speed()работает только в диапазоне от 0 до 10, а не 15. И это не повлияет на вашу анимацию. Это самое странное из всех:

raduis*np.sin(a)[i]

Снова и снова в вашем цикле у вас есть numpy преобразование всего массива углов в их синусы, а затем использовать только один из них - вы могли бы выбрать один из них и взять его синус. Ваш код обычно показывает непонимание операций с массивами numpy и мог бы быть написан без него. Наконец, этот расчет движения является подделкой:

ball.sety(ball.ycor()+raduis*np.sin(a)[i] +ball.dy)

Мы движемся по кругу в зависимости от радиуса и угла, поэтому ball.ycor() а также ball.dy здесь нечего делать.

Вот моя переработка вашего кода, чтобы три объекта вращались вокруг центра.

from turtle import Screen, Turtle
from random import choice
from numpy import linspace, pi, cos, sin

angles = linspace(0, pi*2, 100)
sines, cosines = sin(angles), cos(angles)

ball_colours = ['orange', 'blue', 'brown', 'black', 'red', 'pink', 'yellow']
ball_shapes = ['circle', 'square', 'triangle']

screen = Screen()

balls = []

for radius in range(40, 160, 40):
    x = radius * cosines[0]
    y = radius * sines[0]

    ball = Turtle()
    ball.shape(choice(ball_shapes))
    ball.color(choice(ball_colours))
    ball.penup()
    ball.goto(x, y)
    ball.pendown()

    ball.radius = radius

    balls.append(ball)

for i in range(1, len(angles)):
    for ball in balls:
        ball.goto(ball.radius * cosines[i], ball.radius * sines[i])

screen.mainloop()

Чего не хватает, так это того, чтобы объекты двигались с разной скоростью - я оставляю это вам в качестве упражнения:

Вы также можете использовать встроенный метод из turtle чтобы нарисовать круги:

from turtle import Screen, Turtle
from random import choice

ball_colours = ['orange', 'blue', 'brown', 'black', 'red', 'pink', 'yellow']
ball_shapes = ['circle', 'square', 'triangle']

balls = []

for radius in range(40, 160, 40):
    ball = Turtle()
    ball.shape(choice(ball_shapes))
    ball.color(choice(ball_colours))
    ball.radius = radius
    ball.speed(0)
    ball.penup()
    ball.goto(0,-radius)
    ball.pendown()
    balls.append(ball)
    
for a in range(360):
    for ball in balls:
        ball.circle(ball.radius,1)

screen.mainloop()

Выход:

Иногда я сталкиваюсь с ошибкой, говоря, что черепаха не имеет атрибута "dy", но иногда она не показывает ошибку.

Вам нужно убедиться, что вы определили Turtle.dy прежде чем позвонить.

Другие вопросы по тегам