如何使用箭头键在Python 3中移动海龟

时间:2017-04-17 10:28:15

标签: python turtle-graphics

我无法让我的乌龟能够按照箭头键,任何有关如何操作的帮助将不胜感激。我确定之前已经问过这个问题,虽然我似乎无法找到它,而我找到的那些是旧版本。

import turtle
#screen
wn=turtle.Screen()
wn.bgcolor("lightblue")

I plan on this being a spaceship game
#Turtle Player
spaceship= turtle.Turtle()
spaceship.color("red")
spaceship.penup()
speed=1
  

这是我被卡住的地方,我不知道如何让乌龟跟随   箭头键

#keyboard bindings

while True:
    spaceship.forward(speed)

3 个答案:

答案 0 :(得分:3)

避免在乌龟图形程序中使用像while True:这样的无限循环,它可以防止你的某些事件被触发。

以下是我可以提出的最小代码,以使您的太空船可导航。你应该能够建立在这个基础上:

from turtle import Turtle, Screen

wn = Screen()
wn.bgcolor('lightblue')

spaceship = Turtle()
spaceship.color('red')
spaceship.penup()

speed = 1

def travel():
    spaceship.forward(speed)
    wn.ontimer(travel, 10)

wn.onkey(lambda: spaceship.setheading(90), 'Up')
wn.onkey(lambda: spaceship.setheading(180), 'Left')
wn.onkey(lambda: spaceship.setheading(0), 'Right')
wn.onkey(lambda: spaceship.setheading(270), 'Down')

wn.listen()

travel()

wn.mainloop()

在发出键盘命令之前单击乌龟图形窗口以确保它正在侦听。此外,还有其他方法可以使用键,我在这里使用了绝对动作,但您可能需要 relative ,每次按下会逐渐修改您的方向。< / p>

答案 1 :(得分:0)

首先,我们必须了解基本知识。 为了使用户能够通过按键与乌龟进行交互,我们需要让窗口listen用于按键。由于您的屏幕名为wn,因此只需调用wn.listen()即可完成。

