Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的程序冻结在中间,然后在完成后解冻?皮加梅_Python_Sorting_Pygame - Fatal编程技术网

Python 为什么我的程序冻结在中间,然后在完成后解冻?皮加梅

Python 为什么我的程序冻结在中间,然后在完成后解冻?皮加梅,python,sorting,pygame,Python,Sorting,Pygame,我正在尝试制作一个类似于“排序之声”的pygame程序,大约5-6秒后,它会冻结,直到排序完成。代码是: import pygame, random pygame.init() clock = pygame.time.Clock() black = (0, 0, 0) white = (255, 255, 255) x = [] ll = int(input("How big is the list you want to make? (Can't be more than your co

我正在尝试制作一个类似于“排序之声”的pygame程序,大约5-6秒后,它会冻结,直到排序完成。代码是:

import pygame, random
pygame.init()

clock = pygame.time.Clock()

black = (0, 0, 0)
white = (255, 255, 255)

x = []
ll = int(input("How big is the list you want to make? (Can't be more than your computer monitor's height: "))
for i in range(ll):
    x.append(i + 1)
random.shuffle(x)

h = pygame.display.Info().current_h
if(ll > h):
    quit()

gameDisplay = pygame.display.set_mode((ll, ll))

pygame.display.set_caption("Sort")

gameExit = False

while not gameExit:
    for event in pygame.event.get():
        if(event.type == pygame.QUIT):
            gameExit = True

    for i in range(len(x)):
        pygame.draw.rect(gameDisplay, white, [i, ll - x[i], 1, x[i]])

    n = len(x)
    for i in range(n - 1):
        small = i;
        for j in range(i + 1, n):
            if(x[small] > x[j]):
                small = j;
        temp = x[small]
        x[small] = x[i]
        x[i] = temp

        gameDisplay.fill(black)
        for i in range(len(x)):
            pygame.draw.rect(gameDisplay, white, [i, ll - x[i], 1, x[i]])

        clock.tick(60)

        pygame.display.update()

    pygame.display.update()

pygame.quit()
quit()

我不知道它为什么会冻结,也不知道它为什么要等到排序完成后才停止冻结。

您的问题是,您只是在每次while循环过程的开始检查事件循环。您将所有时间都花在排序for循环中,因此如果不想等到排序结束,您应该在排序时检查事件:

...
while not gameExit:
    # draw
    n = len(x)
    for i in range(n - 1): 
        # sort
        # draw
        for event in pygame.event.get():
            if(event.type == pygame.QUIT):
                gameExit = True

        if gameExit:
            break

        clock.tick(60)
        pygame.display.update()
...

您的问题是,您只在每个while循环过程的开始检查事件循环。您将所有时间都花在排序for循环中,因此如果不想等到排序结束,您应该在排序时检查事件:

...
while not gameExit:
    # draw
    n = len(x)
    for i in range(n - 1): 
        # sort
        # draw
        for event in pygame.event.get():
            if(event.type == pygame.QUIT):
                gameExit = True

        if gameExit:
            break

        clock.tick(60)
        pygame.display.update()
...

与您的主要问题不同的一些其他提示:
对于i,枚举(x)
中的v将允许您在不使用
范围(len(x))的情况下获得
i
x[i]
。此外,您还可以交换值
x[i],x[small]=x[small],x[i]
跳过临时变量。您可能遇到的另一个问题是,您在循环排序和循环内部绘图中都使用了
i
,因此该变量可能会弄乱与主要问题不同的一些其他提示:
用于枚举(x)中的i,v
将允许您获得
i
x[i]
而无需
范围(len(x))
。此外,您还可以交换值
x[i],x[small]=x[small],x[i]
跳过临时变量。您可能遇到的另一个问题是,您在循环排序和循环内部绘图中都使用了
i
,因此该变量可能会出错