Я хочу сделать визуальную сортировку пузырьков в Pygame, сортировка работает, но визуализация не - PullRequest
1 голос
/ 21 сентября 2019

, как следует из названия, я хотел создать визуализированную сортировку пузырьков с помощью python и pygame.Сортировка работает отлично, но когда дело доходит до визуализации, она никогда не получает правильного вывода.

Вот код:

import pygame
import sys
import time

pygame.init()

Vector_len = 0
x = 0
numbers_to_order = []
IsRunning = True

Vector_len = eval(input("How many numbers do you want to sort? "))

for i in range(Vector_len):
    numbers_to_order.append(0)

for i in range(len(numbers_to_order)):
    numbers_to_order[i] = eval(input("Insert number at index "+str(i+1)+": "))

print("Inserted array: "+str(numbers_to_order))

screen = pygame.display.set_mode((1000,500))

while IsRunning:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            IsRunning = False

    for i in range(len(numbers_to_order)):

        for j in range(len(numbers_to_order)):
            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
            pygame.draw.rect(screen,(255,255,255),(j*(1000/len(numbers_to_order)),500-(numbers_to_order[j])*50,(1000/len(numbers_to_order)),(numbers_to_order[j])*50))
            print((j*(1000/len(numbers_to_order)), (numbers_to_order[j])*50))
            pygame.display.flip()
            time.sleep(0.05)

print("Sorted array: "+str(numbers_to_order))
pygame.quit()
sys.exit()

При запуске вместо правильной сортировки баров ониотображается в неправильном порядке, но сортировка правильная.Любая помощь?

1 Ответ

1 голос
/ 21 сентября 2019

Основная проблема заключается в том, что вам необходимо очистить дисплей в каждом кадре и нарисовать весь «список» в каждом кадре.Обратите внимание, что если столбец для большого числа был нарисован в позиции, то столбец для меньшего числа не «очистит» это.

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
...