试图用乌龟从窗户墙上弹开

时间:2018-03-22 02:22:26

标签: python python-3.x turtle-graphics

该程序可以正常工作,但当它击中墙壁时,乌龟撤消是最后一步并再次尝试。但是,它会保持输入相同的前进距离和角度,使其在循环中以相同的路径移动。有没有办法阻止乌龟再次使用相同的值?

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

2 个答案:

答案 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()

请注意,您现在可以随时点击屏幕退出。使用原始代码,单击屏幕在我的系统上没有任何作用。