海龟中移动物体的问题

问题描述 投票:0回答:1

这是我的代码:

import turtle as trtl
trtl.hideturtle()
trtl.speed(5)
trtl.tracer(False)
# stop functions
def stopf():
  f.clear()
  f.append("x")
  
def stopb():
  b.clear()
  b.append("x")

def stopd():
  d.clear()
  d.append("x")
  
def stopu():
  u.clear()
  u.append("x")
  
# empty lists for movement
f = ["x"]
b = ["x"]
u = ["x"]
d = ["x"]
# movement functions

def forward():
  for x in f:
    trtl.clear()
    trtl.circle(10)
    trtl.update()
    trtl.penup()
    trtl.forward(0.05)
    trtl.pendown()
    f.append("x")
    
def backward():
  for x in b:
    trtl.clear()
    trtl.circle(10)
    trtl.update()
    trtl.penup()
    trtl.forward(-0.05)
    trtl.pendown()
    b.append("x")
    
def downward():
  for x in d:
    trtl.clear()
    trtl.circle(10)
    trtl.update()
    trtl.penup()
    trtl.setheading(90)
    trtl.forward(-0.05)
    trtl.pendown()
    d.append("x")
    trtl.setheading(0)

def upward():
  for x in u:
    trtl.clear()
    trtl.circle(10)
    trtl.update()
    trtl.penup()
    trtl.setheading(-90)
    trtl.forward(-0.05)
    trtl.pendown()
    u.append("x")
    trtl.setheading(0)

# press and release key tests
trtl.onkeypress(forward, "Right")
trtl.onkeypress(backward, "Left")
trtl.onkeypress(downward, "Down")
trtl.onkeypress(upward, "Up")
trtl.onkey(stopf, "Right")
trtl.onkey(stopb, "Left")
trtl.onkey(stopd, "Down")
trtl.onkey(stopu, "Up")

  


wn = trtl.Screen()
wn.listen()
wn.mainloop()

(忽略我使用比turtle.shape(“circle”)更复杂的方法来绘制圆。) 不管出于什么原因,当我按住一个方向太久时,它就会永远沿着那个方向前进。有谁知道为什么会这样吗?

它只是响应方向键而正常移动,而不是按住太久后继续移动。

python turtle-graphics python-turtle
1个回答
0
投票

问题在于列表的使用。让我们看看当你按下前进按钮时。

前进

trtl.onkeypress(forward, "Right")
调用函数
forward
。对于循环,我们看到
f = ["x"]
已被初始化,因此循环开始:

for x in f:
    ...
    f.append("x")

通过将

"x"
添加到
f
,可以使循环永远持续下去。

停止向前按

现在,

trtl.onkey(stopf, "Right")
致电
stopf
。反过来,
stopf
会清除并立即将
"x"
添加到
f

此方法可能会在短时间内起作用,因为清除列表会停止循环。然而,按住并释放按键会破坏程序的原因是,在

"x"
中添加
stopf
很可能会允许继续向前循环。

这适用于所有方向。您应该使用布尔标志来存储是否按下了某个键,而不是使用列表。

© www.soinside.com 2019 - 2024. All rights reserved.