Seite 1 von 1
Buchbeispiel geht nicht
Verfasst: Donnerstag 9. Mai 2013, 23:20
von Tengel
http://pastebin.com/EV9nXtn6
Code: Alles auswählen
Traceback (most recent call last):
File "D:/Phyton/Hallo Welt/Ski/skispiel.py", line 125, in <module>
if getroffen[0].typ == "baum" and not getroffen[0].vorbei:
IndexError: list index out of range
Ich seh bei meinem Code keinen Unterschied zum Buch ..aber es will einfach nicht

Re: Buchbeispiel geht nicht
Verfasst: Freitag 10. Mai 2013, 00:02
von BlackJack
@Tengel: Wenn das so im Buch steht, dann ist es offensichtlich fehlerhaft. Laut Fehlermeldung gibt es keinen Index 0 bei `getroffen`. Das kann nur passieren wenn `getroffen` *nichts* enthält. Also schau mal wie `getroffen` zustande kommt. Eine Zeile darüber durch die `pygame.sprite.spritecollide()`-Funktion. Die liefert eine leere Liste wenn die Skier mit *keinem* der Hindernisse kollidieren. Was eine Situation ist, mit der man rechnen muss, denn das ist ja gerade das Ziel des Spielers, nirgends gegen zu fahren. Also müsste der Code danach, damit rechnen und prüfen ob überhaupt eine Kollision stattgefunden hat, bevor das Objekt untersucht wird, mit dem die Skier kollidiert sind.
Zwei Zeilen später hast Du übrigens `image` falsch geschrieben. Mit einem Accent anstelle des i-Punkts. Du hast da noch ein paar andere falsch geschriebene Namen. Was für einen Editor verwendest Du denn? Eigentlich sollte so etwas nicht passieren, oder zumindest sollten alle Vorkommen eines Namens gleich falsch geschrieben sein, wegen der Autovervollständigung.
Der Quelltext ist qualitativ nicht wirklich gut, mit den globalen Werten und dem ganzen Code auf Modulebene. Das in den Klassenname das Wort Klasse vorkommt, ist auch nicht gut. Es gibt sehr schlechte Namen wie `t_ptr`. Verschiedene Namenskonventionen vermischt. Unbenutze lokale Variablen. Viele „magische” Zahlen.
Die Logik mit den beiden Karten ist nicht einfach über zwei Objekte gelöst, welche die Plätze tauschen, sondern umständlich über eine zusätzliche Variable `aktive_karte` die entweder 0 oder 1 ist und sagt welches die aktive Karte ist.
Edit: Noch ein Fehler im Programm: `animiere()` kann unter Umständen aufgerufen werden, bevor das darin benötigte `punktzahl_text` definiert wurde. Wenn man das nicht einfach über einen Modulglobalen zugriff machen würde, wäre der Fehler leichter zu entdecken.
Re: Buchbeispiel geht nicht
Verfasst: Freitag 10. Mai 2013, 02:27
von Tengel
Ich verwende IDLE(Phyton GUI) mit Version 3.3 - das war beim Galileo Buch dabei.
Mehreres falsch geschrieben -hm das sind dann "Fingerfehler" - passiert mir öfter wen ich auf Arbeit was schreibe - muss mich erst an Laptoptastatur gewöhnen.
Naja - das der Code nicht sonderlich schön ist - ist wohl ein ständig wiederkehrendes und leidiges Thema bei Büchern.
Aber immerhin wurde schon an mehreren Stellen auf die allg. Konvention hingewiesen.
Der Code wird auch nur mit der Info - "Abtippen und ausprobieren" gebracht - wohl um zu zeigen was so möglich ist oder um die Leser bei Laune zu halten, ka.
Klassen etc. wurden eig. noch gar nicht behandelt.
Re: Buchbeispiel geht nicht
Verfasst: Freitag 10. Mai 2013, 08:46
von BlackJack
@Tengel: Wenn der Editor keine Autovervollständigung für die Worte aus der aktuellen Datei bietet, dann würde ich einen anderen verwenden.
Und noch ein Fehler: In der `erstelle_karte()` ist ein Fehler der dafür sorgt, dass nur Fahnen und keine Bäume als Hindernisse erstellt werden.
Das ständige Neuladen von immer den selben Bildern ist sowohl von der Laufzeit, als auch vom Speicherverbrauch ineffizient.
Im Hinderniss werden `bild_name` und `ort` unnötigerweise an das Objekt gebunden. `bild_name` wird nie verwendet und `ort` ist redundant, weil die Information schon in `self.rect` gespeichert wird. In der Hauptschleife wird zwar auf das `ort`-Attribut zugegriffen, an der Stelle kann und sollte man dafür aber die `scrolle()`-Methode verwenden.
Der von `Group` und `Sprite` vorgegebene Mechanismus zum Zeichnen wird nur von der Hindernis-Spritegruppe verwendet, und der zum Aktualisieren wird überhaupt nicht verwendet. Ausserdem könnte man effizienter neuzeichnen, also zum Beispiel die `Group.clear()`-Methode verwenden, statt immer den ganzen Bildschirm zu füllen.
Bei Fahnenkollision wird unnötigerweise auf das `vorbei`-Attribut getestet, was bei Fahnen nie verändert wird.
Re: Buchbeispiel geht nicht
Verfasst: Freitag 10. Mai 2013, 15:30
von Tengel
Echt ätzend.... wie man es schon "falsch" beigebracht bekommt ...und da man es ja nicht besser weiß -.-"
Naja - ich hab ja mal gefragt was so genutzt wird - aber Texteditor ist mir dann doch zu Hardcore - ist Autovervollständigung für Anfänger nicht schlecht?
Re: Buchbeispiel geht nicht
Verfasst: Samstag 11. Mai 2013, 12:09
von Hyperion
Tengel hat geschrieben:Echt ätzend.... wie man es schon "falsch" beigebracht bekommt ...und da man es ja nicht besser weiß -.-"
Ich bin mir irgend wie sicher, dass auch Du schon mal die Warnungen hier im Forum vor Galileo-Büchern zum Thema Python gelesen oder sogar direkt als Warnung serviert bekommen hast
Was kann man da noch sagen? Selbt schuld!

