2017-04-01 7 views
0

Der Versuch, Flood-Fill-Algorithmus in Pygame als Lernerfahrung zu implementieren. Ich habe einen guten Start, denke ich, und es ist meistens funktional, aber nach einigen Sekunden funktioniert es richtig, es gibt mir einen maximalen Rekursionstiefehler.Flood-Fill-Algorithmus, funktioniert für ein paar Sekunden, aber dann Fehler aus. (pygame)

import pygame, random, math 
from pygame.locals import * 

class GameMain(): 
done = False 
color_bg = Color('white') 

def __init__(self, width=800, height=800): 
    pygame.init() 

    self.width, self.height = width, height 
    self.screen = pygame.display.set_mode((self.width, self.height)) 
    self.clock = pygame.time.Clock() 

def main_loop(self): 
    while not self.done: 
     self.handle_events() 
     self.draw() 
     self.clock.tick(60) 
    pygame.quit() 

def draw(self): 
    self.screen.fill(self.color_bg) 
    pygame.draw.rect(self.screen,Color("grey30"), [100,100,400,300],2) 
    pygame.draw.rect(self.screen,Color("grey30"), [ 300,300,400,300],2) 
    pygame.display.flip() 

def handle_events(self): 
    events = pygame.event.get() 

    # keystates 
    keys = pygame.key.get_pressed() 

    # events 
    for event in events: 
     if event.type == pygame.QUIT: 
      self.done = True 
     if event.type == KEYDOWN: 
      if event.key == K_ESCAPE: 
       self.done = True 
     if event.type == MOUSEBUTTONDOWN: 
      x,y = pygame.mouse.get_pos() 
      coord = [x,y] 
      self.flood_fill(self.screen,coord) 
def flood_fill(self,screen,coord): 

    if screen.get_at((coord[0],coord[1])) == Color("grey30"): 
     return 
    screen.set_at((coord[0],coord[1]),Color("grey30")) 
    pygame.display.flip() 
    self.flood_fill(self.screen, [coord[0] +1, coord[1]]) 
    self.flood_fill(self.screen, [coord[0] -1, coord[1]]) 
    self.flood_fill(self.screen, [coord[0], coord[1]+1]) 
    self.flood_fill(self.screen, [coord[0], coord[1]-1]) 


if __name__ == "__main__": 
game = GameMain() 
game.main_loop() 

Mein Programm läuft für eine oder zwei Sekunden und ändert die Farbe von einigen x, y-Koordinaten, aber dann geht es verrückt und ich einen Rekursionstiefe Fehler. Nicht sicher, warum es für eine Sekunde funktioniert und dann fehlschlägt.

+0

Hier ist ein Link zu einer Flußfüllen Variante, die die Rekursionstiefe flach zu halten, behauptet (ich nur googeln - Ich habe überprüfen Sie es nicht): http://www.adammil.net/blog/v126_A_More_Efficient_Flood_Fill.html Oh, das sieht besser aus: http://steve.hollasch.net/cgindex/polygons/floodfill.html –

Antwort

0

Python ist nicht besonders für Rekursionsoperationen konzipiert oder geneigt. In der CPython-Implementierung ist die Rekursionstiefe auf begrenzt.

Sie können dies über prüfen:

import sys 
print(sys.getrecursionlimit()) 

Folglich können Sie die Grenze überschreiben, indem sys.setrecursionlimit() stattdessen verwenden.

Das ist jedoch nicht besonders die sichere/beste Option.

Sie sollten Ihren Code besser umschreiben, um eine iterative Implementierung zu erhalten.


EDIT:Apologies, wurde mir klar, ich habe nicht darauf, wo Sie den Code aussehen sollte.

Die Rekursion passiert tatsächlich in Ihrer flood_fill() Methode, wie es tatsächlich self.floor_fill() wieder vier (4) Mal aufgerufen wird.


Für weitere Informationen können Sie bis lesen: http://seriously.dontusethiscode.com/2013/04/14/setrecursionlimit.html

Verwandte Themen