2017-07-02 11 views
0

Dieses Programm stürzt immer wieder ab, nachdem es einige Sekunden gelaufen ist. Kann mir jemand helfen? Es ist ein Programm zur Visualisierung von Sortieralgorithmen. Es tut mir leid, wenn ich viele Dinge falsch mache, aber ich habe gerade begonnen, Pygame zu benutzen, und ich bin mir immer noch nicht ganz sicher, wie alles funktioniert. Danke für Ihre Hilfe!pygame stürzt nach einer gewissen Zeit ab

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) 

Antwort

1

Sie müssen entweder eine Ereignisschleife verwenden (for event in pygame.event.get():) oder pygame.event.pump() jeden Rahmen nennen, da sonst das Betriebssystem denkt, hat das Programm gesperrt. Ich empfehle die Loop Funktion auf diese Weise neu zu strukturieren:

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) empfiehlt snake_case Namen zu verwenden (Kleinbuchstaben mit Unterstrichen) für Variablen und Funktionen, z 'def Schleife():'. Oberes Camelcase ist für Klassen. – skrx

+0

nur eine Frage ,, was ist sys? –

+0

Sie brauchen hier eigentlich 'sys.exit()' nicht (ich habe es entfernt), da das Spiel normalerweise wie jedes andere Programm beendet wird, wenn die Funktion zurückkehrt und das Programm das Ende der Datei erreicht. Der Aufruf 'pygame.quit()' wird nur benötigt, wenn Sie die IDLE-IDE verwenden, da das Fenster nicht geschlossen werden kann. – skrx

Verwandte Themen