除了一些小细节需要改变之外,你几乎是对的。全局变量state_num
决定在advance_state_machine()
如果乌龟应该移动或不移动,则函数。您已经获得了正确的转弯逻辑,那么为什么不对移动/暂停应用相同的逻辑呢?
在您的原始代码中,您只是将每个显示的帧的全局变量值从一种状态切换到另一种状态,并使用 SPACE 键启动另一个实例advance_state_machine()
是什么让乌龟跑得更快。海龟变得更快,因为每个 SPACE 都会执行进一步的循环advance_state_machine()
开始与现有的并行运行。
在函数下面的代码中movementControl()
改变布尔值should_move
到空间上的相反的一个advance_state_machine()
评估should_move
让乌龟移动或停止:
import turtle
turtle.setup(400,500)
wn = turtle.Screen()
wn.title("Tess moves in space")
wn.bgcolor("lightgreen")
tess = turtle.Turtle()
def leftTurtle():
tess.left(90)
def rightTurtle():
tess.right(90)
should_move = False
def movementControl():
global should_move
should_move = not should_move
def advance_state_machine():
global should_move
if should_move:
tess.pendown()
tess.forward(2)
else:
tess.penup()
wn.ontimer(advance_state_machine, 25)
def exitWindow():
wn.bye()
wn.onkey(movementControl, "space")
wn.onkey(exitWindow, "q")
wn.onkey(leftTurtle, "Left")
wn.onkey(rightTurtle, "Right")
wn.listen()
advance_state_machine()
wn.mainloop()
哇!!!和cdlane's
帮助我们将一个非常好的基本海龟示例放在一起。
现在我已经将 HIS 代码修改为简约版本,并且也摆脱了 movingControl() 函数。
我个人不喜欢使用from turtle import *
一种 import 语句,因为它们提供了大量可用的方法和变量,这些方法和变量是“不可见的”,因为您无法直接看到它们来自哪里,但是......将所有代码放在如此短的块中并不值得它?
from turtle import *
setup(400, 500); title('Turtle moves in space')
bgcolor('lightgreen'); up()
def advance_state_machine():
if isdown(): fd(2)
ontimer(advance_state_machine, 25)
onkey(lambda: (pd, pu)[isdown()](), 'space')
onkey(bye, 'q')
onkey(lambda: lt(90), 'Left')
onkey(lambda: rt(90), 'Right')
listen(); advance_state_machine(); done()