Проблема вызвана тем, что y_change
остается на 30
во время последующей обработки.
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
x_change = 0
if event.key == pygame.K_RIGHT:
x_change = 0
if event.key == pygame.K_UP:
y_change = 30 # <=== HERE
Таким образом, когда происходит событие, y_change
становится равным 30 - поэтому позиция перемещается обратно вниз.Но в следующем цикле y_change
равно по-прежнему 30, поэтому он продолжает двигаться вниз, снова и снова.