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.
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 –