2017-07-02 2 views
0

Ce programme se bloque en quelque sorte après une exécution de quelques secondes. Est-ce que quelqu'un peut m'aider? C'est un programme de visualisation d'algorithmes de tri. Je suis désolé si je fais beaucoup de choses mal mais j'ai juste commencé à utiliser pygame et je ne suis toujours pas complètement sûr de la façon dont tout fonctionne. Merci pour votre aide!pygame continue à se bloquer après avoir fonctionné pendant un certain temps

import random 
import time 
import pygame 

pygame.init() 

display_width=1200 
display_height=800 

gamedisplay=pygame.display.set_mode((display_width,display_height)) 
clock=pygame.time.Clock() 

correct=[] 
shuffled=[] 
for i in range(100): 
    correct.append(i+1) 
    shuffled.append(i+1) 
random.shuffle(shuffled) 

block_width=display_width/(len(shuffled)) 

def bar(block_width,shuffled): 
    for i in shuffled: 
     colour=(i,i,255) 
     pygame.draw.rect(gamedisplay, colour, 
[shuffled.index(i)+shuffled.index(i)*block_width,750,block_width,-i-i*2.5]) 

def inserting(shuffled): 
    a=0 
    for i in range(len(shuffled)): 
     x=a 
     while shuffled[x]>shuffled[x+1] or x+1==len(shuffled): 
      change=shuffled[x] 
      shuffled.remove(shuffled[x]) 
      shuffled.insert(x+1,change) 
     if a+1!=len(shuffled)-1: 
      a=a+1 
     else: 
      a=0 
    return shuffled 

def Loop(block_width,shuffled,correct): 
    FPS=10 
    while shuffled!=correct: 
     shuffled=inserting(shuffled) 
     bar(block_width,shuffled) 
     pygame.display.update() 
     time.sleep(1/FPS) 
    bar(block_width,shuffled) 
    pygame.display.update() 
    print(shuffled) 

Loop(block_width,shuffled,correct) 

Répondre

1

Vous avez besoin soit d'utiliser une boucle d'événement (for event in pygame.event.get():) ou appelez pygame.event.pump() chaque image, sinon le système d'exploitation pense que le programme est verrouillé. Je recommande de restructurer la fonction Loop de cette façon:

def Loop(block_width,shuffled,correct): 
    clock = pygame.time.Clock() # A clock to limit the frame rate. 
    FPS=10 
    while True: 
     for event in pygame.event.get(): 
      # Quit if the user closes the window. 
      if event.type == pygame.QUIT: 
       return 

     # Fill the background with a color each frame. 
     gamedisplay.fill((30, 30, 30)) 
     # If not sorted, keep sorting. 
     if shuffled != correct: 
      shuffled = inserting(shuffled) 
      bar(block_width,shuffled) 
      pygame.display.update() 

     clock.tick(FPS) 

Loop(block_width,shuffled,correct) 
pygame.quit() 
+0

[PEP 8] (https://www.python.org/dev/peps/pep-0008/#naming-conventions) recommande d'utiliser les noms snake_case (minuscule avec des underscores) pour les variables et les fonctions, par exemple 'def loop():'. Upper camelcase est pour les classes. – skrx

+0

juste une question ,, quel est sys? –

+0

Vous n'avez pas besoin de 'sys.exit()' ici (je l'ai supprimé), puisque le jeu se fermera normalement comme tout autre programme lorsque la fonction reviendra et que le programme atteindra la fin du fichier. L'appel 'pygame.quit()' n'est nécessaire que si vous utilisez l'IDLE IDE, car il ne peut pas fermer la fenêtre. – skrx