Invader zum ersten Mal

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Donnerstag 15. Mai 2008, 21:45

Hallo !

Naechster Versuch mit einem actiongeladenen Spaceshooter - nichts fuer schwache Nerven.

http://paste.pocoo.org/show/50713/

gruss frank
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Donnerstag 15. Mai 2008, 23:41

Code: Alles auswählen

def move_cannon(self, event):
    if event.keysym_num == 65363 :
        self.invader.set_cannon_move_direction(5)
    elif event.keysym_num == 65361:
        self.invader.set_cannon_move_direction(-5)
    elif event.keysym_num == 65364 :
        self.invader.set_cannon_move_direction(0)
    elif event.keysym_num == 32:
        self.invader.set_cannon_fire()

# würde ich lieber so schreiben: 

def move_cannon(self, event):
    try:
        {
            65363 : lambda: self.invader.set_cannon_move_direction(5),
            65361 : lambda: self.invader.set_cannon_move_direction(-5),
            65364 : lambda: self.invader.set_cannon_move_direction(0),
            32 : self.invader.set_cannon_fire
        }[event.keysym_num].__call__()
    except KeyError:
        pass
Evtl. schlägts auf die Performance, dass das dict jedesmal neu erstellt wird, dann müsste man das eben als Klassenattribut definieren.
Sollte aber eigentlich nicht ernsthaft ins Gewicht fallen ;)

Code: Alles auswählen

	for invader in self.invaders:
	    if invader[0] < 0:
		invader[4] = invader[4] * - 1
		invader[1] += 10
	    elif invader[0] > self.WIDTH - 15:
		invader[4] = invader[4] * - 1
		invader[1] += 10
	    elif invader[1] > self.HEIGHT - 30:
		self.player_alive = False
	    invader[0] += invader[4]
Die sollte neu geschrieben werden :D
Erstmal könntest du `invader` entpacken:

Code: Alles auswählen

a,b,c,d = invader
Wobei es dem Leser überlassen ist, ordentlich Namen zu finden ;)
Außerdem wären so insgesamt im Quellcode Kommentare nicht fehl am Platz.
BlackJack

Freitag 16. Mai 2008, 08:57

Wie schon beim "Snake" möchte ich noch mal anmerken, dass ich nicht weiss, ob die `keysym_num`-Werte plattformunabhängig sind, oder gar von Tk-Version zu Tk-Version unterschiedlich sein können. Wenn es dafür nicht irgend wo symbolische Konstanten gibt, würde ich dass eher mit dem Binden von einzelnen Tasten-Events an Callbacks lösen.
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Freitag 16. Mai 2008, 09:03

Hallo BlackJack !

Das mit den keysym_num - Werten habe ich aus einem Buch und dort war es fuer WinXP. Meine Freundin hat Vista und ich Ubuntu - Werde es noch aendern, denn mit dem "Dauerfeuer" kommt nicht so Spielspass auf - falls man davon ueberhaupt reden kann.

gruss frank
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 16. Mai 2008, 09:53

Code: Alles auswählen

65363 : lambda: self.invader.set_cannon_move_direction(5)
kannst du auch als

Code: Alles auswählen

from functools import partial
65363 : partial(self.invader.set_cannon_move_direction, 5)
schreiben.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Freitag 16. Mai 2008, 12:44

Ich wollt ihn nicht gleich überfordern ;)
Partial ist ja nun auch nur ein wenig Zucker...
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 16. Mai 2008, 13:04

audax hat geschrieben:Partial ist ja nun auch nur ein wenig Zucker...
Lambda auch ;-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Freitag 16. Mai 2008, 13:50

Die Diskussion "lambda vs. partial" erinnert mich *ganz* stark an "lambda vs. operator.itemgetter/attrgetter" ... Hätte Guido doch mal lambda gekickt, dann würde sich das erübrigen ;)
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Samstag 17. Mai 2008, 07:25

Danke an alle Antworter !

Jetzt kann ich meinen Code noch zuckern, doch wie viel Zucker ist noetig ? Eine Kopie der Werte von "invader" zu erstellen wuerde die Lesbarkeit erhoehen, nur am Ende des Zugriffes muesste ich sie wieder uebergeben "invader = a, b, c, d" ? Konnte nicht so ganz beurteilen, ob es irgendwie die Performance beintraechtigt oder die Werte ueber den Index zu veraendern besser ist. Auf die Dokumentation wurde ich schon oefters hingewiesen, doch man sollte nur wichtige bzw. komplexe Sachverhalte dokumentieren ?! Da ich ja ein "Nonprofi" bin, ist fuer mich dies schwer zu beurteilen.

gruss frank
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Samstag 17. Mai 2008, 12:24

kaytec hat geschrieben:Eine Kopie der Werte von "invader" zu erstellen wuerde die Lesbarkeit erhoehen, nur am Ende des Zugriffes muesste ich sie wieder uebergeben "invader = a, b, c, d" ?
Wieso benutzt du kein Exemplar einer Klasse statt deines 4-elementigen Arrays. Gleiches gilt auch für die Schüsse. Mann kann auch Programm schreiben, die aus mehr als zwei Klassen bestehen :)

Stefan
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Samstag 17. Mai 2008, 18:27

Das Treffen der UFOs ist garnicht so einfach... ich glaube da solltest du ein wenig mehr Toleranz einbauen, so dass man ein UFO nicht gefuehlte 1000x treffen muss, bevor es wirklich weg ist ^^
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Sonntag 18. Mai 2008, 18:18

@ sma - Das es mehr als zwei Klassen geben darf ist mir auch schon aufgefallen. Wuerde ich den speziellen Nutzen bei meinem Programm wissen, dann wuerde ich es auch einbauen.Was ist ein Exemplar einer Klasse ?

@ nkoehring - Krieg ist Krieg :D Da die Bewegung immer in 5er - Schritten geht, kann man es nur an drei Stellen treffen - Das Problem ist mir auch schon aufgefallen, doch werden die Schritte kleiner, dann muss "after" schneller wiederholt werden. Das geht auf die Performance.

gruss frank
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 18. Mai 2008, 18:37

Die Variable `Foo` enthält ein Klasse, die man daher "Foo" nennt:

Code: Alles auswählen

class Foo:
 pass
Die Variable `foo` enthält ein Exemplar der Klasse "Foo":

Code: Alles auswählen

foo = Foo()
Stefan
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Dienstag 20. Mai 2008, 05:17

Hallo !

Einige Aenderungen gemacht !

http://paste.pocoo.org/show/51608/

gruss frank
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Freitag 23. Mai 2008, 10:50

Hallo !

Die naechste Version mit "Schutzwand".

http://paste.pocoo.org/show/53065/

gruss frank
Antworten