现在,乌龟图形正在监听按键,您将如何告诉程序通过按键进行某些操作?职能!假设您想在每次按键时创建一个新的乌龟;您将需要定义一个类似的函数(可以使用lambda作为该函数,但现在,让我们坚持使用def

def create_new_turtle():
    new_turtle = turtle.Turtle()

请记住,在定义函数时,请勿将任何positional arguments传递到括号中,因为使用函数时将无法传递参数,从而导致TypeError

现在,让我们了解如何在运行时按下键时实际调用这些函数。启动wn.listen()后,现在您需要的只是wn.onkeywn.onkeypress。使用上面的功能,如果要在用户每次按空格键时创建一个新的乌龟:

wn.onkey(create_new_turtle, 'space')

您知道为什么我们不能将位置参数传递给函数吗?如您所见,在wn.onkey中使用该函数时,我们不会将其称为(因为在函数的右侧未添加括号)wn.onkey为我们做到了。

根据我们学到的知识,让我们看看它们的作用:

import turtle

#Screen
wn = turtle.Screen()
wn.bgcolor("lightblue")

#Turtle Player
spaceship = turtle.Turtle()
spaceship.color("red")
spaceship.penup()

#Constant
speed = 1

def up():
    spaceship.setheading(90)

def down():
    spaceship.setheading(270)
    
def left():
    spaceship.setheading(180)

def right():
    spaceship.setheading(0)

wn.listen()
wn.onkey(up, 'Up')
wn.onkey(down, 'Down')
wn.onkey(left, 'Left')
wn.onkey(right, 'Right')

while True:
    spaceship.forward(speed)

您能猜到这是做什么的吗?很明显;当用户点击'Up'箭头时,将调用上面定义的up函数;当用户点击'Down'箭头时,将调用上面定义的down函数,等等。

为单个命令定义整个函数似乎不正确,我们不能只是这样做

wn.onkey(spaceship.setheading(90), 'Up')
wn.onkey(spaceship.setheading(270), 'Down')
wn.onkey(spaceship.setheading(180), 'Left')
wn.onkey(spaceship.setheading(0), 'Right')

就像最受好评的答案一样,解决方案是使用lambda,可以将上面导致错误的代码更正为

wn.onkey(lambda: spaceship.setheading(90), 'Up')
wn.onkey(lambda: spaceship.setheading(270), 'Down')
wn.onkey(lambda: spaceship.setheading(180), 'Left')
wn.onkey(lambda: spaceship.setheading(0), 'Right')

最后,如果您想让海龟每转最大转90度,可以使用函数中的180语句避免if转角。函数变得更高级,最好使用def定义函数,而不要使用lambda

import turtle

#Screen
wn = turtle.Screen()
wn.bgcolor("lightblue")

#Turtle Player
spaceship = turtle.Turtle()
spaceship.color("red")
spaceship.penup()

#Constant
speed = 1

def up():
    if spaceship.heading() != 270:
        spaceship.setheading(90)

def down():
    if spaceship.heading() != 90:
        spaceship.setheading(270)
    
def left():
    if spaceship.heading() != 0:
        spaceship.setheading(180)

def right():
    if spaceship.heading() != 180:
        spaceship.setheading(0)

wn.listen()
wn.onkey(up, 'Up')
wn.onkey(down, 'Down')
wn.onkey(left, 'Left')
wn.onkey(right, 'Right')

while True:
    spaceship.forward(speed)

试运行:

enter image description here

答案 2 :(得分:-1)

我有解决方案。代码并不理想,但它可以工作,你可以使用它。你必须要知道,乌龟的位置很苛刻,你必须调整它。这就是为什么我在设置方法中指出我的乌龟要查找。

现在,你必须记住,right(deg)left(deg)方法正在说&#34;请在给定方向上转过这么多的学位&#34;。

所以请记住,你最后的方向是什么。

此处理解的关键是,您无法在此处访问任何绝对。您只能根据当前的位置更改某些内容。所以,你不能向左转,但如果你知道以前的方向,你知道你应该把你的乌龟转到实际左转的程度。

我的工作代码是:

import turtle
wn = turtle.Screen()

last_pressed = 'up'

def setup(col, x, y, w, s, shape):
  turtle.up()
  turtle.goto(x,y)
  turtle.width(w)
  turtle.turtlesize(s)
  turtle.color(col)
  turtle.shape(shape)
  turtle.lt(90)
  turtle.down()
  wn.onkey(up, "Up")
  wn.onkey(left, "Left")
  wn.onkey(right, "Right")
  wn.onkey(back, "Down")
  wn.onkey(quitTurtles, "Escape")
  wn.listen()
  wn.mainloop()




#Event handlers
def up():
  global last_pressed
  if last_pressed == 'left':
    turtle.rt(90)
    turtle.fd(10)
  elif last_pressed == 'right':
    turtle.lt(90)
    turtle.fd(10)
  elif last_pressed == 'up':
    turtle.fd(10)
  else:
    turtle.rt(180)
    turtle.fd(10)

  last_pressed = 'up'

def left():
  global last_pressed
  if last_pressed == 'left':
    turtle.fd(10)
  elif last_pressed == 'right':
    turtle.lt(180)
    turtle.fd(10)
  elif last_pressed == 'up':
    turtle.lt(90)
    turtle.fd(10)
  else:
    turtle.rt(90)
    turtle.fd(10)

  last_pressed = 'left'


def right():
  global last_pressed
  if last_pressed == 'left':
    turtle.rt(180)
    turtle.fd(10)
  elif last_pressed == 'right':
    turtle.fd(10)
  elif last_pressed == 'up':
    turtle.rt(90)
    turtle.fd(10)
  else:
    turtle.lt(90)
    turtle.fd(10)

  last_pressed = 'right'

def back():
  global last_pressed
  if last_pressed == 'left':
    turtle.lt(90)
    turtle.fd(10)
  elif last_pressed == 'right':
    turtle.rt(90)
    turtle.fd(10)
  elif last_pressed == 'up':
    turtle.rt(180)
    turtle.fd(10)
  else:
    turtle.fd(10)

  last_pressed = 'down'

def quitTurtles():
  wn.bye()

setup("blue",-200,200,2,2,"turtle")

请记住,龟实际转动需要一些时间,所以不要按键,点击它们。

我认为你可以更进一步。