微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

当有其他形状时,我想让黄色块跳线。另外,当黄色块接触其他块时,我怎么能让屏幕关闭

我曾考虑使用时间模块并将 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() 在事件驱动的世界(如乌龟)中没有被使用的业务。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。