如何在Tkinter,Python 3中为方块提供随机方向

问题描述 投票:2回答:2

我的Tkinter动画(只是一个方形移动)没有一个有序的运动。它只是做一个“随机游走”,这不是我的意图。我试图首先设置一个随机方向,但是我希望这个方块能够跟随那个随机方向,直到它撞到“墙”。但就像我说的那样,它只会随机移动。

def animate():

    dx = random.randint(-5, 5)
    dy = random.randint(-5, 5)

    if(check_crash() == 1):
        print("crash on X axis: ", canvas.coords(square))
        dx = dx * (-1)

    elif(check_crash() == 2):
        print("crash on Y axis: ", canvas.coords(square))
        dy = dy * (-1)

    canvas.move(square, dx, dy)
    root.after(50, animate)

我知道每次调用animate()时我都会生成新的随机值,这就是为什么我的动画不能正常工作的原因。但是,如果我从动画()中取出dx / dy,那么我必须做类似动画(dx,dy)之类的东西,而且我已经尝试了并且出现了错误。

有什么建议?谢谢!

python-3.x tkinter
2个回答
1
投票

在动画外创建dxdy并在动画中使用global来改变使用这个外部变量而不是本地变量。当您使用after()再次运行动画时,它将保持位置

def animate():
    global dx
    global dy

    if(check_crash() == 1):
        print("crash on X axis: ", canvas.coords(square))
        dx = dx * (-1)

    elif(check_crash() == 2):
        print("crash on Y axis: ", canvas.coords(square))
        dy = dy * (-1)

    canvas.move(square, dx, dy)
    root.after(50, animate)

dx = random.randint(-5, 5)
dy = random.randint(-5, 5)
animate()    

您可以将值作为函数的参数发送,而不是global,但您必须在after()中执行相同操作

def animate(dx, dy):

    if(check_crash() == 1):
        print("crash on X axis: ", canvas.coords(square))
        dx = dx * (-1)

    elif(check_crash() == 2):
        print("crash on Y axis: ", canvas.coords(square))
        dy = dy * (-1)

    canvas.move(square, dx, dy)
    root.after(50, animate, (dx, dy))

dx = random.randint(-5, 5)
dy = random.randint(-5, 5)
animate(dx, dy)

我不确定after()是否需要它作为元组或after(50, animate, dx, dy)


0
投票

例如,您可以使用while循环使方块在同一方向上不断“行走”,每50秒一次。

您可以通过定义随机方向然后启动循环来完成此操作。

循环运行时变量'flag'= True

循环使方形“行走”在随机生成的方向上。

每次广场“行走”时都不会重新生成方向。这是因为在循环运行之前生成随机生成的方向,因此当循环循环时,方向不会再次随机生成。

我已经对您的代码进行了更改(如下所示),以便它不再使用递归而是迭代,以便随机生成方向的代码只运行一次。

如果希望循环结束,则需要向while循环添加一个条件,将'flag'设置为False。目前,循环将永远持续下去。

注意:我将您删除的代码放入评论中,例如: #root.after(50,animate)

def animate():

    leftorright = random.randint(1,2) #1 = LEFT, 2 = RIGHT
    if leftorright = 1: #(LEFTWARDS)
        dx = random.randint(-5, -1) #A random leftwards movement of 1-5 pixels
    elif leftorright = 2: #(RIGHTWARDS)
        dx = random.randint(1, 5) #A random rightwards movement of 1-5 pixels

    upordown = random.randint(1,2) #1 = UP, 2 = DOWN
    if upordown = 1: #(UPWARDS)
        dy = random.randint(-5, -1) #A random upwards movement of 1-5 pixels
    elif leftorright = 2: #(DOWNWARDS)
        dy = random.randint(1, 5) #A random downwards movement of 1-5 pixels

    flag = True

    while flag = True:

        if(check_crash() == 1):
            print("crash on X axis: ", canvas.coords(square))
            dx = dx * (-1)

        elif(check_crash() == 2):
            print("crash on Y axis: ", canvas.coords(square))
            dy = dy * (-1)

        canvas.move(square, dx, dy)

        time.sleep(50)

    #root.after(50, animate)
© www.soinside.com 2019 - 2024. All rights reserved.