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
。
我想创建一个不同半径的圆圈,类似于太阳系。在我的尝试中,算法应该创建球 - 将它们初始化到 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
。