Re: Buchbeispiel geht nicht
Verfasst: Samstag 11. Mai 2013, 13:31
von BlackJack
@Tengel: Was meinst Du mit Texteditor ist Dir zu Hardcore? Als „schlechte” Autovervollständigung für Anfänger (und auch Fortgeschrittene) bezeichnet man normalerweise solche die den Code analysiert und die Attribute von Objekten vorschlägt, weil man sich dann nicht mehr so gut die Codestruktur merkt und sich auf die Autovervollständigung verlässt. Aber so etwas wie eine Autovervollständigung die einfach nur bereits geschriebene Worte aus den gerade bearbeiteten Dateien anbietet, hilft einfach nur Namen die man bereits geschrieben hat, beim nächsten mal nicht falsch zu schreiben. Es nimmt ein wenig die Angst vor längeren, aber aussagekräftigen Namen, weil ein `StrassenAmpel` nicht deutlich mehr Schreibarbeit macht als `StrAmp`.
Re: Buchbeispiel geht nicht
Verfasst: Samstag 11. Mai 2013, 15:57
von Tengel
Das man im Texteditor keine farbigen Schlüsselwörter etc. hat?
Re: Buchbeispiel geht nicht
Verfasst: Samstag 11. Mai 2013, 16:31
von BlackJack
@Tengel: Ich glaube Du hast falsche Vorstellungen davon was ein Texteditor ist. Mir fällt jetzt auf Anhieb ausser notepad.exe keiner ein der *kein* Syntaxhighlighting beherrscht.
Re: Buchbeispiel geht nicht
Verfasst: Samstag 11. Mai 2013, 18:52
von Tengel
Achsooooooooo :>
Ich dachte ihr meint mit Texteditor den Windows-> Zubehör 0/8/15 Standardeditor.
Das diese dev c++ etc auch "Texteditor" sind.....hätte mir eigentlich gleich einfallen können ... -.-"
Und was nutzt ihr da so?
Re: Buchbeispiel geht nicht
Verfasst: Samstag 11. Mai 2013, 19:09
von BlackJack
@Tengel: Dev C++ ist eine IDE (Integrated Developement Environment), also etwas mehr als ein Texteditor auf der einen Seite, auf der anderen Seite aber auch ein bisschen weniger, weil hauptsächlich auf C++ zugeschnitten.
Wie gesagt, Editoren gibt's wie Sand am Meer. Neben den Klassikern Emacs und Vim noch eine ganze Menge anderer. Jeder hat da so seine(n) Lieblingseditor und ich denke jeder Programmierer hat in seinem Leben mehr als einen ausprobiert.
Re: Buchbeispiel geht nicht
Verfasst: Samstag 11. Mai 2013, 21:32
von Tengel
Verstehe - ich werde also mal googeln und ein paar anschauen :>
Re: Buchbeispiel geht nicht
Verfasst: Montag 13. Mai 2013, 21:39
von bwbg
OT: DevC++ ist IIRC völlig veraltet und man sollte eher Codeblocks oder VC++ einsetzen.
Mein Texteditor der Wahl ist Notepad++. Wobei ich recht rudimentäre Anforderungen an einen Editor habe: Syntax-Hervorhebung, Wahl des Encodings, des Zeilenendes und eine einfache automatische Einrückung.
Vim/Emacs sind mir dann doch etwas zu "Hardcore" ...
Grüße ... bwbg
Re: Buchbeispiel geht nicht
Verfasst: Montag 13. Mai 2013, 22:27
von Hyperion
bwbg hat geschrieben:OT: DevC++ ist IIRC völlig veraltet und man sollte eher Codeblocks oder VC++ einsetzen.
Visual Studio!?! Ab welcher Version kann man denn da von einer IDE (in Sachen C++!) sprechen? In der 2008er ist das eher ein Witz als etwas ernst zu nehmendes...
Wir haben heute die 2012er auf Arbeit installiert - auch wenn ich das primär mit C# einsetze, werd ich mir die C++ Unterstützung auch dabei angucken.