Основная проблема заключается в том, что вам необходимо очистить дисплей в каждом кадре и нарисовать весь «список» в каждом кадре.Обратите внимание, что если столбец для большого числа был нарисован в позиции, то столбец для меньшего числа не «очистит» это.
screen.fill(0)
for k, n in enumerate(numbers_to_order):
pygame.draw.rect(screen,(255,255,255),(k*(1000/len(numbers_to_order)),500-(numbers_to_order[k])*50,(1000/len(numbers_to_order)),(n)*50))
Я рекомендую не использовать вложенные циклы в игровом цикле,которые рисуют сцену.Используйте основной цикл приложения и увеличивайте управляющие переменные i
и j
в цикле:
i = 0
j = 0
while IsRunning:
# [...]
if j < len(numbers_to_order)-1:
j += 1
elif i < len(numbers_to_order)-1:
i += 1
j = 0
Далее я рекомендую использовать pygame.time.Clock()
См. Пример:
# start control variables
i = 0
j = 0
IsRunning = True
# main loop
clock = pygame.time.Clock()
while IsRunning:
# handle events
for event in pygame.event.get():
if event.type == pygame.QUIT:
IsRunning = False
if event.type == pygame.MOUSEBUTTONDOWN:
IsRunning = False
# clear screen
screen.fill(0)
# draw the entire range
for k, n in enumerate(numbers_to_order):
pygame.draw.rect(screen,(255,255,255),(k*(1000/len(numbers_to_order)),500-(numbers_to_order[k])*50,(1000/len(numbers_to_order)),(n)*50))
# update the display
pygame.display.flip()
clock.tick(10)
# sort (1 step)
print((j*(1000/len(numbers_to_order)), (numbers_to_order[j])*50))
try:
if numbers_to_order[j] > numbers_to_order[j+1]:
x = numbers_to_order[j]
numbers_to_order[j] = numbers_to_order[j+1]
numbers_to_order[j+1] = x
except(IndexError):
pass
# increment control variables
if j < len(numbers_to_order)-1:
j += 1
elif i < len(numbers_to_order)-1:
i += 1
j = 0