Seite 1 von 1

Invader zum ersten Mal

Verfasst: Donnerstag 15. Mai 2008, 21:45
von kaytec
Hallo !

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

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

gruss frank

Verfasst: Donnerstag 15. Mai 2008, 23:41
von audax

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.

Verfasst: Freitag 16. Mai 2008, 08:57
von 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.

Verfasst: Freitag 16. Mai 2008, 09:03
von kaytec
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

Verfasst: Freitag 16. Mai 2008, 09:53
von EyDu

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.

Verfasst: Freitag 16. Mai 2008, 12:44
von audax
Ich wollt ihn nicht gleich überfordern ;)
Partial ist ja nun auch nur ein wenig Zucker...

Verfasst: Freitag 16. Mai 2008, 13:04
von EyDu
audax hat geschrieben:Partial ist ja nun auch nur ein wenig Zucker...
Lambda auch ;-)

Verfasst: Freitag 16. Mai 2008, 13:50
von Y0Gi
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 ;)

Verfasst: Samstag 17. Mai 2008, 07:25
von kaytec
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

Verfasst: Samstag 17. Mai 2008, 12:24
von sma
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

Verfasst: Samstag 17. Mai 2008, 18:27
von nkoehring
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 ^^

Verfasst: Sonntag 18. Mai 2008, 18:18
von kaytec
@ 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

Verfasst: Sonntag 18. Mai 2008, 18:37
von sma
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

Verfasst: Dienstag 20. Mai 2008, 05:17
von kaytec
Hallo !

Einige Aenderungen gemacht !

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

gruss frank

Verfasst: Freitag 23. Mai 2008, 10:50
von kaytec
Hallo !

Die naechste Version mit "Schutzwand".

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

gruss frank

Verfasst: Freitag 23. Mai 2008, 18:14
von audax
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 ;)

Verfasst: Samstag 24. Mai 2008, 14:37
von kaytec
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

Verfasst: Mittwoch 18. Juni 2008, 18:56
von Mr. Kanister
Wie sieht das aus mit einer Highscore oder zumindest einer Punkteanzeige?

Sonst hat man ja gar keinen Ansporn ;)

Gruß Martin

Verfasst: Donnerstag 19. Juni 2008, 10:29
von kaytec
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