通过从存储的海龟图形函数列表中随机选择来创建随机路径
Create random-path by randomly choosing from lists of stored turtle-graphics functions
我已将海龟图形函数存储在列表中,并使用随机函数调用它来创建随机路径,但是代码不起作用。
有人可以看看这个并提供建议吗。
from turtle import Turtle
from turtle import Screen
import random
pen = Turtle()
pen.pensize(8)
pen.speed(10)
window = Screen()
window.colormode(255)
moves=[pen.forward(30),pen.backward(30)]
turns=[pen.right(90),pen.left(90)]
is_true = True
while is_true:
pen.color(random.randint(0,255),random.randint(0,255),random.randint(0,255))
random.choice(turns)
random.choice(moves)
window.exitonclick()
只有当你定义了这两个列表时,你才执行这些方法。像这样更改代码的相关部分
moves=[pen.forward, pen.backward]
turns=[pen.right, pen.left]
while True:
pen.color(random.randint(0,255), random.randint(0,255), random.randint(0,255))
random.choice(turns)(90)
random.choice(moves)(30)
第一个问题是您没有在列表 moves
和 turns
中列出函数调用,而是列出调用的结果。第二个问题是您不在 random.choice
调用之后调用函数。您实际上从中得到的是可见笔尖的闪烁效果,它会不断改变颜色。
在 buran 的回答中已经显示了修复它的方法。将 turn 和 move 参数保持在循环之外的另一种方法如下,这里 lambda :
将函数调用转换为匿名函数,其引用存储在 moves
和 turns
中:
另一种选择是提取实际移动并转换为函数
from turtle import Turtle
from turtle import Screen
import random
pen = Turtle()
pen.pensize(8)
pen.speed(10)
window = Screen()
window.colormode(255)
moves=[lambda : pen.forward(30), lambda : pen.backward(30)]
turns=[lambda : pen.right(90), lambda : pen.left(90)]
for _ in range(100):
pen.color(random.randint(0,255),random.randint(0,255),random.randint(0,255))
random.choice(turns)()
random.choice(moves)()
window.exitonclick()
我决定只画 10 条线,所以乌龟很可能会留在屏幕上。为了更好地摆脱 while True
循环(包括解释),请参阅 cdlane 的回答!
我想说这里的问题是您使用 functions 作为数据,而您可以简单地使用 data 作为数据。也就是说,给 forward()
一个负距离与 backward()
是一样的。给 left()
一个负角与 right()
相同。所以我们可以简单地做:
from turtle import Screen, Turtle
from random import random, choice
DISTANCES = [30, -30]
ANGLES = [90, -90]
def move():
turtle.color(random(), random(), random())
turtle.left(choice(ANGLES))
turtle.forward(choice(DISTANCES))
screen.ontimer(move, 10)
screen = Screen()
turtle = Turtle()
turtle.pensize(8)
turtle.speed('fastest')
move()
screen.exitonclick()
我还处理了下一个问题,你的隐含 while True:
。您构建代码的方式, exitonclick()
永远不会达到并且不起作用。现在它可以工作了,因为我们在事件循环中同时保留了绘图和 exitonclick()
。
我已将海龟图形函数存储在列表中,并使用随机函数调用它来创建随机路径,但是代码不起作用。
有人可以看看这个并提供建议吗。
from turtle import Turtle
from turtle import Screen
import random
pen = Turtle()
pen.pensize(8)
pen.speed(10)
window = Screen()
window.colormode(255)
moves=[pen.forward(30),pen.backward(30)]
turns=[pen.right(90),pen.left(90)]
is_true = True
while is_true:
pen.color(random.randint(0,255),random.randint(0,255),random.randint(0,255))
random.choice(turns)
random.choice(moves)
window.exitonclick()
只有当你定义了这两个列表时,你才执行这些方法。像这样更改代码的相关部分
moves=[pen.forward, pen.backward]
turns=[pen.right, pen.left]
while True:
pen.color(random.randint(0,255), random.randint(0,255), random.randint(0,255))
random.choice(turns)(90)
random.choice(moves)(30)
第一个问题是您没有在列表 moves
和 turns
中列出函数调用,而是列出调用的结果。第二个问题是您不在 random.choice
调用之后调用函数。您实际上从中得到的是可见笔尖的闪烁效果,它会不断改变颜色。
在 buran 的回答中已经显示了修复它的方法。将 turn 和 move 参数保持在循环之外的另一种方法如下,这里 lambda :
将函数调用转换为匿名函数,其引用存储在 moves
和 turns
中:
另一种选择是提取实际移动并转换为函数
from turtle import Turtle
from turtle import Screen
import random
pen = Turtle()
pen.pensize(8)
pen.speed(10)
window = Screen()
window.colormode(255)
moves=[lambda : pen.forward(30), lambda : pen.backward(30)]
turns=[lambda : pen.right(90), lambda : pen.left(90)]
for _ in range(100):
pen.color(random.randint(0,255),random.randint(0,255),random.randint(0,255))
random.choice(turns)()
random.choice(moves)()
window.exitonclick()
我决定只画 10 条线,所以乌龟很可能会留在屏幕上。为了更好地摆脱 while True
循环(包括解释),请参阅 cdlane 的回答!
我想说这里的问题是您使用 functions 作为数据,而您可以简单地使用 data 作为数据。也就是说,给 forward()
一个负距离与 backward()
是一样的。给 left()
一个负角与 right()
相同。所以我们可以简单地做:
from turtle import Screen, Turtle
from random import random, choice
DISTANCES = [30, -30]
ANGLES = [90, -90]
def move():
turtle.color(random(), random(), random())
turtle.left(choice(ANGLES))
turtle.forward(choice(DISTANCES))
screen.ontimer(move, 10)
screen = Screen()
turtle = Turtle()
turtle.pensize(8)
turtle.speed('fastest')
move()
screen.exitonclick()
我还处理了下一个问题,你的隐含 while True:
。您构建代码的方式, exitonclick()
永远不会达到并且不起作用。现在它可以工作了,因为我们在事件循环中同时保留了绘图和 exitonclick()
。