python Временная переменная меняется с фактической переменной; змея - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь сделать игру со змеями, используя pygame в python. переменная body содержит координаты тела, включая голову, на каждой итерации голова получает новую координату, а следующая получает предыдущее местоположение головы и так далее. функция change_angle дает ей новую координату. поэтому я попытался сохранить значение head во временной переменной prev_head, но ее значение меняется с изменением фактической переменной
, сейчас я использую одно присваивание после его исправления, я буду использовать l oop для всей длины тела

prev_head = None
body = [[30, 55], [30, 56], [30, 57]]


# initailising pygame display
gameDisplay = pygame.display.set_mode((dispaly_width, display_height))
pygame.display.set_caption('Snake Game')
clock = pygame.time.Clock()

# functions


def square(snake):
    head = snake[0]
    snake_queue = snake[1:]
    size = 10
    pygame.draw.rect(gameDisplay, green,
                     (head[0]*size, head[1]*size, size, size))

    for i in range(len(snake_queue)):
        pygame.draw.rect(gameDisplay, white,
                         (snake_queue[i][0]*size, snake_queue[i][1]*size, size, size))


def change_angle(body, cor, direction):
    body[0][cor] = body[0][cor]+(direction)

    return body


def game_loop():
    global body, prev_head
    change = (1, -1)

    while True:
        time.sleep(lvl[2])
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    if change != (0, 1):
                        change = (0, -1)
                elif event.key == pygame.K_RIGHT:
                    if change != (0, -1):
                        change = (0, 1)
                elif event.key == pygame.K_UP:
                    if change != (1, 1):
                        change = (1, -1)
                elif event.key == pygame.K_DOWN:
                    if change != (1, -1):
                        change = (1, 1)

        gameDisplay.fill(back)
        prev_head = body[0]
        body = change_angle(body, change[0], change[1])
        square(body)

        pygame.display.update()


game_loop()

1 Ответ

1 голос
/ 26 апреля 2020

Когда вы делаете

prev_head = body[0]

, тогда prev_head не является копией body[0]. prev_head и body[0] ссылаются на один и тот же объект списка.

Если вы измените содержимое body[0]

body[0][cor] = body[0][cor]+(direction)

, то, похоже, prev_head также измените, потому что body[0] и prev_head ссылаются на один и тот же объект списка.

Используйте [:] для создания поверхностной копии внутреннего списка. (См. Структуры данных ):

prev_head = body[0][:]

В качестве альтернативы вы можете скопировать внутренний список с помощью body[0].copy()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...