Seite 1 von 3
Re: Pacman mit Tkinter
Verfasst: Sonntag 23. Mai 2010, 21:03
von Hyperion
Wirklich? Ich finde das ist noch jede Menge Potenzial zur Verbesserung drin
- Wieso werden die Levels vor den imports definiert?
- Wieso sind zwischen den imports Leerzeilen?
- Sicher, dass die Einrückungen überall stimmen? (Zeile 159ff.)
- Wieso wird da ein Attribut "event" bei set_player_position definiert - wo es dann ja nicht verwendet wird!
- Wieso kann man die Levels noch nicht aus einer Datei laden?
- Wieso werden so viele Magic Numbers in der PacMan Klasse definiert; anstatt sie im jeweiligen Level zu definieren?
- Und fast am wichtigsten: Wieso gibt es keine Doku? So steigst Du da doch auch kaum mehr durch... Python hat ja ein Glück mit den Docstrings sogar Syntax und Semantik für Dokumentation direkt im Code.
Also imho noch viel zu tun

Re: Pacman mit Tkinter
Verfasst: Sonntag 23. Mai 2010, 21:46
von kaytec
Danke Hyperion !
1. Wusste nicht wo definieren.
2. Wusste nicht, dass da keine hingehören.
3. Manche waren auf 80 - ist geändert.
4. Meinst Du den event bei start_game ? Den event brauche ich nicht, doch übergebe ich ihn
nicht, dann meckert Python.
5. Ist das aus der Datei laden so wichtig ?
6. Ja - Magic Numbers kommen noch in die Levels.
7. Für mich ist die Dokumentation nicht so wichtig - für andere Leser schon. Ich mache die
ganze Sache nur so zum Spass und dokumentieren ist nicht so spaßig

.
Gruß Frank
Re: Pacman mit Tkinter
Verfasst: Sonntag 23. Mai 2010, 23:08
von BlackJack
@kaytec: Dokumentation ist für andere Leser? Dann schau Dir das Programm nach 'nem halben Jahr noch einmal an, und Du wirst feststellen, dass *Du* ein anderer Leser bist. Also ist die Dokumentation auch für Dich. Nach einer gewissen Zeit ist man nämlich selbst ein Fremder bei Quelltext den man selber verfasst hat.
Re: Pacman mit Tkinter
Verfasst: Montag 24. Mai 2010, 10:12
von Hyperion
kaytec hat geschrieben:
4. Meinst Du den event bei start_game ? Den event brauche ich nicht, doch übergebe ich ihn nicht, dann meckert Python.
Hm.... klingt für mich komisch! Was heißt denn "meckern"?
kaytec hat geschrieben:
5. Ist das aus der Datei laden so wichtig ?
Gegenfrage: Ist es denn so schwierig?

Sieh es mal so: Deine Chance etwas über JSON und Kommandozeilen-Parsing (z.B. OptParse) zu lernen. Natürlich braucht es das nicht, um ein nettes Spiel implementiert zu haben - aber so wird das ganze ja erst interessant, weil man eigene Levels nicht im Quellcode unterbringen muss.
Zur DOku hatte BlackJack ja schon geantwortet

Re: Pacman mit Tkinter
Verfasst: Montag 24. Mai 2010, 13:43
von kaytec
Hallo Hyperion !
Das ist die Fehlermeldung:
Code: Alles auswählen
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
TypeError: set_player_position() takes exactly 3 arguments (4 given)
Der event entsteht durch die Bindung der Tasten an Tk, um die Steuerung zu übergeben.
Spielfelder laden:
Ist natürlich für den Nutzer dieses Spieles eine schöne Sache, doch wer außer mir wird es nutzen ? Da ich jetzt aber Lust habe dies auch zu ermöglichen, werde ich es mal versuchen.
Doku:
Das mit der Dokumentation ist so eine Sache. Die Doku sollte auf Englisch sein ....

