如何用乌龟让物体反弹回来

How to make the object bounce back with turtle

我想让黄色方块在有其他形状的时候在线上跳跃。另外,黄色方块接触到其他方块时,如何关闭屏幕。

我已经考虑过使用时间模块并在 blockself.goto(0,30) 之后放置 time.sleep 1 秒,然后使块下降到 (0,0)。但是,当我这样做时,整个屏幕冻结了 1 秒钟。这意味着 time.sleep 不是针对它自己的块自身(黄色块)。有什么办法可以解决这个问题吗?

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","triangle","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","triangle","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()

Also, how could I make the screen to close when the yellow block touches the other blocks.

这似乎是对用户误算的严重回应,但我通过在 move_block() 函数中添加以下条件来将其放在上面的代码中:

if block.distance(block_self) < CURSOR_SIZE:
        screen.bye()

最后,当您发现自己时,time.sleep() 不适合在像 turtle 这样的事件驱动世界中使用。