如何让 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 完全相同 的路径,只是速度慢一些,这也可以做到。指出这一点,我将更新示例。
我正在用 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 完全相同 的路径,只是速度慢一些,这也可以做到。指出这一点,我将更新示例。