该程序可以正常工作,但当它击中墙壁时,乌龟撤消是最后一步并再次尝试。但是,它会保持输入相同的前进距离和角度,使其在循环中以相同的路径移动。有没有办法阻止乌龟再次使用相同的值?
from turtle import Turtle, Screen
import random
def createTurtle(color, width):
tempName = Turtle("arrow")
tempName.speed("fastest")
tempName.color(color)
tempName.width(width)
return tempName
def inScreen(screen, turt):
x = screen.window_width() / 2
y = screen.window_height() / 2
turtleX, turtleY = turt.pos()
if not (-x < turtleX < x) and (-y < turtleY < y):
return False
return True
def moveTurtle(screen, turt):
while True:
while inScreen(screen, turt):
turt.fd(random.randrange(100))
turt.left(random.randrange(360))
if (inScreen(screen, turt) == False):
turt.undo()
continue
wn = Screen()
alpha = createTurtle("red", 3)
moveTurtle(wn, alpha)
wn.exitonclick()
答案 0 :(得分:1)
我不认为它继续沿着同一条路走。我尝试运行你的代码,它不断给乌龟一个新的前进量和轮换。如果你等待足够长的时间,它最终会从那个位置移开。
它似乎没有在现场移动的原因是它一直试图进入一个新的位置,但它很有可能选择一个随机值,使乌龟再次进入屏幕边界。 / p>
如果它越过边界,我可能会将海龟引导到边界的相反角度方向,因为现在它只是重复选择随机值。
答案 1 :(得分:1)
我的信念是你的代码存在问题:
while inScreen(screen, turt):
turt.fd(random.randrange(100))
turt.left(random.randrange(360))
if (inScreen(screen, turt) == False):
turt.undo()
当您调用undo()
时,您只是撤消发生的最后一件事,因此您要撤消left()
而不是fd()
(转发)。如果出现错误,您将继续越走越远,需要更长时间才能回来。如果我们撤消两个操作(两个undo()
调用),或者反转操作顺序而只撤消前进,那么随机运动将更快地纠正自己。无需调整标题。
以下是修复上述内容的代码修改,并消除了不属于事件驱动程序的while True:
逻辑,并使exitonclick()
无法正常工作:
from turtle import Turtle, Screen
import random
def createTurtle(color, width):
turtle = Turtle('arrow')
turtle.speed('fastest')
turtle.color(color)
turtle.width(width)
return turtle
def inScreen(screen, turtle):
x = screen.window_width() / 2
y = screen.window_height() / 2
turtleX, turtleY = turtle.pos()
return (-x < turtleX < x) and (-y < turtleY < y)
def moveTurtle():
turtle.left(random.randrange(360))
turtle.forward(random.randrange(100))
if not inScreen(screen, turtle):
turtle.undo() # undo forward()
screen.ontimer(moveTurtle, 50)
screen = Screen()
turtle = createTurtle('red', 3)
moveTurtle()
screen.exitonclick()
请注意,您现在可以随时点击屏幕退出。使用原始代码,单击屏幕在我的系统上没有任何作用。