我无法让我的乌龟能够按照箭头键,任何有关如何操作的帮助将不胜感激。我确定之前已经问过这个问题,虽然我似乎无法找到它,而我找到的那些是旧版本。
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)
答案 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.onkey
或wn.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)
试运行:
答案 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")
请记住,龟实际转动需要一些时间,所以不要按键,点击它们。
我认为你可以更进一步。