如何让 Python 乌龟停止追赶它正在跟随的乌龟?

How to get Python turtle to stop trying to catch up the turtle it's following?

我正在用 Python 在 Turtle 中制作游戏,其中一只 Turtle(称为 Lewi)跟随另一只(称为 Ella)。目前,游戏的目标是让比 Lewi 稍慢的 Ella 跟随 Lewi。 Lewi 根据箭头键的按下移动。

Ella 确实跟着 Lewi,但问题是,如果在 Ella 到达 Lewi 的位置之前按 'right' 键两次或更多次,然后让她追上他的位置,然后她将开始回到她之前未能赶上 Lewi 的所有位置,然后继续回到她错过的 Lewi 的所有位置。

Ella 不应该原路返回,那么我该如何解决这个问题呢?这是代码:

import turtle

image = "C:/Python27/Pythonprogramming/image.gif"
screenr = turtle.Screen()

Lewi = turtle.Turtle()
Ella = turtle.Turtle()

screenr.addshape(image)
Lewi.shape(image)

screenr.bgpic("winXP.gif")
screenr.setup(1279, 815)



Lewi.penup()
speed = 50

def up():
    Lewi.sety(Lewi.ycor()+speed)
    Ella.speed(1)
    Ella.goto(Lewi.pos())
    if Ella.pos() == Lewi.pos():
        print("loo")

def down():
    Lewi.sety(Lewi.ycor()-speed)
    Ella.speed(1)   
    Ella.goto(Lewi.pos())   
    if Ella.pos() == Lewi.pos():
        print("loo")

def left():
    Lewi.forward(-speed)
    Ella.speed(1)
    Ella.goto(Lewi.pos())
    if Ella.pos() == Lewi.pos():
        print("loo")

def right():
    Lewi.forward(speed)
    Ella.speed(1)
    Ella.goto(Lewi.pos())
    if Ella.pos() == Lewi.pos():
        print("loo")



screenr.onkey(up, "Up")
screenr.onkey(down, "Down")
screenr.onkey(right, "Right")
screenr.onkey(left, "Left")
screenr.listen()

turtle.mainloop()

我认为问题在于 Ella 的动议依赖于 Lewi。如果我们让她独立,运行关注计时器事件,那么她可以对 Lewi 的动作做出反应并更自然地追逐他。此外,由于您将快速重复地敲击动作键,因此我更改了它们的处理程序以在处理当前点击时阻止点击。我还更改了处理程序以设置标题然后向前移动:

from turtle import Turtle, Screen

screen = Screen()

Lewi = Turtle(shape="turtle")
Lewi.color("red")
Lewi.penup()

Ella = Turtle(shape="turtle")
Ella.color("green")
Ella.speed("slowest")

screen.setup(1279, 815)

speed = 20

def up():
    screen.onkey(None, "Up")
    Lewi.setheading(90)
    Lewi.forward(speed)
    screen.onkey(up, "Up")

def down():
    screen.onkey(None, "Down")
    Lewi.setheading(270)
    Lewi.forward(speed)
    screen.onkey(down, "Down")

def left():
    screen.onkey(None, "Left")
    Lewi.setheading(180)
    Lewi.forward(speed)
    screen.onkey(left, "Left")

def right():
    screen.onkey(None, "Right")
    Lewi.setheading(0)
    Lewi.forward(speed)
    screen.onkey(right, "Right")

def move_Ella():
    if Ella.pos() != Lewi.pos():
        Ella.setheading(Ella.towards(Lewi))
        Ella.forward(speed)
    screen.ontimer(move_Ella, 200)

screen.onkey(up, "Up")
screen.onkey(down, "Down")
screen.onkey(right, "Right")
screen.onkey(left, "Left")

screen.listen()

screen.ontimer(move_Ella, 200)

screen.mainloop()

我删除了您的图片信息,因此任何人都可以 运行 使用此示例 -- 您可以轻松地将图片放回代码中。

如果您希望 Ella 遵循与 Lewi 完全相同 的路径,只是速度慢一些,这也可以做到。指出这一点,我将更新示例。