Как задать случайное направление для квадрата в Tkinter, Python 3 - PullRequest
2 голосов
/ 14 апреля 2019

Моя анимация 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 из animate (), мне придется сделать что-то вроде animate (dx, dy), и я попробовал это и получил ошибку.

Есть предложения? Спасибо!

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Создайте dx, dy вне анимации и используйте 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 голосов
/ 14 апреля 2019

Вы можете использовать цикл 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...