Invader zum ersten Mal

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

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

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

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

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

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

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

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

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

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

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:

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

@ 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

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

Hallo !

Einige Aenderungen gemacht !

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

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

Hallo !

Die naechste Version mit "Schutzwand".

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

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

Versuch mal, die Magic-Numbers aus dem Programm zu bekommen.

Beispiel:

Code: Alles auswählen

self.walls.append([pos_wall + 5 * pos_brick, self.HEIGHT - 65,
    		    pos_wall + 5 * pos_brick + 5, self.HEIGHT - 60, 0, 
Was soll dort die 5? Und was die 65?
Ab damit in eine selbst erklärende Konstante!

btw:

Code: Alles auswählen

self.cannon = [(self.WIDTH/2 + x, self.HEIGHT - y) for x, y in [
            - 10, 15, 
              10, 15, 
              10, 20,
              8,  20,
              4,  25, 
              1,  25, 
              1,  27, 
            - 1,  27, 
            - 1,  25,
            - 4,  25,                
            - 9,  20, 
            - 10, 20]]
Und dort noch die Magic Numbers raus ;)
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo audax !

Den Gedanken die Breite u. Hoehe der "Steine" an Konstanten zu binden hatte ich auch, doch die wichtigsten Konstanten sind Hoehe und Breite des Spielfeldes - oder?

gruss frank
Mr. Kanister
User
Beiträge: 11
Registriert: Montag 16. Juni 2008, 16:45
Wohnort: Bedburg

Wie sieht das aus mit einer Highscore oder zumindest einer Punkteanzeige?

Sonst hat man ja gar keinen Ansporn ;)

Gruß Martin
LINUX - May the source be with you!
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo Mr. Kanister !

Bin gerade an Tetris - doch ist irgendwie nicht so einfach. Danach mache ich an Invaders weiter - kannst aber auch gerne du machen.

gruß frank
Antworten