почему мой квадрат (змейка) движется только по диагонали? - PullRequest
0 голосов
/ 17 июня 2020

Я кодирую 2 змейки / машины, и моя первая змейка / машина, в которых используется формат клавиатуры WASD, работает отлично. Но моя вторая змейка / машина, которая использует клавиши со стрелками, движется только по диагонали. Я хочу, чтобы обе змеи / машины двигались во всех направлениях (вверх, вниз, влево, вправо И по диагонали), но прямо сейчас вторая змея / машина движется только по диагонали.

    #initialize variables for player 1
    car1x = 250
    car1y = 300
    car1width = 20
    car1height = 20
    car1dx = 0
    car1dy = 0
    speed = 3

    #initialize variables for player 2
    car2x = 500
    car2y = 300
    car2width = 20
    car2height = 20
    car2dx = 0
    car2dy = 0
    speed = 3

    screen.fill(WHITE)

    # set main loop to True so it will run
    main = True

    # main loop
    while main:
        for event in pygame.event.get(): # check for any events (i.e key press, mouse click etc.)
            if event.type ==pygame.QUIT: # check to see if it was "x" at top right of screen
                main = False         # set the "main" variable to False to exit while loop
            if event.type ==pygame.KEYDOWN:
                if event.key == pygame.K_w:
                    car1dx = 0
                    car1dy = -speed
                elif event.key == pygame.K_s:
                    car1dx = 0
                    car1dy = speed
                elif event.key == pygame.K_a:     
                    car1dx = -speed                     
                    car1dy = 0                          
                elif event.key == pygame.K_d:
                    car1dx = speed
                    car1dy = 0


                if event.key == pygame.K_UP:
                    car2dx = 0
                    car2dy = -speed
                elif event.key == pygame.K_DOWN:
                    car2dx = 0
                    car2dy = speed
                elif event.key == pygame.K_LEFT:     
                    car2dx = -speed                     
                    car2dy = 0                          
                elif event.key == pygame.K_RIGHT:
                    car2dx = speed
                    car2dy = 0

                elif event.key == pygame.K_q:
                    pygame.quit()

            if event.type == pygame.KEYUP:
                if event.key in (pygame.K_w, pygame.K_s):
                    car1dx = 0
                elif event.key in (pygame.K_a, pygame.K_d):
                    car1dy = 0

                if event.key in (pygame.K_UP, pygame.K_DOWN):
                    car1dx = 0
                elif event.key in (pygame.K_LEFT, pygame.K_RIGHT):
                    car1dy = 0

# move the x and y positions of the player
            oldcar1x = car1x
            oldcar1y = car1y

            oldcar2x = car2x
            oldcar2y = car2y

            car1x = car1x + car1dx
            car1y = car1y + car1dy

            car2x = car2x + car2dx
            car2y = car2y + car2dx

            if car1x >= screenwidth:
                car1x = oldcar1x
                car1y = oldcar1y

            if car2x >= screenwidth:
                car2x = oldcar2x
                car2y = oldcar2y

          ``` 

Ответы [ 4 ]

1 голос
/ 17 июня 2020

В вашем последнем операторе if похоже, что события KEYUP, которые должны сбрасывать dx / dy для Car2, вместо этого устанавливают значения dx / dy для Car1. Это может быть источником вашей ошибки.

1 голос
/ 17 июня 2020

В этой строке есть опечатка:

        car2y = car2y + car2dx

Это должно быть:

        car2y = car2y + car2dy

Обратите внимание, что последний символ исправлен на y, а не x.

Хотя было бы проще использовать оператор += и записать его как:

        car2y += car2dy

У вас также есть другие ошибки в этом разделе:

    if event.type == pygame.KEYUP:
        if event.key in (pygame.K_w, pygame.K_s):
            car1dx = 0
        elif event.key in (pygame.K_a, pygame.K_d):
            car1dy = 0

        if event.key in (pygame.K_UP, pygame.K_DOWN):
            car1dx = 0
        elif event.key in (pygame.K_LEFT, pygame.K_RIGHT):
            car1dy = 0

Вы сбрасываете неправильные переменные. Вы сбрасываете dy вместо dx и наоборот, а в разделе клавиш со стрелками вы забыли изменить его на car2. Примерно так:

    if event.type == pygame.KEYUP:
        if event.key in (pygame.K_w, pygame.K_s):
            car1dy = 0
        elif event.key in (pygame.K_a, pygame.K_d):
            car1dx = 0

        elif event.key in (pygame.K_UP, pygame.K_DOWN):
            car2dy = 0
        elif event.key in (pygame.K_LEFT, pygame.K_RIGHT):
            car2dx = 0

Примечание: в приведенном выше примере я также изменил второй if на elif. Это не повлияет на правильность кода, это просто позволит избежать ненужной проверки if в случае, когда он уже соответствует указанному выше.

1 голос
/ 17 июня 2020

Я думаю, это потому, что обнаружение нажатия клавиши это if / elif и if / elif, в отличие от клавиши вниз . Или, может быть, это , потому что вы не указали обнаружение поднятия ключа для 2-й машины . Я не знаю, просто предложение. Я не могу комментировать.

Теперь я могу прокомментировать! ура

0 голосов
/ 17 июня 2020

Здесь ошибка:

            if event.type == pygame.KEYUP:
            if event.key in (pygame.K_w, pygame.K_s):
                car1dx = 0
            elif event.key in (pygame.K_a, pygame.K_d):
                car1dy = 0

            if event.key in (pygame.K_UP, pygame.K_DOWN):
                car1dx = 0
            elif event.key in (pygame.K_LEFT, pygame.K_RIGHT):
                car1dy = 0

Вы используете car1dx и car1dy вместо car2dx и car2dy:

            if event.type == pygame.KEYUP:
            if event.key in (pygame.K_w, pygame.K_s):
                car1dx = 0
            elif event.key in (pygame.K_a, pygame.K_d):
                car1dy = 0

            if event.key in (pygame.K_UP, pygame.K_DOWN):
                car2dx = 0
            elif event.key in (pygame.K_LEFT, pygame.K_RIGHT):
                car2dy = 0

Так как клавиши со стрелками предназначены для автомобиля 2

Вы также должны изменить строку:

car2y = car2y + car2dx

Это должно измениться на:

car2y += car2dy
...