问题描述
当有其他形状时,我想让黄色块跳线。另外,当黄色块接触其他块时,我怎么能让屏幕关闭。
我曾考虑使用时间模块并将 time.sleep 放在 blockself.goto(0,30)
后 1 秒,然后使块下降到 (0,0)。但是,当我这样做时,整个屏幕冻结了 1 秒钟。这意味着 time.sleep 不是针对它自己的 blockself(yellow block)。有什么办法可以解决这个问题。
from turtle import Screen,Turtle
import random
WIDTH,HEIGHT = 800,400
CURSOR_SIZE = 20
BASELINE = -CURSOR_SIZE/2
def move_block(block):
block.x -= CURSOR_SIZE/2
block.setx(block.x)
if block.x <= CURSOR_SIZE/2 - WIDTH/2:
block.x += WIDTH + CURSOR_SIZE
block.setx(block.x)
screen.update()
screen.ontimer(lambda: move_block(block),40) # delay in milliseconds
screen = Screen()
screen.title("Jump over!")
screen.setup(WIDTH,HEIGHT)
screen.tracer(False)
marker = Turtle()
marker.hideturtle()
marker.penup()
marker.goto(WIDTH/2,BASELINE)
marker.pendown()
marker.goto(-WIDTH/2,BASELINE)
#three blocks
shape1=["square","triangle","circle"]
block_1 = Turtle(shape=(random.choice(shape1)))
block_1.up()
block_1.color('black')
block_1.x = WIDTH/2 + CURSOR_SIZE # user defined property
block_1.setx(block_1.x)
shape2=["square","circle"]
block_2 = Turtle(shape=(random.choice(shape2)))
block_2.up()
block_2.color('black')
block_2.x = block_1.x + 300
block_2.setx(block_2.x)
shape3=["square","circle"]
block_3 = Turtle(shape=(random.choice(shape3)))
block_3.up()
block_3.color('black')
block_3.x = block_2.x + 300
block_3.setx(block_3.x)
move_block(block_1)
move_block(block_2)
move_block(block_3)
# self
blockself= Turtle(shape="square")
blockself.color('yellow')
blockself.setx(0)
blockself.direction="Stop"
def goup():
blockself.up()
blockself.goto(0,30)
screen.listen ()
screen.onkey ( goup,"w" )
screen.mainloop()
解决方法
我们可以使用我为水平块运动提供的相同机制,使黄色块垂直跳跃独立于其他运动,ontimer()
。下面的 jump()
方法由键盘事件调用,将黄色块作为一系列计时器事件上下移动:
from turtle import Screen,Turtle
from random import choice
SHAPES = ['square','triangle','circle']
WIDTH,HEIGHT = 800,400
CURSOR_SIZE = 20
BASELINE = -CURSOR_SIZE/2
def move_block(block):
block.x -= CURSOR_SIZE/2
block.setx(block.x)
if block.x <= CURSOR_SIZE/2 - WIDTH/2:
block.x += WIDTH + CURSOR_SIZE
block.setx(block.x)
screen.update()
if block.distance(block_self) < CURSOR_SIZE:
screen.bye()
else:
screen.ontimer(lambda: move_block(block),65) # delay in milliseconds
def jump(direction):
screen.onkey(None,'w') # disable jumping while jumping
y = block_self.ycor()
if direction > 0 and y >= 40:
direction = -1
elif direction < 0 and y <= 0:
block_self.sety(0)
direction = 0
if direction:
block_self.sety(y + direction)
screen.ontimer(lambda: jump(direction),25)
else:
screen.onkey(lambda: jump(1),'w') # jump over,reenable jumping
screen.update()
screen = Screen()
screen.title("Jump over!")
screen.setup(WIDTH,HEIGHT)
screen.tracer(False)
marker = Turtle()
marker.hideturtle()
marker.penup()
marker.goto(WIDTH/2,BASELINE)
marker.pendown()
marker.goto(-WIDTH/2,BASELINE)
block_1 = Turtle(shape=choice(SHAPES))
block_1.penup()
block_1.color('black')
block_1.x = WIDTH/2 + CURSOR_SIZE # user defined property
block_1.setx(block_1.x)
block_2 = Turtle(shape=choice(SHAPES))
block_2.penup()
block_2.color('black')
block_2.x = block_1.x + 266
block_2.setx(block_2.x)
block_3 = Turtle(shape=choice(SHAPES))
block_3.penup()
block_3.color('black')
block_3.x = block_2.x + 266
block_3.setx(block_3.x)
block_self = Turtle(shape='square')
block_self.penup()
block_self.color('yellow')
move_block(block_1)
move_block(block_2)
move_block(block_3)
screen.onkey(lambda: jump(1),'w')
screen.listen()
screen.mainloop()
另外,当黄色方块出现时,我怎样才能让屏幕关闭 接触其他块。
这似乎是对用户误算的严重反应,但我通过向 move_block()
函数添加以下条件将其放入上面的代码中:
if block.distance(block_self) < CURSOR_SIZE:
screen.bye()
最后,当您发现自己时,time.sleep()
在事件驱动的世界(如乌龟)中没有被使用的业务。