Seite 1 von 1

Denke ich zu kompliziert ? Elemente aus directory löschen

Verfasst: Dienstag 29. April 2008, 22:09
von HorstJENS
Liebe Python-Gurus, ich habe ein Problem gelöst, ahne aber das meine Lösung nicht elegant ist. Kann mir jemand weiterhelfen, ich glaube ich denke zu kompliziert.

Habe ein kleines Spiel geschrieben welches Kreise zeichnet, die immer größer werden bis sie schließlich verschwinden.

Hier die Klasse der Kreise:

Code: Alles auswählen


kreisnummer = 1
kreise={}

class Kreis():
	def __init__(self,x ,y, kreisnummer):
		self.mittelpunkt = (x,y)
		self.kreisnummer = kreisnummer
		self.age = 1
		self.color = (255,0,0) #red (r,g,b)
		self.maxage = 50
		
	def check(self):
		self.age += 1
		if self.age >= self.maxage:
			return self.kreisnummer
		else:
			return None

neue Kreise entstehen nach Mausklick, und die Kreise werden in einem Directory verwaltet:

Code: Alles auswählen

while True:
    for event in pygame.event.get():
        if event.type == MOUSEBUTTONDOWN:
        	print event.pos
        	kreisnummer += 1
        	kreise[kreisnummer] = Kreis(event.pos[0], event.pos[1], kreisnummer)
Im Mainloop wird geschaut, welcher Kreis "zu alt" ist, dessen Kreisnummer wird in eine Liste geschrieben.

Anschließend wird über diese Liste iteriert und alle "zu alten" Kreise im Directory werden gelöscht. Die verbliebenen Kreise werden gezeichnet:

Code: Alles auswählen

 killnummern = []
    for einKreis in kreise:
    	if kreise[einKreis].check() != None:
    		killnummern.append(kreise[einKreis].check())
    
    for nummer in killnummern:
    	kreise.pop(nummer)
    	
    for einKreis in kreise:
    	pygame.draw.circle(screen, kreise[einKreis].color, kreise[einKreis].mittelpunkt, kreise[einKreis].age, 1)
    	
Alles funktioniert zwar, aber geht das auch eleganter ?
mfg,
-Horst

Verfasst: Dienstag 29. April 2008, 22:42
von Y0Gi
Ohne mich da jetzt sonderlich tief hinein zu denken: Kennst du das `heap`-Modul? Damit lässt sich eine Liste so modifizieren, dass etwa der Zugriff auf das erste Element auch immer das Kleinste liefert (dabei spielt eine Rolle, wonach sortiert wird). Möglicherweise bringt dich das weiter. Alternativ vielleicht eine `Queue`?

Verfasst: Mittwoch 30. April 2008, 07:10
von BlackJack
Also ich finde es auf jeden Fall zu kompliziert. Warum ein Dictionary? Ich würde die Kreise in einer Liste speichern und die Kreisnummer weglassen, wenn die nirgends wirklich gebraucht wird. Ausserdem ist es einfacher eine neue Liste auf zu bauen anstatt eine mit zu entfernenden Kreisen und die dann zu `pop()`\en. Das ist auch von der Laufzeit her nicht so toll.

Und entscheide Dich mal für Englisch oder Deutsch. :-)

Ungetestet:

Code: Alles auswählen

RED = (255, 0, 0)

class Circle(object):
    def __init__(self, position, max_age=50):
        self.center = position
        self.color = RED
        self.age = 1
        self.max_age = max_age
    
    def aging(self):
        self.age += 1
        return self.age <= self.max_age

# ...
    circles = list()
    # ...
    while True:
        for event in pygame.event.get():
            if event.type == MOUSBUTTONDOWN:
                circles.append(Circle(event.pos))
        # ...
        circles = [c for c in circles if c.aging()]
        for circle in circles:
            pygame.draw.circle.screen(circle.color,
                                      circle.center,
                                      circle.age,
                                      1)