Ich würde mehr für die schlechte Dokumentation kritisiert werden, als für meine "Amateurprogrammierkenntnisse". Habe auch nicht den Anspruch ein Profi zu werden, sondern sehe es als anspruchsvolleres "Rätselraten", um den Kopf von meiner eigentlichen Tätigkeit frei zu bekommen. Für euch würde es die Arbeit natürlich sehr erleichtern,denn ihr gebt euch mit mir auch immer viel Mühe - Danke. Nein, ich will keine Diskussion über Englisch losbrechen. Werde ich auch mal angehen. Mir ist es ziemlich egal, ob ich nach einem Monat noch den Verlauf verstehe - verblüfft mich immer wieder was ich mal so zusammengebastelt habe.
Gruß Frank
Re: Pacman mit Tkinter
Verfasst: Montag 24. Mai 2010, 20:59
von jonas
Hi
Zum Level laden würde doch sowas hier reichen:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
LEVELDIR = '/home/jonas/scripts/levels'
class NoLevelDataFoundError(Exception):
pass
#ehemals NoFileError
def get_level_data(fobj):
level = [x.strip() for x in fobj.readlines()]
return level
def load_levels(lvldir):
levels = list()
for root, dirs, files in os.walk(lvldir):
if files:
for file_ in files:
with open(root + os.sep + file_) as fobj:
levels.append(get_level_data(fobj))
else:
raise NoLevelDataFoundError
return levels
print load_levels(LEVELDIR)
Die Leveldateien könnten dann einfach so aussehen:
Code: Alles auswählen
#################
#...............#
#...p.......p...#
#...............#
#...............#
#......#g#......#
#.... #ggg#.....#
#.....#####.....#
#...............#
#...............#
#...............#
#################
Lg, Jonas

EDIT: Exceptionname geändert (s.Code)
Re: Pacman mit Tkinter
Verfasst: Montag 24. Mai 2010, 22:22
von Hyperion
kaytec hat geschrieben:Hallo Hyperion !
Das ist die Fehlermeldung:
Code: Alles auswählen
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
TypeError: set_player_position() takes exactly 3 arguments (4 given)
Ich meine das hier:
Code: Alles auswählen
def set_player_position(self, x, y, event):
self.x, self.y = x, y
Den Aufruf davon kapiere ich nicht wirklich:
Code: Alles auswählen
def move_player(self, button, x, y):
self.root.bind(button, partial(
self.pac_man.set_player_position, x, y))
Wozu das ganze? event wird doch gar nicht benötigt in der PacMan-Klasse - zumindest wird das Objekt durch die set_player_position nicht genutzt... oder sehe ich das falsch?
Falls doch würde ich auch mal behaupten, dass die Trennung von Logik und GUI dann schlecht implementiert wäre.
@jonas: Ob man diese Exception wirklich braucht, sei mal dahingestellt. Aber sollte sie dann nicht eher Bezug zu den Leveldaten aufzeigen? Also eher "NoLevelDataFound" o.ä.
Generell würde ich statt des custom-Formates auf json o.ä. zurückgreifen. Da hat man es dann leichter, andere Werte in eine Datei reinzubringen und ggf. mehr als einen Level in einer Datei mühelos abzulegen.
Re: Pacman mit Tkinter
Verfasst: Montag 24. Mai 2010, 23:13
von kaytec
Hallo Hyperion und jonas !
@ jonas Danke
@Hyperion
Die Fehlermeldung kommt, wenn ich den event in "set_player_position" nicht übergebe, obwohl dieser von der Gui nicht offensichtlich übergeben wird.
Code: Alles auswählen
def set_player_position(self, x, y):
self.x, self.y = x, y
Ohne event kommt die Fehlermeldung:
Code: Alles auswählen
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
TypeError: set_player_position() takes exactly 3 arguments (4 given)
>Exit code: 0
Die zusätzliche Funktion "move_player" ist unnötigt. Hatte bei Snake vor längerer Zeit das Problem, dass ich nicht direkt über eine Schleife beim Initialisieren der Gui die Tasten binden konnte. Wurde in einem älteren Thread (kann ihn leider nicht finden) auch so gelöst. Warum es jetzt geht ?
Waren noch Fehler in der Logik -->
http://paste.pocoo.org/show/217826/
Gruß Frank
Re: Pacman mit Tkinter
Verfasst: Dienstag 25. Mai 2010, 09:56
von jonas
Hi Hyperion!
Ja, der Exceptionname von dir ist besser. Ich werds ändern
Lg, Jonas

