Denke ich zu kompliziert ? Elemente aus directory löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
HorstJENS
User
Beiträge: 123
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

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
http://spielend-programmieren.at
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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`?
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)
Antworten