【问题标题】:How to get Python turtle to stop trying to catch up the turtle it's following?如何让 Python 乌龟停止追赶它跟随的乌龟?
【发布时间】:2016-11-10 15:43:52
【问题描述】:

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

Ella 确实跟着 Lewi,但问题是,如果你在 Ella 到达 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()

【问题讨论】:

    标签: python move turtle-graphics


    【解决方案1】:

    我认为问题在于 Ella 的动作依赖于 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 完全相同的路径,只是速度较慢,也可以这样做。指出这一点,我将更新示例。

    【讨论】:

    • 我的 ella 总是从我身边经过,呵呵。
    • 我一直在努力解决一些错误。例如,Ella 永远不可能与 Lewi 在同一个坐标上,因为她指向一个角度朝他走去,但以相同的“速度”移动。但是,这可以通过矢量公式来解决。真正的问题是,Lewi 的移动不像原始代码那样流畅,也就是说,如果这是在游戏中,那么玩起来会非常令人沮丧。不过,它似乎确实是最好的解决方案,所以我会在找到解决方案时进行更新。如果您找到解决方案,请也告诉我。顺便说一句,谢谢。
    • 不,没关系,只是想通了!你需要在代码的开头有这个Lewi.speed(0)(最好在定义Lewi之后)。在这种情况下,“速度”是一个函数( speed() ),不应与变量“速度”混淆。
    • @Izakthecoder,一些速度值也有名称。你可以写Lewi.speed("fastest"),而不是Lewi.speed(0)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多