Re: Pacman mit Tkinter
Verfasst: Dienstag 25. Mai 2010, 10:16
von BlackJack
@Hyperion: `event` wird nicht verwendet aber von `Tkinter` wird es übergeben, also muss dafür auch ein formales Argument vorhanden sein.
Da wo Du sagst, den Aufruf verstehst Du nicht, wird es ja auch gar nicht aufgerufen sondern ein "callable" aus der Methode erstellt, bei der die Argumente `x` und `y` mittels `partial()` vorbelegt werden, und ein "callable" herauskommt, was nur noch ein Argument, nämlich das Event entgegennimmt. Und das ist nun einmal die Signatur die `Tkinter` für ein Callback bei `bind()` erwartet.
Re: Pacman mit Tkinter
Verfasst: Dienstag 25. Mai 2010, 10:43
von kaytec
Hallo Hyperion !
Das mit dem event hat mich beschäftigt und ich habe mal versucht es aufzuzeigen.
Hier mal ein Versuch mit "lambda", einer zusätzlichen Funktion und ohne event.
http://paste.pocoo.org/show/217945/
Hier mal ein Versuch mit "lambda" ohne eine zusätzlichen Funktion und ohne event.
http://paste.pocoo.org/show/217948/
Hier mal ein Versuch mit partial und mit event.
http://paste.pocoo.org/show/217949/
Hier mal ein Versuch mit partial und ohne event.
http://paste.pocoo.org/show/217951/
Gruß Frank
Re: Pacman mit Tkinter
Verfasst: Dienstag 25. Mai 2010, 13:54
von wuf
Hallo kaytec
Die Variante:
http://paste.pocoo.org/show/217951/
Wirft bei mir folgende Exception:
- Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1403, in __call__
return self.func(*args)
TypeError: set_walker_position() takes exactly 3 arguments (4 given)
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 1403, in __call__
return self.func(*args)
TypeError: set_walker_position() takes exactly 3 arguments (4 given)
Die Exception kann unterbunden werden indem du die Methode:
auf
erweiterst.
Gruß wuf

Re: Pacman mit Tkinter
Verfasst: Dienstag 25. Mai 2010, 14:33
von BlackJack
@wuf: Oder statt ``*args`` eben nur ein zusätzliches Argument `event`. Denn genau das wird da ja übergeben. Womit wir wieder am Ausgangspunkt wären.
Re: Pacman mit Tkinter
Verfasst: Dienstag 25. Mai 2010, 15:02
von kaytec
Hallo wuf !
Ich wollte nur zeigen welche Möglichkeiten es gibt und welche Probleme auftauchen. Mit "lambda" geht es ohne ein "event" zu übergeben, doch nur mit dem "Umweg" über eine zusätzliche Funktion. Bei fehlendem "Umweg" bewegt sich der "walker" nicht.
Bei "partial" geht es ohne den "Umweg" aber halt nur mit dem "event".
Könnte man fast ins Tk-Forum verschieben.
Gruß Frank
Re: Pacman mit Tkinter
Verfasst: Dienstag 25. Mai 2010, 15:20
von Hyperion
Ok, also ich habe jetzt verstanden, dass man dieses event als Parameter vorsehen muss. Nur frage ich mich noch, ob das ein sinnvoller Weg ist? Denn so muss ich doch das eigentlich GUI unabhängige Modell mit der GUI verquicken bzw. es an die GUI anpassen.
Man muss doch auch so einen Tastendruck abfangen und dann die entsprechende (ohne unnützen event-Parameter) Methode der Spiellogik aufrufen können!?!
Re: Pacman mit Tkinter
Verfasst: Dienstag 25. Mai 2010, 15:25
von kaytec
Hallo Hyperion !
In dem ersten Versuch ist es ohne eine Übergabe des "event", doch "lambda" soll man durch "partial" ersetzen - ist mit so gesagt worden.
Gruß Frank
Re: Pacman mit Tkinter
Verfasst: Montag 31. Mai 2010, 00:12
von problembär
HerrHagen hat geschrieben:Weils so gut passt - man schaue sich das mal an (21.05.2010):
http://www.google.de/
Sogar mit Ton.
Ja, und:
http://yuccatree.de/2010/05/google-teures-pacman/

Re: Pacman mit Tkinter
Verfasst: Montag 31. Mai 2010, 14:10
von kaytec
Hallo !
An der Logik gebastelt -->
http://paste.pocoo.org/show/220334/
Gruß Frank
Re: Pacman mit Tkinter
Verfasst: Mittwoch 9. Juni 2010, 18:29
von marl0n
Das Spiel ist dir echt sehr gut gelungen!
Simpel, aber es macht Spaß. Es ist auch nicht zu leicht

Du solltest aber noch ein Blinken beim Übergang vom grauen zum farbigen der Gegner hinzufügen. Das kommt sonst sehr plötzlich und schon hat man ein leben verloren. Die Gegner sollten also vielleicht 3-5 mal blinken, bis sie wieder nicht-berührbar sind.
Top spiel!
marlon
Eine möglichkeit, eigene Maps zu öffnen, wäre auch cool. Man legt eine Datei an mit dem namen "mapname.map" und da steht die Map so drin, wie das Programm sie verarbeitet. Im Menü könnte dann ein Punkt "M: Map laden" sein

Re: Pacman mit Tkinter
Verfasst: Sonntag 22. August 2010, 21:25
von arminn
Das Goolge loge habe ich jetzt erst gesehen ist super