2017-07-02 4 views
0

このプログラムは数秒間実行した後も何とかクラッシュし続けます。誰か助けてくれますか? ソートアルゴリズムを視覚化するためのプログラムです。私が間違っていることをたくさんしているのですが、私はちょうどpygameを使い始めました。すごく残念です。 ご協力いただきありがとうございます!pygameはしばらくの間実行された後もクラッシュし続けます

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) 

答えて

1

あなたはどちらかそれ以外の場合は、オペレーティング・システムは、プログラムがロックアップしていると考えて、イベントループ(for event in pygame.event.get():)を使用するか、またはpygame.event.pump()各フレームを呼び出す必要があります。私は、このようにLoop機能を再構築することをお勧めします:

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)はsnake_case名を使用することをお勧めします変数や関数の場合は下線付きの小文字(例: 'def loop():'です。上のラクセルはクラス用です。 – skrx

+0

ちょうど1つの質問,, sysとは何ですか? –

+0

ここで 'sys.exit()'は実際には必要ありません(私はそれを削除しました)。なぜなら、関数は関数が返ってプログラムがファイルの最後に到達すると、他のプログラムとして正常に終了するからです。 'pygame.quit()'コールは、ウィンドウを閉じることができないため、IDLE IDEを使用する場合にのみ必要です。 – skrx

関連する問題