我想在pygame中做一个可视化的气泡排序,排序是有效的,但是可视化不起作用

2024-03-28 18:05:35 发布

您现在位置:Python中文网/ 问答频道 /正文

就像标题说的,我想用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()

运行时,不是正确显示排序的条形图,而是以错误的顺序显示,但排序是正确的。有什么帮助吗?你知道吗


Tags: toinimporteventforlen排序sys
1条回答
网友
1楼 · 发布于 2024-03-28 18:05:35

主要的问题是,你必须清除显示在每一帧和绘制整个“名单”在每一帧。请注意,如果在位置处绘制了一个大数字的条形图,则较小数字的条形图不会“清除”该位置。你知道吗

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

我建议不要在绘制场景的游戏循环中使用嵌套循环。使用主应用程序循环并增加循环中的控制变量ij

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

此外,我建议使用^{}

参见示例:

# 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

相关问题 更多 >