turtle()不旋转多个球加上属性错误

turtle() does not rotate multiple balls plus attribute error

我想创建一个不同半径的圆圈,类似于太阳系。在我的尝试中,算法应该创建球 - 将它们初始化到 radius 的位置,然后同时开始旋转,在我的尝试中球不会同时开始,我怀疑这与 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',但有时它不会显示错误。尽管如此,我的主要目标是初始化不同半径的球并同时开始。

您谎称您的代码可以正常工作但存在错误 -- 您的代码根本没有 运行 并且修复遇到的前几个错误是不够的:

在这一行中:

ball.goto(raduis,y[i])

此时代码中没有定义 i 变量。这个半径范围对于每只占用大约 20 像素的海龟来说太窄了:

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

行星会重叠到难以区分的程度。不清楚这是做什么的:

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

Turtle 的 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()

输出:

Sometimes I run into an error saying that the turtle has no attribute 'dy', but sometimes it does not show the error.

您需要确保在调用它之前定义 Turtle.dy