Invader zum ersten Mal

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

Invader zum ersten Mal

Beitragvon kaytec » 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

Beitragvon audax » 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

Beitragvon 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: 513
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » 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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » 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

Beitragvon audax » 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: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » 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

Beitragvon Y0Gi » 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: 513
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » 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

Beitragvon sma » 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:

Beitragvon nkoehring » 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 ^^
Benutzeravatar
kaytec
User
Beiträge: 513
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » 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

Beitragvon sma » 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: 513
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Dienstag 20. Mai 2008, 05:17

Hallo !

Einige Aenderungen gemacht !

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

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

Beitragvon kaytec » Freitag 23. Mai 2008, 10:50

Hallo !

Die naechste Version mit "Schutzwand".

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

gruss frank

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder